[llvm] r241122 - [Cloning] Teach CloneModule about personality functions
David Majnemer
david.majnemer at gmail.com
Tue Jun 30 15:14:01 PDT 2015
Author: majnemer
Date: Tue Jun 30 17:14:01 2015
New Revision: 241122
URL: http://llvm.org/viewvc/llvm-project?rev=241122&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Transforms/Utils/CloneModule.cpp
llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
Modified: llvm/trunk/lib/Transforms/Utils/CloneModule.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CloneModule.cpp?rev=241122&r1=241121&r2=241122&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/CloneModule.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/CloneModule.cpp Tue Jun 30 17:14:01 2015
@@ -99,7 +99,11 @@ Module *llvm::CloneModule(const Module *
SmallVector<ReturnInst*, 8> Returns; // Ignore returns cloned.
CloneFunctionInto(F, I, VMap, /*ModuleLevelChanges=*/true, Returns);
+
}
+
+ if (I->hasPersonalityFn())
+ F->setPersonalityFn(MapValue(I->getPersonalityFn(), VMap));
}
// And aliases
Modified: llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/Cloning.cpp?rev=241122&r1=241121&r2=241122&view=diff
==============================================================================
--- llvm/trunk/unittests/Transforms/Utils/Cloning.cpp (original)
+++ llvm/trunk/unittests/Transforms/Utils/Cloning.cpp Tue Jun 30 17:14:01 2015
@@ -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));
+}
+
}
More information about the llvm-commits
mailing list