diff options
author | Lang Hames <lhames@gmail.com> | 2015-04-12 20:05:51 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2015-04-12 20:05:51 +0000 |
commit | c6de458f7c611ea3af3cc316158ecc12ba0d897a (patch) | |
tree | 66a30921ad982dc11ddb600917667a2741725b9d /llvm/lib/ExecutionEngine | |
parent | 274f48b5a8457c40e8944531cdc1786a21efc74f (diff) | |
download | bcm5719-llvm-c6de458f7c611ea3af3cc316158ecc12ba0d897a.tar.gz bcm5719-llvm-c6de458f7c611ea3af3cc316158ecc12ba0d897a.zip |
[Orc] During module partitioning, rename anonymous and asm-private globals.
If they're not (re)named, these globals will fail to resolve when the
partitioned modules are linked.
llvm-svn: 234707
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index bcf22f58266..ebeedef7eae 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -14,6 +14,7 @@ #include "llvm/IR/CallSite.h" #include "llvm/IR/IRBuilder.h" #include <set> +#include <sstream> namespace llvm { namespace orc { @@ -51,32 +52,69 @@ void makeStub(Function &F, GlobalVariable &ImplPointer) { Builder.CreateRet(Call); } +// Utility class for renaming global values and functions during partitioning. +class GlobalRenamer { +public: + + static bool needsRenaming(const Value &New) { + if (!New.hasName() || New.getName().startswith("\01L")) + return true; + return false; + } + + 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; + } + + // 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; +}; + void partition(Module &M, const ModulePartitionMap &PMap) { + GlobalRenamer Renamer; + for (auto &KVPair : PMap) { auto ExtractGlobalVars = [&](GlobalVariable &New, const GlobalVariable &Orig, ValueToValueMapTy &VMap) { - assert(Orig.hasName() && "Extracted globals must have names."); if (KVPair.second.count(&Orig)) { copyGVInitializer(New, Orig, VMap); } if (New.hasLocalLinkage()) { + if (Renamer.needsRenaming(New)) + New.setName(Renamer.getRename(Orig)); New.setLinkage(GlobalValue::ExternalLinkage); New.setVisibility(GlobalValue::HiddenVisibility); } + assert(!Renamer.needsRenaming(New) && "Invalid global name."); }; auto ExtractFunctions = [&](Function &New, const Function &Orig, ValueToValueMapTy &VMap) { - assert(Orig.hasName() && "Extracted functions must have names."); if (KVPair.second.count(&Orig)) copyFunctionBody(New, Orig, VMap); if (New.hasLocalLinkage()) { + if (Renamer.needsRenaming(New)) + New.setName(Renamer.getRename(Orig)); New.setLinkage(GlobalValue::ExternalLinkage); New.setVisibility(GlobalValue::HiddenVisibility); } + assert(!Renamer.needsRenaming(New) && "Invalid function name."); }; CloneSubModule(*KVPair.first, M, ExtractGlobalVars, ExtractFunctions, |