Do not destroy external linkage when deleting function body

The function deleteBody() converts the linkage to external and thus destroys
original linkage type value. Lack of correct linkage type causes wrong
relocations to be emitted later.
Calling dropAllReferences() instead of deleteBody() will fix the issue.

Differential Revision: http://reviews.llvm.org/D5415

llvm-svn: 218302
This commit is contained in:
Petar Jovanovic
2014-09-23 12:54:19 +00:00
parent 40592d2dec
commit 7480e4db5e
2 changed files with 25 additions and 1 deletions

View File

@@ -58,6 +58,30 @@ static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context,
return std::unique_ptr<Module>(ModuleOrErr.get());
}
TEST(BitReaderTest, DematerializeFunctionPreservesLinkageType) {
SmallString<1024> Mem;
LLVMContext Context;
std::unique_ptr<Module> M = getLazyModuleFromAssembly(
Context, Mem, "define internal i32 @func() {\n"
"ret i32 0\n"
"}\n");
EXPECT_FALSE(verifyModule(*M, &dbgs()));
M->getFunction("func")->Materialize();
EXPECT_FALSE(M->getFunction("func")->empty());
EXPECT_TRUE(M->getFunction("func")->getLinkage() ==
GlobalValue::InternalLinkage);
// Check that the linkage type is preserved after dematerialization.
M->getFunction("func")->Dematerialize();
EXPECT_TRUE(M->getFunction("func")->empty());
EXPECT_TRUE(M->getFunction("func")->getLinkage() ==
GlobalValue::InternalLinkage);
EXPECT_FALSE(verifyModule(*M, &dbgs()));
}
TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
SmallString<1024> Mem;