File: RecordTests.cpp

package info (click to toggle)
llvm-toolchain-18 1%3A18.1.8-18
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,908,340 kB
  • sloc: cpp: 6,667,937; ansic: 1,440,452; asm: 883,619; python: 230,549; objc: 76,880; f90: 74,238; lisp: 35,989; pascal: 16,571; sh: 10,229; perl: 7,459; ml: 5,047; awk: 3,523; makefile: 2,987; javascript: 2,149; xml: 892; fortran: 649; cs: 573
file content (117 lines) | stat: -rw-r--r-- 4,240 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//===-- RecordTests.cpp - TextAPI Record Type Test-------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===-----------------------------------------------------------------------===//

#include "llvm/TargetParser/Triple.h"
#include "llvm/TextAPI/RecordsSlice.h"
#include "gtest/gtest.h"

using namespace llvm;
using namespace llvm::MachO;

namespace TAPIRecord {

TEST(TAPIRecord, Simple) {
  GlobalRecord API{"_sym", RecordLinkage::Rexported,
                   SymbolFlags::Rexported | SymbolFlags::Text |
                       SymbolFlags::ThreadLocalValue,
                   GlobalRecord::Kind::Function};
  EXPECT_TRUE(API.isExported());
  EXPECT_TRUE(API.isText());
  EXPECT_TRUE(API.isRexported());
  EXPECT_TRUE(API.isFunction());
  EXPECT_TRUE(API.isThreadLocalValue());
  EXPECT_FALSE(API.isInternal());
  EXPECT_FALSE(API.isUndefined());
  EXPECT_FALSE(API.isWeakDefined());
  EXPECT_FALSE(API.isWeakReferenced());
  EXPECT_FALSE(API.isVariable());
}

TEST(TAPIRecord, SimpleObjC) {
  ObjCInterfaceRecord Class{"NSObject", RecordLinkage::Exported};
  ObjCInterfaceRecord ClassEH{"NSObject", RecordLinkage::Exported,
                              /*HasEHType=*/true};

  EXPECT_TRUE(Class.isExported());
  EXPECT_EQ(Class.isExported(), ClassEH.isExported());
  EXPECT_FALSE(Class.hasExceptionAttribute());
  EXPECT_TRUE(ClassEH.hasExceptionAttribute());
  EXPECT_EQ(ObjCIVarRecord::createScopedName("NSObject", "var"),
            "NSObject.var");
}

TEST(TAPIRecord, SimpleSlice) {
  Triple T("arm64-apple-macosx13.3");
  RecordsSlice Slice(T);
  EXPECT_TRUE(Slice.empty());
  Slice.addRecord("_OBJC_CLASS_$_NSObject", SymbolFlags::None,
                  GlobalRecord::Kind::Unknown, RecordLinkage::Rexported);
  Slice.addRecord("_OBJC_METACLASS_$_NSObject", SymbolFlags::None,
                  GlobalRecord::Kind::Unknown, RecordLinkage::Rexported);
  Slice.addRecord("_OBJC_IVAR_$_NSConcreteValue.typeInfo", SymbolFlags::None,
                  GlobalRecord::Kind::Unknown, RecordLinkage::Exported);
  Slice.addRecord("_OBJC_IVAR_$_NSObject.objInfo", SymbolFlags::None,
                  GlobalRecord::Kind::Unknown, RecordLinkage::Exported);
  Slice.addRecord("_foo", SymbolFlags::WeakDefined | SymbolFlags::Rexported,
                  GlobalRecord::Kind::Variable, RecordLinkage::Rexported);
  EXPECT_FALSE(Slice.empty());

  // Check global.
  EXPECT_FALSE(Slice.findGlobal("_foo", GlobalRecord::Kind::Function));
  auto *Global = Slice.findGlobal("_foo");
  ASSERT_TRUE(Global);
  EXPECT_TRUE(Global->isVariable());
  EXPECT_TRUE(Global->isWeakDefined());
  EXPECT_TRUE(Global->isRexported());
  EXPECT_TRUE(Global->isData());

  // Check class.
  auto *Class = Slice.findObjCInterface("NSObject");
  ASSERT_TRUE(Class);
  EXPECT_TRUE(Class->isRexported());
  EXPECT_TRUE(Class->isData());
  EXPECT_FALSE(Class->hasExceptionAttribute());
  auto ClassIVar = Class->findObjCIVar("objInfo");
  ASSERT_TRUE(ClassIVar);
  EXPECT_TRUE(ClassIVar->isExported());
  EXPECT_FALSE(ClassIVar->isRexported());

  // Check fall-back extension.
  auto *Cat = Slice.findObjCCategory("NSConcreteValue", "");
  ASSERT_TRUE(Cat);
  // There is not linkage information for categories.
  EXPECT_FALSE(Cat->isExported());
  EXPECT_FALSE(Cat->isInternal());
  auto CatIVar = Cat->findObjCIVar("typeInfo");
  EXPECT_TRUE(CatIVar);
  EXPECT_TRUE(CatIVar->isExported());
  EXPECT_FALSE(CatIVar->isRexported());

  // Find IVars directly.
  auto TIIVar =
      Slice.findObjCIVar(/*IsScopedName=*/true, "NSConcreteValue.typeInfo");
  ASSERT_TRUE(TIIVar);
  EXPECT_EQ(CatIVar->getName(), TIIVar->getName());

  auto OIIVar = Slice.findObjCIVar(/*IsScopedName=*/false, "objInfo");
  ASSERT_TRUE(OIIVar);
  EXPECT_EQ(ClassIVar->getName(), OIIVar->getName());

  EXPECT_FALSE(Slice.findObjCIVar(/*IsScopedName=*/true, "typeInfo"));
}

TEST(TAPIRecord, LibraryAttrs) {
  Triple T("arm64-apple-ios15.1");
  RecordsSlice Slice(T);
  EXPECT_TRUE(Slice.empty());

  auto BA = Slice.getBinaryAttrs();
  EXPECT_TRUE(Slice.hasBinaryAttrs());
}

} // namespace TAPIRecord