diff options
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()); |