@@ -54,11 +54,6 @@ static const char *PreservedSymbols[] = {
5454 " __stack_chk_guard" ,
5555};
5656
57- static bool isPreservedGlobalVarName (StringRef Name) {
58- return StringRef (PreservedSymbols[0 ]) == Name ||
59- StringRef (PreservedSymbols[1 ]) == Name;
60- }
61-
6257namespace {
6358
6459const char *getExpectedProducerName () {
@@ -86,16 +81,12 @@ struct Builder {
8681 // The StringTableBuilder does not create a copy of any strings added to it,
8782 // so this provides somewhere to store any strings that we create.
8883 Builder (SmallVector<char , 0 > &Symtab, StringTableBuilder &StrtabBuilder,
89- BumpPtrAllocator &Alloc, const Triple &TT)
90- : Symtab(Symtab), StrtabBuilder(StrtabBuilder), Saver(Alloc), TT(TT),
91- Libcalls (TT) {}
84+ BumpPtrAllocator &Alloc)
85+ : Symtab(Symtab), StrtabBuilder(StrtabBuilder), Saver(Alloc) {}
9286
9387 DenseMap<const Comdat *, int > ComdatMap;
9488 Mangler Mang;
95- const Triple &TT;
96-
97- // FIXME: This shouldn't be here.
98- RTLIB::RuntimeLibcallsInfo Libcalls;
89+ Triple TT;
9990
10091 std::vector<storage::Comdat> Comdats;
10192 std::vector<storage::Module> Mods;
@@ -107,10 +98,6 @@ struct Builder {
10798
10899 std::vector<storage::Str> DependentLibraries;
109100
110- bool isPreservedLibFuncName (StringRef Name) {
111- return Libcalls.getSupportedLibcallImpl (Name) != RTLIB::Unsupported;
112- }
113-
114101 void setStr (storage::Str &S, StringRef Value) {
115102 S.Offset = StrtabBuilder.add (Value);
116103 S.Size = Value.size ();
@@ -226,6 +213,18 @@ Expected<int> Builder::getComdatIndex(const Comdat *C, const Module *M) {
226213 return P.first ->second ;
227214}
228215
216+ static DenseSet<StringRef> buildPreservedSymbolsSet (const Triple &TT) {
217+ DenseSet<StringRef> PreservedSymbolSet (std::begin (PreservedSymbols),
218+ std::end (PreservedSymbols));
219+ // FIXME: Do we need to pass in ABI fields from TargetOptions?
220+ RTLIB::RuntimeLibcallsInfo Libcalls (TT);
221+ for (RTLIB::LibcallImpl Impl : Libcalls.getLibcallImpls ()) {
222+ if (Impl != RTLIB::Unsupported)
223+ PreservedSymbolSet.insert (Libcalls.getLibcallImplName (Impl));
224+ }
225+ return PreservedSymbolSet;
226+ }
227+
229228Error Builder::addSymbol (const ModuleSymbolTable &Msymtab,
230229 const SmallPtrSet<GlobalValue *, 4 > &Used,
231230 ModuleSymbolTable::Symbol Msym) {
@@ -279,11 +278,13 @@ Error Builder::addSymbol(const ModuleSymbolTable &Msymtab,
279278 return Error::success ();
280279 }
281280
282- StringRef GVName = GV->getName ();
283- setStr (Sym.IRName , GVName);
281+ setStr (Sym.IRName , GV->getName ());
282+
283+ static const DenseSet<StringRef> PreservedSymbolsSet =
284+ buildPreservedSymbolsSet (GV->getParent ()->getTargetTriple ());
285+ bool IsPreservedSymbol = PreservedSymbolsSet.contains (GV->getName ());
284286
285- if (Used.count (GV) || isPreservedLibFuncName (GVName) ||
286- isPreservedGlobalVarName (GVName))
287+ if (Used.count (GV) || IsPreservedSymbol)
287288 Sym.Flags |= 1 << storage::Symbol::FB_used;
288289 if (GV->isThreadLocal ())
289290 Sym.Flags |= 1 << storage::Symbol::FB_tls;
@@ -350,6 +351,7 @@ Error Builder::build(ArrayRef<Module *> IRMods) {
350351 setStr (Hdr.Producer , kExpectedProducerName );
351352 setStr (Hdr.TargetTriple , IRMods[0 ]->getTargetTriple ().str ());
352353 setStr (Hdr.SourceFileName , IRMods[0 ]->getSourceFileName ());
354+ TT = IRMods[0 ]->getTargetTriple ();
353355
354356 for (auto *M : IRMods)
355357 if (Error Err = addModule (M))
@@ -375,8 +377,7 @@ Error Builder::build(ArrayRef<Module *> IRMods) {
375377Error irsymtab::build (ArrayRef<Module *> Mods, SmallVector<char , 0 > &Symtab,
376378 StringTableBuilder &StrtabBuilder,
377379 BumpPtrAllocator &Alloc) {
378- const Triple &TT = Mods[0 ]->getTargetTriple ();
379- return Builder (Symtab, StrtabBuilder, Alloc, TT).build (Mods);
380+ return Builder (Symtab, StrtabBuilder, Alloc).build (Mods);
380381}
381382
382383// Upgrade a vector of bitcode modules created by an old version of LLVM by
0 commit comments