diff options
author | Lang Hames <lhames@gmail.com> | 2018-09-27 19:27:20 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-09-27 19:27:20 +0000 |
commit | c5192f751a5012fddfc1f2a2fa03db02476a183f (patch) | |
tree | 1256ef894d90d7103b2bb7bcbe4571cc5fae33a6 /llvm/lib/ExecutionEngine | |
parent | 3ac3c0d717c64365c5e55a003f67e9b2460fd660 (diff) | |
download | bcm5719-llvm-c5192f751a5012fddfc1f2a2fa03db02476a183f.tar.gz bcm5719-llvm-c5192f751a5012fddfc1f2a2fa03db02476a183f.zip |
[ORC] Coalesce all of ORC's symbol renaming / linkage-promotion utilities into
one SymbolLinkagePromoter utility.
SymbolLinkagePromoter renames anonymous and private symbols, and bumps all
linkages to at least global/hidden-visibility. Modules whose symbols have been
promoted by this utility can be decomposed into sub-modules without introducing
link errors. This is used by the CompileOnDemandLayer to extract single-function
modules for lazy compilation.
llvm-svn: 343257
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 64 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 2 |
2 files changed, 16 insertions, 50 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index 54baed237b2..c1ece816b75 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -246,57 +246,23 @@ void makeStub(Function &F, Value &ImplPointer) { Builder.CreateRet(Call); } -// Utility class for renaming global values and functions during partitioning. -class GlobalRenamer { -public: - - static bool needsRenaming(const Value &New) { - return !New.hasName() || New.getName().startswith("\01L"); - } - - const std::string& getRename(const Value &Orig) { - // See if we have a name for this global. - { - auto I = Names.find(&Orig); - if (I != Names.end()) - return I->second; +void SymbolLinkagePromoter::operator()(Module &M) { + for (auto &GV : M.global_values()) { + + // Rename if necessary. + if (!GV.hasName()) + GV.setName("__orc_anon." + Twine(NextId++)); + else if (GV.getName().startswith("\01L")) + GV.setName("__" + GV.getName().substr(1) + "." + Twine(NextId++)); + else if (GV.hasLocalLinkage()) + GV.setName("__orc_lcl." + GV.getName() + "." + Twine(NextId++)); + + if (GV.hasLocalLinkage()) { + GV.setLinkage(GlobalValue::ExternalLinkage); + GV.setVisibility(GlobalValue::HiddenVisibility); } - - // Nope. Create a new one. - // FIXME: Use a more robust uniquing scheme. (This may blow up if the user - // writes a "__orc_anon[[:digit:]]* method). - unsigned ID = Names.size(); - std::ostringstream NameStream; - NameStream << "__orc_anon" << ID++; - auto I = Names.insert(std::make_pair(&Orig, NameStream.str())); - return I.first->second; - } -private: - DenseMap<const Value*, std::string> Names; -}; - -static void raiseVisibilityOnValue(GlobalValue &V, GlobalRenamer &R) { - if (V.hasLocalLinkage()) { - if (R.needsRenaming(V)) - V.setName(R.getRename(V)); - V.setLinkage(GlobalValue::ExternalLinkage); - V.setVisibility(GlobalValue::HiddenVisibility); + GV.setUnnamedAddr(GlobalValue::UnnamedAddr::None); } - V.setUnnamedAddr(GlobalValue::UnnamedAddr::None); - assert(!R.needsRenaming(V) && "Invalid global name."); -} - -void makeAllSymbolsExternallyAccessible(Module &M) { - GlobalRenamer Renamer; - - for (auto &F : M) - raiseVisibilityOnValue(F, Renamer); - - for (auto &GV : M.globals()) - raiseVisibilityOnValue(GV, Renamer); - - for (auto &A : M.aliases()) - raiseVisibilityOnValue(A, Renamer); } Function* cloneFunctionDecl(Module &Dst, const Function &F, diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index fef190ba575..91fa4ec2077 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -181,7 +181,7 @@ Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { if (auto Err = applyDataLayout(*TSM.getModule())) return Err; - makeAllSymbolsExternallyAccessible(*TSM.getModule()); + PromoteSymbols(*TSM.getModule()); recordCtorDtors(*TSM.getModule()); |