Fix llvm::CloneModule to correctly clone globals. Patch per bug report by Simon Moll on llvmdev.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137654 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2011-08-15 21:05:06 +00:00
parent e5e771263a
commit 0455bb89cd

View File

@ -50,10 +50,12 @@ Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) {
I != E; ++I) { I != E; ++I) {
GlobalVariable *GV = new GlobalVariable(*New, GlobalVariable *GV = new GlobalVariable(*New,
I->getType()->getElementType(), I->getType()->getElementType(),
false, I->isConstant(), I->getLinkage(),
GlobalValue::ExternalLinkage, 0, (Constant*) 0, I->getName(),
I->getName()); (GlobalVariable*) 0,
GV->setAlignment(I->getAlignment()); I->isThreadLocal(),
I->getType()->getAddressSpace());
GV->copyAttributesFrom(I);
VMap[I] = GV; VMap[I] = GV;
} }
@ -61,16 +63,19 @@ Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) {
for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) {
Function *NF = Function *NF =
Function::Create(cast<FunctionType>(I->getType()->getElementType()), Function::Create(cast<FunctionType>(I->getType()->getElementType()),
GlobalValue::ExternalLinkage, I->getName(), New); I->getLinkage(), I->getName(), New);
NF->copyAttributesFrom(I); NF->copyAttributesFrom(I);
VMap[I] = NF; VMap[I] = NF;
} }
// Loop over the aliases in the module // 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 = M->alias_begin(), E = M->alias_end();
I != E; ++I) I != E; ++I) {
VMap[I] = new GlobalAlias(I->getType(), GlobalAlias::ExternalLinkage, GlobalAlias *GA = new GlobalAlias(I->getType(), I->getLinkage(),
I->getName(), NULL, New); I->getName(), NULL, New);
GA->copyAttributesFrom(I);
VMap[I] = GA;
}
// Now that all of the things that global variable initializer can refer to // Now that all of the things that global variable initializer can refer to
// have been created, loop through and copy the global variable referrers // have been created, loop through and copy the global variable referrers
@ -81,9 +86,6 @@ Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) {
GlobalVariable *GV = cast<GlobalVariable>(VMap[I]); GlobalVariable *GV = cast<GlobalVariable>(VMap[I]);
if (I->hasInitializer()) if (I->hasInitializer())
GV->setInitializer(MapValue(I->getInitializer(), VMap)); GV->setInitializer(MapValue(I->getInitializer(), VMap));
GV->setLinkage(I->getLinkage());
GV->setThreadLocal(I->isThreadLocal());
GV->setConstant(I->isConstant());
} }
// Similarly, copy over function bodies now... // Similarly, copy over function bodies now...
@ -101,15 +103,12 @@ Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) {
SmallVector<ReturnInst*, 8> Returns; // Ignore returns cloned. SmallVector<ReturnInst*, 8> Returns; // Ignore returns cloned.
CloneFunctionInto(F, I, VMap, /*ModuleLevelChanges=*/true, Returns); CloneFunctionInto(F, I, VMap, /*ModuleLevelChanges=*/true, Returns);
} }
F->setLinkage(I->getLinkage());
} }
// And aliases // And aliases
for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end(); for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
I != E; ++I) { I != E; ++I) {
GlobalAlias *GA = cast<GlobalAlias>(VMap[I]); GlobalAlias *GA = cast<GlobalAlias>(VMap[I]);
GA->setLinkage(I->getLinkage());
if (const Constant *C = I->getAliasee()) if (const Constant *C = I->getAliasee())
GA->setAliasee(MapValue(C, VMap)); GA->setAliasee(MapValue(C, VMap));
} }