1b04b8975SCyndy Ishida //===-- RecordTests.cpp - TextAPI Record Type Test-------------------------===//
2b04b8975SCyndy Ishida //
3b04b8975SCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b04b8975SCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
5b04b8975SCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b04b8975SCyndy Ishida //
7b04b8975SCyndy Ishida //===-----------------------------------------------------------------------===//
8b04b8975SCyndy Ishida
9b04b8975SCyndy Ishida #include "llvm/TargetParser/Triple.h"
10b04b8975SCyndy Ishida #include "llvm/TextAPI/RecordsSlice.h"
11b04b8975SCyndy Ishida #include "gtest/gtest.h"
12b04b8975SCyndy Ishida
13b04b8975SCyndy Ishida using namespace llvm;
14b04b8975SCyndy Ishida using namespace llvm::MachO;
15b04b8975SCyndy Ishida
16b04b8975SCyndy Ishida namespace TAPIRecord {
17b04b8975SCyndy Ishida
TEST(TAPIRecord,Simple)18b04b8975SCyndy Ishida TEST(TAPIRecord, Simple) {
19b04b8975SCyndy Ishida GlobalRecord API{"_sym", RecordLinkage::Rexported,
20b04b8975SCyndy Ishida SymbolFlags::Rexported | SymbolFlags::Text |
21b04b8975SCyndy Ishida SymbolFlags::ThreadLocalValue,
22*50ae8a2aSCyndy Ishida GlobalRecord::Kind::Function, /*Inlined=*/false};
23b04b8975SCyndy Ishida EXPECT_TRUE(API.isExported());
24b04b8975SCyndy Ishida EXPECT_TRUE(API.isText());
25b04b8975SCyndy Ishida EXPECT_TRUE(API.isRexported());
26b04b8975SCyndy Ishida EXPECT_TRUE(API.isFunction());
27b04b8975SCyndy Ishida EXPECT_TRUE(API.isThreadLocalValue());
28b04b8975SCyndy Ishida EXPECT_FALSE(API.isInternal());
29b04b8975SCyndy Ishida EXPECT_FALSE(API.isUndefined());
30b04b8975SCyndy Ishida EXPECT_FALSE(API.isWeakDefined());
31b04b8975SCyndy Ishida EXPECT_FALSE(API.isWeakReferenced());
32b04b8975SCyndy Ishida EXPECT_FALSE(API.isVariable());
33*50ae8a2aSCyndy Ishida EXPECT_FALSE(API.isInlined());
34b04b8975SCyndy Ishida }
35b04b8975SCyndy Ishida
TEST(TAPIRecord,SimpleObjC)36b04b8975SCyndy Ishida TEST(TAPIRecord, SimpleObjC) {
374460fa88SCyndy Ishida const ObjCIFSymbolKind CompleteInterface =
384460fa88SCyndy Ishida ObjCIFSymbolKind::Class | ObjCIFSymbolKind::MetaClass;
394460fa88SCyndy Ishida ObjCInterfaceRecord Class{"NSObject", RecordLinkage::Exported,
404460fa88SCyndy Ishida CompleteInterface};
41b04b8975SCyndy Ishida ObjCInterfaceRecord ClassEH{"NSObject", RecordLinkage::Exported,
424460fa88SCyndy Ishida CompleteInterface | ObjCIFSymbolKind::EHType};
43b04b8975SCyndy Ishida
44b04b8975SCyndy Ishida EXPECT_TRUE(Class.isExported());
45b04b8975SCyndy Ishida EXPECT_EQ(Class.isExported(), ClassEH.isExported());
46b04b8975SCyndy Ishida EXPECT_FALSE(Class.hasExceptionAttribute());
47b04b8975SCyndy Ishida EXPECT_TRUE(ClassEH.hasExceptionAttribute());
48b04b8975SCyndy Ishida EXPECT_EQ(ObjCIVarRecord::createScopedName("NSObject", "var"),
49b04b8975SCyndy Ishida "NSObject.var");
504460fa88SCyndy Ishida EXPECT_TRUE(Class.isCompleteInterface());
514460fa88SCyndy Ishida EXPECT_TRUE(ClassEH.isCompleteInterface());
524460fa88SCyndy Ishida EXPECT_TRUE(Class.isExportedSymbol(ObjCIFSymbolKind::MetaClass));
534460fa88SCyndy Ishida EXPECT_EQ(ClassEH.getLinkageForSymbol(ObjCIFSymbolKind::EHType),
544460fa88SCyndy Ishida RecordLinkage::Exported);
554460fa88SCyndy Ishida }
564460fa88SCyndy Ishida
TEST(TAPIRecord,IncompleteObjC)574460fa88SCyndy Ishida TEST(TAPIRecord, IncompleteObjC) {
584460fa88SCyndy Ishida ObjCInterfaceRecord Class{"NSObject", RecordLinkage::Rexported,
594460fa88SCyndy Ishida ObjCIFSymbolKind::MetaClass};
604460fa88SCyndy Ishida EXPECT_EQ(Class.getLinkageForSymbol(ObjCIFSymbolKind::EHType),
614460fa88SCyndy Ishida RecordLinkage::Unknown);
624460fa88SCyndy Ishida EXPECT_EQ(Class.getLinkageForSymbol(ObjCIFSymbolKind::MetaClass),
634460fa88SCyndy Ishida RecordLinkage::Rexported);
644460fa88SCyndy Ishida EXPECT_TRUE(Class.isExportedSymbol(ObjCIFSymbolKind::MetaClass));
654460fa88SCyndy Ishida EXPECT_FALSE(Class.isCompleteInterface());
664460fa88SCyndy Ishida EXPECT_TRUE(Class.isExported());
674460fa88SCyndy Ishida
684460fa88SCyndy Ishida Class.updateLinkageForSymbols(ObjCIFSymbolKind::Class,
694460fa88SCyndy Ishida RecordLinkage::Internal);
704460fa88SCyndy Ishida EXPECT_TRUE(Class.isExported());
714460fa88SCyndy Ishida EXPECT_FALSE(Class.isCompleteInterface());
724460fa88SCyndy Ishida EXPECT_FALSE(Class.isExportedSymbol(ObjCIFSymbolKind::Class));
734460fa88SCyndy Ishida EXPECT_EQ(Class.getLinkageForSymbol(ObjCIFSymbolKind::Class),
744460fa88SCyndy Ishida RecordLinkage::Internal);
75b04b8975SCyndy Ishida }
76b04b8975SCyndy Ishida
TEST(TAPIRecord,SimpleSlice)77b04b8975SCyndy Ishida TEST(TAPIRecord, SimpleSlice) {
78b04b8975SCyndy Ishida Triple T("arm64-apple-macosx13.3");
79b04b8975SCyndy Ishida RecordsSlice Slice(T);
80ab4d6cd6SCyndy Ishida EXPECT_TRUE(Slice.empty());
81b04b8975SCyndy Ishida Slice.addRecord("_OBJC_CLASS_$_NSObject", SymbolFlags::None,
82b04b8975SCyndy Ishida GlobalRecord::Kind::Unknown, RecordLinkage::Rexported);
83b04b8975SCyndy Ishida Slice.addRecord("_OBJC_METACLASS_$_NSObject", SymbolFlags::None,
84b04b8975SCyndy Ishida GlobalRecord::Kind::Unknown, RecordLinkage::Rexported);
85b04b8975SCyndy Ishida Slice.addRecord("_OBJC_IVAR_$_NSConcreteValue.typeInfo", SymbolFlags::None,
86b04b8975SCyndy Ishida GlobalRecord::Kind::Unknown, RecordLinkage::Exported);
87b04b8975SCyndy Ishida Slice.addRecord("_OBJC_IVAR_$_NSObject.objInfo", SymbolFlags::None,
88b04b8975SCyndy Ishida GlobalRecord::Kind::Unknown, RecordLinkage::Exported);
89b04b8975SCyndy Ishida Slice.addRecord("_foo", SymbolFlags::WeakDefined | SymbolFlags::Rexported,
90b04b8975SCyndy Ishida GlobalRecord::Kind::Variable, RecordLinkage::Rexported);
91ab4d6cd6SCyndy Ishida EXPECT_FALSE(Slice.empty());
92b04b8975SCyndy Ishida
93b04b8975SCyndy Ishida // Check global.
94b04b8975SCyndy Ishida EXPECT_FALSE(Slice.findGlobal("_foo", GlobalRecord::Kind::Function));
95b04b8975SCyndy Ishida auto *Global = Slice.findGlobal("_foo");
96b04b8975SCyndy Ishida ASSERT_TRUE(Global);
97b04b8975SCyndy Ishida EXPECT_TRUE(Global->isVariable());
98b04b8975SCyndy Ishida EXPECT_TRUE(Global->isWeakDefined());
99b04b8975SCyndy Ishida EXPECT_TRUE(Global->isRexported());
100b04b8975SCyndy Ishida EXPECT_TRUE(Global->isData());
101b04b8975SCyndy Ishida
102b04b8975SCyndy Ishida // Check class.
103b04b8975SCyndy Ishida auto *Class = Slice.findObjCInterface("NSObject");
104b04b8975SCyndy Ishida ASSERT_TRUE(Class);
105b04b8975SCyndy Ishida EXPECT_TRUE(Class->isRexported());
106b04b8975SCyndy Ishida EXPECT_TRUE(Class->isData());
107b04b8975SCyndy Ishida EXPECT_FALSE(Class->hasExceptionAttribute());
108b04b8975SCyndy Ishida auto ClassIVar = Class->findObjCIVar("objInfo");
109b04b8975SCyndy Ishida ASSERT_TRUE(ClassIVar);
110b04b8975SCyndy Ishida EXPECT_TRUE(ClassIVar->isExported());
111b04b8975SCyndy Ishida EXPECT_FALSE(ClassIVar->isRexported());
112b04b8975SCyndy Ishida
113b04b8975SCyndy Ishida // Check fall-back extension.
114b04b8975SCyndy Ishida auto *Cat = Slice.findObjCCategory("NSConcreteValue", "");
115b04b8975SCyndy Ishida ASSERT_TRUE(Cat);
116b04b8975SCyndy Ishida // There is not linkage information for categories.
117b04b8975SCyndy Ishida EXPECT_FALSE(Cat->isExported());
118b04b8975SCyndy Ishida EXPECT_FALSE(Cat->isInternal());
119b04b8975SCyndy Ishida auto CatIVar = Cat->findObjCIVar("typeInfo");
120b04b8975SCyndy Ishida EXPECT_TRUE(CatIVar);
121b04b8975SCyndy Ishida EXPECT_TRUE(CatIVar->isExported());
122b04b8975SCyndy Ishida EXPECT_FALSE(CatIVar->isRexported());
123b04b8975SCyndy Ishida
124b04b8975SCyndy Ishida // Find IVars directly.
125b04b8975SCyndy Ishida auto TIIVar =
126b04b8975SCyndy Ishida Slice.findObjCIVar(/*IsScopedName=*/true, "NSConcreteValue.typeInfo");
127b04b8975SCyndy Ishida ASSERT_TRUE(TIIVar);
128b04b8975SCyndy Ishida EXPECT_EQ(CatIVar->getName(), TIIVar->getName());
129b04b8975SCyndy Ishida
130b04b8975SCyndy Ishida auto OIIVar = Slice.findObjCIVar(/*IsScopedName=*/false, "objInfo");
131b04b8975SCyndy Ishida ASSERT_TRUE(OIIVar);
132b04b8975SCyndy Ishida EXPECT_EQ(ClassIVar->getName(), OIIVar->getName());
133b04b8975SCyndy Ishida
134b04b8975SCyndy Ishida EXPECT_FALSE(Slice.findObjCIVar(/*IsScopedName=*/true, "typeInfo"));
135b04b8975SCyndy Ishida }
136b04b8975SCyndy Ishida
TEST(TAPIRecord,LibraryAttrs)137b04b8975SCyndy Ishida TEST(TAPIRecord, LibraryAttrs) {
138b04b8975SCyndy Ishida Triple T("arm64-apple-ios15.1");
139b04b8975SCyndy Ishida RecordsSlice Slice(T);
140ab4d6cd6SCyndy Ishida EXPECT_TRUE(Slice.empty());
141b04b8975SCyndy Ishida
142b04b8975SCyndy Ishida auto BA = Slice.getBinaryAttrs();
143b04b8975SCyndy Ishida EXPECT_TRUE(Slice.hasBinaryAttrs());
144b04b8975SCyndy Ishida }
145b04b8975SCyndy Ishida
146b04b8975SCyndy Ishida } // namespace TAPIRecord
147