26 auto [APIName, SymKind, InterfaceType] =
parseSymbol(Name);
30 return addGlobal(Name, Linkage, GV, Flags);
42 auto [Super, IVar] = Name.split(
'.');
46 if (Container ==
nullptr)
57 StringRef Super = IsIVar ? Name.split(
'.').first : Name;
61 if (Container ==
nullptr)
66template <
typename R,
typename C = RecordMap<R>,
typename K = StringRef>
69 if (
Record == Container.end())
71 return Record->second.get();
101 "expected single ObjCIFSymbolKind enum value");
103 return Linkages.Class;
106 return Linkages.MetaClass;
109 return Linkages.EHType;
117 Linkages.Class = std::max(Link, Linkages.Class);
119 Linkages.MetaClass = std::max(Link, Linkages.MetaClass);
121 Linkages.EHType = std::max(Link, Linkages.EHType);
128 std::max(Linkages.Class, std::max(Linkages.MetaClass, Linkages.EHType));
154 StringRef IVar = Name.substr(Name.find_first_of(
'.') + 1);
155 return Container->findObjCIVar(IVar);
160 for (
const auto &[
_, Container] :
Records) {
161 if (
auto *IVarR = Container->findObjCIVar(Name))
167 if (
auto *IVarRecord = getIVar(Classes))
170 return getIVar(Categories);
182 auto Result = Globals.try_emplace(Name);
184 Result.first->second =
185 std::make_unique<GlobalRecord>(Name, Linkage, Flags, GV, Inlined);
187 updateLinkage(Result.first->second.get(), Linkage);
188 updateFlags(Result.first->second.get(), Flags);
190 return Result.first->second.get();
197 auto Result = Classes.try_emplace(Name);
199 Result.first->second =
200 std::make_unique<ObjCInterfaceRecord>(Name, Linkage, SymType);
202 Result.first->second->updateLinkageForSymbols(SymType, Linkage);
203 return Result.first->second.get();
221 auto Result = Categories.insert({
Name,
Record});
222 return Result.second;
231 auto Result = Categories.try_emplace(std::make_pair(ClassToExtend, Category));
233 Result.first->second =
234 std::make_unique<ObjCCategoryRecord>(ClassToExtend, Category);
238 ObjCClass->addObjCCategory(Result.first->second.get());
240 return Result.first->second.get();
244 std::vector<ObjCIVarRecord *>
Records;
246 for (
const auto &
Record : IVars)
251std::vector<ObjCCategoryRecord *>
253 std::vector<ObjCCategoryRecord *>
Records;
254 Records.reserve(Categories.size());
255 for (
const auto &
Record : Categories)
262 auto Result = IVars.try_emplace(IVar);
264 Result.first->second = std::make_unique<ObjCIVarRecord>(IVar,
Linkage);
265 return Result.first->second.get();
273 updateLinkage(
Record, Linkage);
281 if (StringAllocator.identifyObject(
String.data()))
284 void *
Ptr = StringAllocator.Allocate(
String.size(), 1);
291 BA = std::make_unique<BinaryAttrs>();
296 for (
auto &
G : Globals)
297 V.visitGlobal(*
G.second);
298 for (
auto &
C : Classes)
299 V.visitObjCInterface(*
C.second);
300 for (
auto &Cat : Categories)
301 V.visitObjCCategory(*Cat.second);
304static std::unique_ptr<InterfaceFile>
307 auto Symbols = std::make_unique<SymbolSet>();
308 for (
auto &S : Slices) {
311 auto &BA = S->getBinaryAttrs();
312 if (BA.InstallName != InstallName)
316 !BA.TwoLevelNamespace);
320 auto File = std::make_unique<InterfaceFile>(std::move(Symbols));
321 File->setInstallName(InstallName);
323 for (
auto &S : Slices) {
326 auto &BA = S->getBinaryAttrs();
327 if (BA.InstallName != InstallName)
329 const Target &Targ = S->getTarget();
330 File->addTarget(Targ);
331 File->setFromBinaryAttrs(BA, Targ);
337std::unique_ptr<InterfaceFile>
339 std::unique_ptr<InterfaceFile> File;
344 for (
auto &S : Slices) {
345 auto Name = S->getBinaryAttrs().InstallName;
348 InstallNames.
insert(Name);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::unique_ptr< InterfaceFile > createInterfaceFile(const Records &Slices, StringRef InstallName)
R * findRecord(K Key, const C &Container)
Implements the TAPI Record Collection Type.
This file implements a set that has insertion order iteration characteristics.
Implements the TAPI Record Types.
LLVM_ABI ObjCIVarRecord * addObjCIVar(StringRef IVar, RecordLinkage Linkage)
LLVM_ABI ObjCIVarRecord * findObjCIVar(StringRef IVar) const
LLVM_ABI std::vector< ObjCIVarRecord * > getObjCIVars() const
LLVM_ABI RecordLinkage getLinkageForSymbol(ObjCIFSymbolKind CurrType) const
LLVM_ABI std::vector< ObjCCategoryRecord * > getObjCCategories() const
LLVM_ABI bool addObjCCategory(ObjCCategoryRecord *Record)
LLVM_ABI void updateLinkageForSymbols(ObjCIFSymbolKind SymType, RecordLinkage Link)
Base class for any usage of traversing over collected Records.
LLVM_ABI StringRef copyString(StringRef String)
Store any strings owned by RecordSlice into allocator and return back reference to that.
LLVM_ABI ObjCIVarRecord * findObjCIVar(bool IsScopedName, StringRef Name) const
Find ObjC instance variable.
LLVM_ABI ObjCCategoryRecord * addObjCCategory(StringRef ClassToExtend, StringRef Category)
Add ObjC Category record.
LLVM_ABI ObjCInterfaceRecord * addObjCInterface(StringRef Name, RecordLinkage Linkage, ObjCIFSymbolKind SymType)
Add ObjC Class record.
LLVM_ABI ObjCContainerRecord * findContainer(bool IsIVar, StringRef Name) const
Find ObjC Container.
LLVM_ABI ObjCIVarRecord * addObjCIVar(ObjCContainerRecord *Container, StringRef Name, RecordLinkage Linkage)
Add ObjC IVar record.
LLVM_ABI GlobalRecord * addGlobal(StringRef Name, RecordLinkage Linkage, GlobalRecord::Kind GV, SymbolFlags Flags=SymbolFlags::None, bool Inlined=false)
Add non-ObjC global record.
LLVM_ABI GlobalRecord * findGlobal(StringRef Name, GlobalRecord::Kind GV=GlobalRecord::Kind::Unknown) const
Find non-objc global.
LLVM_ABI ObjCCategoryRecord * findObjCCategory(StringRef ClassToExtend, StringRef Category) const
Find ObjC Category.
LLVM_ABI BinaryAttrs & getBinaryAttrs()
Return reference to BinaryAttrs.
LLVM_ABI ObjCInterfaceRecord * findObjCInterface(StringRef Name) const
Find ObjC Class.
LLVM_ABI Record * addRecord(StringRef Name, SymbolFlags Flags, GlobalRecord::Kind GV=GlobalRecord::Kind::Unknown, RecordLinkage Linkage=RecordLinkage::Unknown)
Add unspecified record to slice.
LLVM_ABI void visit(RecordVisitor &V) const
bool hasBinaryAttrs() const
Specialized RecordVisitor for collecting exported symbols and undefined symbols if RecordSlice being ...
A vector that has set insertion semantics.
iterator begin()
Get an iterator to the beginning of the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
StringRef - Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI std::unique_ptr< InterfaceFile > convertToInterfaceFile(const Records &Slices)
ObjCIFSymbolKind
ObjC Interface symbol mappings.
@ EHType
Is OBJC_EHTYPE* symbol.
@ Class
Is OBJC_CLASS* symbol.
@ MetaClass
Is OBJC_METACLASS* symbol.
@ ObjectiveCInstanceVariable
LLVM_ABI SimpleSymbol parseSymbol(StringRef SymName)
Get symbol classification by parsing the name of a symbol.
llvm::SmallVector< std::shared_ptr< RecordsSlice >, 4 > Records
@ WeakDefined
Weak defined symbol.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key