diff options
author | Lang Hames <lhames@gmail.com> | 2015-02-17 01:18:38 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2015-02-17 01:18:38 +0000 |
commit | 2754714fb9ee5d7eae757b5fe02ba4a425b56235 (patch) | |
tree | d5b5c87cd6b750ba45f3384fdd2df43248d91da0 /llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp | |
parent | 7f957c17a0e2e00d82c373a5ae9f836be0bdb38a (diff) | |
download | llvm-2754714fb9ee5d7eae757b5fe02ba4a425b56235.zip llvm-2754714fb9ee5d7eae757b5fe02ba4a425b56235.tar.gz llvm-2754714fb9ee5d7eae757b5fe02ba4a425b56235.tar.bz2 |
[Orc] Update the Orc indirection utils and refactor the CompileOnDemand layer.
This patch replaces most of the Orc indirection utils API with a new class:
JITCompileCallbackManager, which creates and manages JIT callbacks.
Exposing this functionality directly allows the user to create callbacks that
are associated with user supplied compilation actions. For example, you can
create a callback to lazyily IR-gen something from an AST. (A kaleidoscope
example demonstrating this will be committed shortly).
This patch also refactors the CompileOnDemand layer to use the
JITCompileCallbackManager API.
llvm-svn: 229461
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp b/llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp index 54acb78..64a33c8 100644 --- a/llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp +++ b/llvm/lib/ExecutionEngine/Orc/CloneSubModule.cpp @@ -27,27 +27,20 @@ void llvm::copyFunctionBody(Function &New, const Function &Orig, } } -std::unique_ptr<Module> -llvm::CloneSubModule(const Module &M, +void llvm::CloneSubModule(llvm::Module &Dst, const Module &Src, HandleGlobalVariableFtor HandleGlobalVariable, - HandleFunctionFtor HandleFunction, bool KeepInlineAsm) { + HandleFunctionFtor HandleFunction, bool CloneInlineAsm) { ValueToValueMapTy VMap; - // First off, we need to create the new module. - std::unique_ptr<Module> New = - llvm::make_unique<Module>(M.getModuleIdentifier(), M.getContext()); - - New->setDataLayout(M.getDataLayout()); - New->setTargetTriple(M.getTargetTriple()); - if (KeepInlineAsm) - New->setModuleInlineAsm(M.getModuleInlineAsm()); + if (CloneInlineAsm) + Dst.appendModuleInlineAsm(Src.getModuleInlineAsm()); // Copy global variables (but not initializers, yet). - for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); + for (Module::const_global_iterator I = Src.global_begin(), E = Src.global_end(); I != E; ++I) { GlobalVariable *GV = new GlobalVariable( - *New, I->getType()->getElementType(), I->isConstant(), I->getLinkage(), + Dst, I->getType()->getElementType(), I->isConstant(), I->getLinkage(), (Constant *)nullptr, I->getName(), (GlobalVariable *)nullptr, I->getThreadLocalMode(), I->getType()->getAddressSpace()); GV->copyAttributesFrom(I); @@ -55,21 +48,21 @@ llvm::CloneSubModule(const Module &M, } // Loop over the functions in the module, making external functions as before - for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { + for (Module::const_iterator I = Src.begin(), E = Src.end(); I != E; ++I) { Function *NF = Function::Create(cast<FunctionType>(I->getType()->getElementType()), - I->getLinkage(), I->getName(), &*New); + I->getLinkage(), I->getName(), &Dst); NF->copyAttributesFrom(I); VMap[I] = NF; } // Loop over the aliases in the module - for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); + for (Module::const_alias_iterator I = Src.alias_begin(), E = Src.alias_end(); I != E; ++I) { auto *PTy = cast<PointerType>(I->getType()); auto *GA = GlobalAlias::create(PTy->getElementType(), PTy->getAddressSpace(), - I->getLinkage(), I->getName(), &*New); + I->getLinkage(), I->getName(), &Dst); GA->copyAttributesFrom(I); VMap[I] = GA; } @@ -77,7 +70,7 @@ llvm::CloneSubModule(const Module &M, // Now that all of the things that global variable initializer can refer to // have been created, loop through and copy the global variable referrers // over... We also set the attributes on the global now. - for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); + for (Module::const_global_iterator I = Src.global_begin(), E = Src.global_end(); I != E; ++I) { GlobalVariable &GV = *cast<GlobalVariable>(VMap[I]); HandleGlobalVariable(GV, *I, VMap); @@ -85,13 +78,13 @@ llvm::CloneSubModule(const Module &M, // Similarly, copy over function bodies now... // - for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { + for (Module::const_iterator I = Src.begin(), E = Src.end(); I != E; ++I) { Function &F = *cast<Function>(VMap[I]); HandleFunction(F, *I, VMap); } // And aliases - for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); + for (Module::const_alias_iterator I = Src.alias_begin(), E = Src.alias_end(); I != E; ++I) { GlobalAlias *GA = cast<GlobalAlias>(VMap[I]); if (const Constant *C = I->getAliasee()) @@ -99,14 +92,13 @@ llvm::CloneSubModule(const Module &M, } // And named metadata.... - for (Module::const_named_metadata_iterator I = M.named_metadata_begin(), - E = M.named_metadata_end(); + for (Module::const_named_metadata_iterator I = Src.named_metadata_begin(), + E = Src.named_metadata_end(); I != E; ++I) { const NamedMDNode &NMD = *I; - NamedMDNode *NewNMD = New->getOrInsertNamedMetadata(NMD.getName()); + NamedMDNode *NewNMD = Dst.getOrInsertNamedMetadata(NMD.getName()); for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i) NewNMD->addOperand(MapMetadata(NMD.getOperand(i), VMap)); } - return New; } |