mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
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:
parent
d2677fff24
commit
ad76773e07
@ -3347,7 +3347,7 @@ void BitcodeReader::Dematerialize(GlobalValue *GV) {
|
||||
assert(DeferredFunctionInfo.count(F) && "No info to read function later?");
|
||||
|
||||
// Just forget the function body, we can remat it later.
|
||||
F->deleteBody();
|
||||
F->dropAllReferences();
|
||||
}
|
||||
|
||||
std::error_code BitcodeReader::MaterializeModule(Module *M) {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user