xref: /llvm-project/llvm/lib/TextAPI/SymbolSet.cpp (revision 4460fa8814d4c86e1d22f830078d7bad69bc0ecc)
10882c70dSCyndy Ishida //===- lib/TextAPI/SymbolSet.cpp - TAPI Symbol Set ------------*- C++-*----===//
20882c70dSCyndy Ishida //
30882c70dSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40882c70dSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
50882c70dSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60882c70dSCyndy Ishida //
70882c70dSCyndy Ishida //===----------------------------------------------------------------------===//
80882c70dSCyndy Ishida 
90882c70dSCyndy Ishida #include "llvm/TextAPI/SymbolSet.h"
100882c70dSCyndy Ishida 
110882c70dSCyndy Ishida using namespace llvm;
120882c70dSCyndy Ishida using namespace llvm::MachO;
130882c70dSCyndy Ishida 
addGlobalImpl(EncodeKind Kind,StringRef Name,SymbolFlags Flags)14d9a9872eSCyndy Ishida Symbol *SymbolSet::addGlobalImpl(EncodeKind Kind, StringRef Name,
150882c70dSCyndy Ishida                                  SymbolFlags Flags) {
160882c70dSCyndy Ishida   Name = copyString(Name);
170882c70dSCyndy Ishida   auto Result = Symbols.try_emplace(SymbolsMapKey{Kind, Name}, nullptr);
180882c70dSCyndy Ishida   if (Result.second)
190882c70dSCyndy Ishida     Result.first->second =
200882c70dSCyndy Ishida         new (Allocator) Symbol{Kind, Name, TargetList(), Flags};
210882c70dSCyndy Ishida   return Result.first->second;
220882c70dSCyndy Ishida }
230882c70dSCyndy Ishida 
addGlobal(EncodeKind Kind,StringRef Name,SymbolFlags Flags,const Target & Targ)24d9a9872eSCyndy Ishida Symbol *SymbolSet::addGlobal(EncodeKind Kind, StringRef Name, SymbolFlags Flags,
250882c70dSCyndy Ishida                              const Target &Targ) {
260882c70dSCyndy Ishida   auto *Sym = addGlobalImpl(Kind, Name, Flags);
270882c70dSCyndy Ishida   Sym->addTarget(Targ);
280882c70dSCyndy Ishida   return Sym;
290882c70dSCyndy Ishida }
300882c70dSCyndy Ishida 
findSymbol(EncodeKind Kind,StringRef Name,ObjCIFSymbolKind ObjCIF) const31*4460fa88SCyndy Ishida const Symbol *SymbolSet::findSymbol(EncodeKind Kind, StringRef Name,
32*4460fa88SCyndy Ishida                                     ObjCIFSymbolKind ObjCIF) const {
33*4460fa88SCyndy Ishida   if (auto result = Symbols.lookup({Kind, Name}))
34*4460fa88SCyndy Ishida     return result;
35*4460fa88SCyndy Ishida   if ((ObjCIF == ObjCIFSymbolKind::None) || (ObjCIF > ObjCIFSymbolKind::EHType))
36*4460fa88SCyndy Ishida     return nullptr;
37*4460fa88SCyndy Ishida   assert(ObjCIF <= ObjCIFSymbolKind::EHType &&
38*4460fa88SCyndy Ishida          "expected single ObjCIFSymbolKind enum value");
39*4460fa88SCyndy Ishida   // Non-complete ObjC Interfaces are represented as global symbols.
40*4460fa88SCyndy Ishida   if (ObjCIF == ObjCIFSymbolKind::Class)
41*4460fa88SCyndy Ishida     return Symbols.lookup(
42*4460fa88SCyndy Ishida         {EncodeKind::GlobalSymbol, (ObjC2ClassNamePrefix + Name).str()});
43*4460fa88SCyndy Ishida   if (ObjCIF == ObjCIFSymbolKind::MetaClass)
44*4460fa88SCyndy Ishida     return Symbols.lookup(
45*4460fa88SCyndy Ishida         {EncodeKind::GlobalSymbol, (ObjC2MetaClassNamePrefix + Name).str()});
46*4460fa88SCyndy Ishida   return Symbols.lookup(
47*4460fa88SCyndy Ishida       {EncodeKind::GlobalSymbol, (ObjC2EHTypePrefix + Name).str()});
480882c70dSCyndy Ishida }
49