Index: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp =================================================================== --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp @@ -3347,7 +3347,7 @@ 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) { Index: llvm/trunk/unittests/Bitcode/BitReaderTest.cpp =================================================================== --- llvm/trunk/unittests/Bitcode/BitReaderTest.cpp +++ llvm/trunk/unittests/Bitcode/BitReaderTest.cpp @@ -58,6 +58,30 @@ return std::unique_ptr(ModuleOrErr.get()); } +TEST(BitReaderTest, DematerializeFunctionPreservesLinkageType) { + SmallString<1024> Mem; + + LLVMContext Context; + std::unique_ptr 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;