@@ -54,6 +54,11 @@ 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+
5762namespace {
5863
5964const char *getExpectedProducerName () {
@@ -81,12 +86,16 @@ struct Builder {
8186 // The StringTableBuilder does not create a copy of any strings added to it,
8287 // so this provides somewhere to store any strings that we create.
8388 Builder (SmallVector<char , 0 > &Symtab, StringTableBuilder &StrtabBuilder,
84- BumpPtrAllocator &Alloc)
85- : Symtab(Symtab), StrtabBuilder(StrtabBuilder), Saver(Alloc) {}
89+ BumpPtrAllocator &Alloc, const Triple &TT)
90+ : Symtab(Symtab), StrtabBuilder(StrtabBuilder), Saver(Alloc), TT(TT),
91+ Libcalls (TT) {}
8692
8793 DenseMap<const Comdat *, int > ComdatMap;
8894 Mangler Mang;
89- Triple TT;
95+ const Triple &TT;
96+
97+ // FIXME: This shouldn't be here.
98+ RTLIB::RuntimeLibcallsInfo Libcalls;
9099
91100 std::vector<storage::Comdat> Comdats;
92101 std::vector<storage::Module> Mods;
@@ -98,6 +107,10 @@ struct Builder {
98107
99108 std::vector<storage::Str> DependentLibraries;
100109
110+ bool isPreservedLibFuncName (StringRef Name) {
111+ return Libcalls.getSupportedLibcallImpl (Name) != RTLIB::Unsupported;
112+ }
113+
101114 void setStr (storage::Str &S, StringRef Value) {
102115 S.Offset = StrtabBuilder.add (Value);
103116 S.Size = Value.size ();
@@ -213,18 +226,6 @@ Expected<int> Builder::getComdatIndex(const Comdat *C, const Module *M) {
213226 return P.first ->second ;
214227}
215228
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-
228229Error Builder::addSymbol (const ModuleSymbolTable &Msymtab,
229230 const SmallPtrSet<GlobalValue *, 4 > &Used,
230231 ModuleSymbolTable::Symbol Msym) {
@@ -278,13 +279,11 @@ Error Builder::addSymbol(const ModuleSymbolTable &Msymtab,
278279 return Error::success ();
279280 }
280281
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 ());
282+ StringRef GVName = GV->getName ();
283+ setStr (Sym.IRName , GVName);
286284
287- if (Used.count (GV) || IsPreservedSymbol)
285+ if (Used.count (GV) || isPreservedLibFuncName (GVName) ||
286+ isPreservedGlobalVarName (GVName))
288287 Sym.Flags |= 1 << storage::Symbol::FB_used;
289288 if (GV->isThreadLocal ())
290289 Sym.Flags |= 1 << storage::Symbol::FB_tls;
@@ -351,7 +350,6 @@ Error Builder::build(ArrayRef<Module *> IRMods) {
351350 setStr (Hdr.Producer , kExpectedProducerName );
352351 setStr (Hdr.TargetTriple , IRMods[0 ]->getTargetTriple ().str ());
353352 setStr (Hdr.SourceFileName , IRMods[0 ]->getSourceFileName ());
354- TT = IRMods[0 ]->getTargetTriple ();
355353
356354 for (auto *M : IRMods)
357355 if (Error Err = addModule (M))
@@ -377,7 +375,8 @@ Error Builder::build(ArrayRef<Module *> IRMods) {
377375Error irsymtab::build (ArrayRef<Module *> Mods, SmallVector<char , 0 > &Symtab,
378376 StringTableBuilder &StrtabBuilder,
379377 BumpPtrAllocator &Alloc) {
380- return Builder (Symtab, StrtabBuilder, Alloc).build (Mods);
378+ const Triple &TT = Mods[0 ]->getTargetTriple ();
379+ return Builder (Symtab, StrtabBuilder, Alloc, TT).build (Mods);
381380}
382381
383382// Upgrade a vector of bitcode modules created by an old version of LLVM by
0 commit comments