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