diff options
Diffstat (limited to 'llvm/lib/Object/IRSymtab.cpp')
-rw-r--r-- | llvm/lib/Object/IRSymtab.cpp | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp index 79eeb08..2579fa3 100644 --- a/llvm/lib/Object/IRSymtab.cpp +++ b/llvm/lib/Object/IRSymtab.cpp @@ -54,11 +54,6 @@ static const char *PreservedSymbols[] = { "__stack_chk_guard", }; -static bool isPreservedGlobalVarName(StringRef Name) { - return StringRef(PreservedSymbols[0]) == Name || - StringRef(PreservedSymbols[1]) == Name; -} - namespace { const char *getExpectedProducerName() { @@ -86,16 +81,12 @@ struct Builder { // The StringTableBuilder does not create a copy of any strings added to it, // so this provides somewhere to store any strings that we create. Builder(SmallVector<char, 0> &Symtab, StringTableBuilder &StrtabBuilder, - BumpPtrAllocator &Alloc, const Triple &TT) - : Symtab(Symtab), StrtabBuilder(StrtabBuilder), Saver(Alloc), TT(TT), - Libcalls(TT) {} + BumpPtrAllocator &Alloc) + : Symtab(Symtab), StrtabBuilder(StrtabBuilder), Saver(Alloc) {} DenseMap<const Comdat *, int> ComdatMap; Mangler Mang; - const Triple &TT; - - // FIXME: This shouldn't be here. - RTLIB::RuntimeLibcallsInfo Libcalls; + Triple TT; std::vector<storage::Comdat> Comdats; std::vector<storage::Module> Mods; @@ -107,10 +98,6 @@ struct Builder { std::vector<storage::Str> DependentLibraries; - bool isPreservedLibFuncName(StringRef Name) { - return Libcalls.getSupportedLibcallImpl(Name) != RTLIB::Unsupported; - } - void setStr(storage::Str &S, StringRef Value) { S.Offset = StrtabBuilder.add(Value); S.Size = Value.size(); @@ -226,6 +213,18 @@ Expected<int> Builder::getComdatIndex(const Comdat *C, const Module *M) { return P.first->second; } +static DenseSet<StringRef> buildPreservedSymbolsSet(const Triple &TT) { + DenseSet<StringRef> PreservedSymbolSet(std::begin(PreservedSymbols), + std::end(PreservedSymbols)); + // FIXME: Do we need to pass in ABI fields from TargetOptions? + RTLIB::RuntimeLibcallsInfo Libcalls(TT); + for (RTLIB::LibcallImpl Impl : Libcalls.getLibcallImpls()) { + if (Impl != RTLIB::Unsupported) + PreservedSymbolSet.insert(Libcalls.getLibcallImplName(Impl)); + } + return PreservedSymbolSet; +} + Error Builder::addSymbol(const ModuleSymbolTable &Msymtab, const SmallPtrSet<GlobalValue *, 4> &Used, ModuleSymbolTable::Symbol Msym) { @@ -279,11 +278,13 @@ Error Builder::addSymbol(const ModuleSymbolTable &Msymtab, return Error::success(); } - StringRef GVName = GV->getName(); - setStr(Sym.IRName, GVName); + setStr(Sym.IRName, GV->getName()); + + static const DenseSet<StringRef> PreservedSymbolsSet = + buildPreservedSymbolsSet(GV->getParent()->getTargetTriple()); + bool IsPreservedSymbol = PreservedSymbolsSet.contains(GV->getName()); - if (Used.count(GV) || isPreservedLibFuncName(GVName) || - isPreservedGlobalVarName(GVName)) + if (Used.count(GV) || IsPreservedSymbol) Sym.Flags |= 1 << storage::Symbol::FB_used; if (GV->isThreadLocal()) Sym.Flags |= 1 << storage::Symbol::FB_tls; @@ -350,6 +351,7 @@ Error Builder::build(ArrayRef<Module *> IRMods) { setStr(Hdr.Producer, kExpectedProducerName); setStr(Hdr.TargetTriple, IRMods[0]->getTargetTriple().str()); setStr(Hdr.SourceFileName, IRMods[0]->getSourceFileName()); + TT = IRMods[0]->getTargetTriple(); for (auto *M : IRMods) if (Error Err = addModule(M)) @@ -375,8 +377,7 @@ Error Builder::build(ArrayRef<Module *> IRMods) { Error irsymtab::build(ArrayRef<Module *> Mods, SmallVector<char, 0> &Symtab, StringTableBuilder &StrtabBuilder, BumpPtrAllocator &Alloc) { - const Triple &TT = Mods[0]->getTargetTriple(); - return Builder(Symtab, StrtabBuilder, Alloc, TT).build(Mods); + return Builder(Symtab, StrtabBuilder, Alloc).build(Mods); } // Upgrade a vector of bitcode modules created by an old version of LLVM by |