diff options
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 54acb78153e..64a33c80f20 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; } |