diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-03-31 20:21:31 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-03-31 20:21:31 +0000 |
commit | a614ab7b71c36416c747ab73876519b6f0e7b74e (patch) | |
tree | 641e81a10668235abc31fb39158a03cc282d52f6 /llvm/lib/Transforms/Utils/CloneModule.cpp | |
parent | 66c49f78a35625e6cd5f82af030b5919effb3182 (diff) | |
download | llvm-a614ab7b71c36416c747ab73876519b6f0e7b74e.zip llvm-a614ab7b71c36416c747ab73876519b6f0e7b74e.tar.gz llvm-a614ab7b71c36416c747ab73876519b6f0e7b74e.tar.bz2 |
Preserve extern_weak linkage in CloneModule.
Only force "extern" linkage if the function used to be a definition
in the source module. Declarations keep their original linkage.
llvm-svn: 265043
Diffstat (limited to 'llvm/lib/Transforms/Utils/CloneModule.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/CloneModule.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp index 929f51b..6fb86da 100644 --- a/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/llvm/lib/Transforms/Utils/CloneModule.cpp @@ -109,6 +109,9 @@ std::unique_ptr<Module> llvm::CloneModule( // for (Module::const_global_iterator I = M->global_begin(), E = M->global_end(); I != E; ++I) { + if (I->isDeclaration()) + continue; + GlobalVariable *GV = cast<GlobalVariable>(VMap[&*I]); if (!ShouldCloneDefinition(&*I)) { // Skip after setting the correct linkage for an external reference. @@ -122,6 +125,9 @@ std::unique_ptr<Module> llvm::CloneModule( // Similarly, copy over function bodies now... // for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { + if (I->isDeclaration()) + continue; + Function *F = cast<Function>(VMap[&*I]); if (!ShouldCloneDefinition(&*I)) { // Skip after setting the correct linkage for an external reference. @@ -130,18 +136,17 @@ std::unique_ptr<Module> llvm::CloneModule( F->setPersonalityFn(nullptr); continue; } - if (!I->isDeclaration()) { - Function::arg_iterator DestI = F->arg_begin(); - for (Function::const_arg_iterator J = I->arg_begin(); J != I->arg_end(); - ++J) { - DestI->setName(J->getName()); - VMap[&*J] = &*DestI++; - } - - SmallVector<ReturnInst*, 8> Returns; // Ignore returns cloned. - CloneFunctionInto(F, &*I, VMap, /*ModuleLevelChanges=*/true, Returns); + + Function::arg_iterator DestI = F->arg_begin(); + for (Function::const_arg_iterator J = I->arg_begin(); J != I->arg_end(); + ++J) { + DestI->setName(J->getName()); + VMap[&*J] = &*DestI++; } + SmallVector<ReturnInst *, 8> Returns; // Ignore returns cloned. + CloneFunctionInto(F, &*I, VMap, /*ModuleLevelChanges=*/true, Returns); + if (I->hasPersonalityFn()) F->setPersonalityFn(MapValue(I->getPersonalityFn(), VMap)); } |