mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
[Cloning] Teach CloneModule about personality functions
CloneModule didn't take into account that it needed to remap the value using values in the module. This fixes PR23992. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241122 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -99,7 +99,11 @@ 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (I->hasPersonalityFn())
|
||||||
|
F->setPersonalityFn(MapValue(I->getPersonalityFn(), VMap));
|
||||||
}
|
}
|
||||||
|
|
||||||
// And aliases
|
// And aliases
|
||||||
|
@@ -415,4 +415,39 @@ TEST_F(CloneFunc, DebugIntrinsics) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CloneModule : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
void SetUp() override {
|
||||||
|
SetupModule();
|
||||||
|
CreateOldModule();
|
||||||
|
CreateNewModule();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetupModule() { OldM = new Module("", C); }
|
||||||
|
|
||||||
|
void CreateOldModule() {
|
||||||
|
IRBuilder<> IBuilder(C);
|
||||||
|
|
||||||
|
auto *FuncType = FunctionType::get(Type::getVoidTy(C), false);
|
||||||
|
auto *PersFn = Function::Create(FuncType, GlobalValue::ExternalLinkage,
|
||||||
|
"persfn", OldM);
|
||||||
|
auto *F =
|
||||||
|
Function::Create(FuncType, GlobalValue::PrivateLinkage, "f", OldM);
|
||||||
|
F->setPersonalityFn(PersFn);
|
||||||
|
auto *Entry = BasicBlock::Create(C, "", F);
|
||||||
|
IBuilder.SetInsertPoint(Entry);
|
||||||
|
IBuilder.CreateRetVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateNewModule() { NewM = llvm::CloneModule(OldM); }
|
||||||
|
|
||||||
|
LLVMContext C;
|
||||||
|
Module *OldM;
|
||||||
|
Module *NewM;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(CloneModule, Verify) {
|
||||||
|
EXPECT_FALSE(verifyModule(*NewM));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user