54 lines · cpp
1//===- lib/TextAPI/SymbolSet.cpp - TAPI Symbol Set ------------*- C++-*----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/TextAPI/SymbolSet.h"10 11using namespace llvm;12using namespace llvm::MachO;13 14SymbolSet::~SymbolSet() {15 for (auto &[Key, Sym] : Symbols)16 Sym->~Symbol();17}18 19Symbol *SymbolSet::addGlobalImpl(EncodeKind Kind, StringRef Name,20 SymbolFlags Flags) {21 Name = copyString(Name);22 auto Result = Symbols.try_emplace(SymbolsMapKey{Kind, Name}, nullptr);23 if (Result.second)24 Result.first->second =25 new (Allocator) Symbol{Kind, Name, TargetList(), Flags};26 return Result.first->second;27}28 29Symbol *SymbolSet::addGlobal(EncodeKind Kind, StringRef Name, SymbolFlags Flags,30 const Target &Targ) {31 auto *Sym = addGlobalImpl(Kind, Name, Flags);32 Sym->addTarget(Targ);33 return Sym;34}35 36const Symbol *SymbolSet::findSymbol(EncodeKind Kind, StringRef Name,37 ObjCIFSymbolKind ObjCIF) const {38 if (auto result = Symbols.lookup({Kind, Name}))39 return result;40 if ((ObjCIF == ObjCIFSymbolKind::None) || (ObjCIF > ObjCIFSymbolKind::EHType))41 return nullptr;42 assert(ObjCIF <= ObjCIFSymbolKind::EHType &&43 "expected single ObjCIFSymbolKind enum value");44 // Non-complete ObjC Interfaces are represented as global symbols.45 if (ObjCIF == ObjCIFSymbolKind::Class)46 return Symbols.lookup(47 {EncodeKind::GlobalSymbol, (ObjC2ClassNamePrefix + Name).str()});48 if (ObjCIF == ObjCIFSymbolKind::MetaClass)49 return Symbols.lookup(50 {EncodeKind::GlobalSymbol, (ObjC2MetaClassNamePrefix + Name).str()});51 return Symbols.lookup(52 {EncodeKind::GlobalSymbol, (ObjC2EHTypePrefix + Name).str()});53}54