diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-03-24 00:06:03 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-03-24 00:06:03 +0000 |
commit | 1ee9fbd842273ab3fb6748c34d9f159a10ccb0d0 (patch) | |
tree | aaa62d118b5876e86be322b4fc2b8c95417d6a0a /llvm/lib/Linker/LinkModules.cpp | |
parent | 5c79bb364a3bf3de914a34492cf9fabcc53fa3b5 (diff) | |
download | bcm5719-llvm-1ee9fbd842273ab3fb6748c34d9f159a10ccb0d0.tar.gz bcm5719-llvm-1ee9fbd842273ab3fb6748c34d9f159a10ccb0d0.zip |
Fix lazy linking of comdat members.
If not for lazy linking of linkonce GVs, comdats are just a
preprocessing before symbol resolution.
Lazy linking complicates it since when we pick a visible member of
comdat, we have to make sure the rest of it passes symbol resolution
too.
llvm-svn: 264223
Diffstat (limited to 'llvm/lib/Linker/LinkModules.cpp')
-rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 28 |
1 files changed, 15 insertions, 13 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()) { |