diff options
-rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 28 | ||||
-rw-r--r-- | llvm/test/Linker/comdat9.ll | 4 |
2 files changed, 17 insertions, 15 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index d3c3ea34e6d..9ee3fb32e21 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -76,8 +76,8 @@ class ModuleLinker { ComdatsChosen; bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, bool &LinkFromSrc); - // Keep track of the global value members of each comdat in source. - DenseMap<const Comdat *, std::vector<GlobalValue *>> ComdatMembers; + // Keep track of the lazy linked global members of each comdat in source. + DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers; /// Given a global in the source module, return the global in the /// destination module that is being linked to, if any. @@ -446,8 +446,8 @@ void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) { const Comdat *SC = GV.getComdat(); if (!SC) return; - for (GlobalValue *GV2 : ComdatMembers[SC]) { - if (!GV2->hasLocalLinkage() && shouldInternalizeLinkedSymbols()) + for (GlobalValue *GV2 : LazyComdatMembers[SC]) { + if (shouldInternalizeLinkedSymbols()) Internalize.insert(GV2->getName()); Add(*GV2); } @@ -533,16 +533,19 @@ bool ModuleLinker::run() { } for (GlobalVariable &GV : SrcM->globals()) - if (const Comdat *SC = GV.getComdat()) - ComdatMembers[SC].push_back(&GV); + if (GV.hasLinkOnceLinkage()) + if (const Comdat *SC = GV.getComdat()) + LazyComdatMembers[SC].push_back(&GV); for (Function &SF : *SrcM) - if (const Comdat *SC = SF.getComdat()) - ComdatMembers[SC].push_back(&SF); + if (SF.hasLinkOnceLinkage()) + if (const Comdat *SC = SF.getComdat()) + LazyComdatMembers[SC].push_back(&SF); for (GlobalAlias &GA : SrcM->aliases()) - if (const Comdat *SC = GA.getComdat()) - ComdatMembers[SC].push_back(&GA); + if (GA.hasLinkOnceLinkage()) + if (const Comdat *SC = GA.getComdat()) + LazyComdatMembers[SC].push_back(&GA); // Insert all of the globals in src into the DstM module... without linking // initializers (which could refer to functions not yet mapped over). @@ -563,9 +566,8 @@ bool ModuleLinker::run() { const Comdat *SC = GV->getComdat(); if (!SC) continue; - for (GlobalValue *GV2 : ComdatMembers[SC]) - if (GV2->hasInternalLinkage()) - ValuesToLink.insert(GV2); + for (GlobalValue *GV2 : LazyComdatMembers[SC]) + ValuesToLink.insert(GV2); } if (shouldInternalizeLinkedSymbols()) { diff --git a/llvm/test/Linker/comdat9.ll b/llvm/test/Linker/comdat9.ll index 4f6f2cfb845..6f177e64bbe 100644 --- a/llvm/test/Linker/comdat9.ll +++ b/llvm/test/Linker/comdat9.ll @@ -11,7 +11,7 @@ define internal void @f() comdat($c) { ; CHECK-DAG: define internal void @f() comdat($c) $f2 = comdat largest -define internal void @f2() comdat($f2) { +define linkonce_odr void @f2() comdat($f2) { ret void } define void @f3() comdat($f2) { @@ -19,4 +19,4 @@ define void @f3() comdat($f2) { } ; CHECK-DAG: $f2 = comdat largest -; CHECK-DAG: define internal void @f2() comdat { +; CHECK-DAG: define linkonce_odr void @f2() |