From: Charles Saternos Date: Tue, 15 Aug 2017 22:23:44 +0000 (+0000) Subject: [ThinLTO] Fix ThinLTO crash while destroying context X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=417caf5c7c02515698d5f9a28654973974f9cfcb;p=llvm [ThinLTO] Fix ThinLTO crash while destroying context Fix for PR32763 An assert that checks if a Ref was untracked fails during ThinLTO context cleanup. The issue is because lazy loading temporary nodes didn't properly track ValueAsMetadata nodes. This patch ensures that the temporary nodes are properly tracked when they're replaced with the value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310967 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h index 927729d063b..dc785988597 100644 --- a/include/llvm/IR/Metadata.h +++ b/include/llvm/IR/Metadata.h @@ -1303,7 +1303,13 @@ public: if (!Use) return; *Use = MD; - Use = nullptr; + + if (*Use) + MetadataTracking::track(*Use); + + Metadata *T = cast(this); + MetadataTracking::untrack(T); + assert(!Use && "Use is still being tracked despite being untracked!"); } }; diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp index 0c1d723a7b1..82dbaa5e3c6 100644 --- a/tools/llvm-dis/llvm-dis.cpp +++ b/tools/llvm-dis/llvm-dis.cpp @@ -51,8 +51,13 @@ static cl::opt DontPrint("disable-output", cl::desc("Don't output the .ll file"), cl::Hidden); static cl::opt -ShowAnnotations("show-annotations", - cl::desc("Add informational comments to the .ll file")); + SetImporting("set-importing", + cl::desc("Set lazy loading to pretend to import a module"), + cl::Hidden); + +static cl::opt + ShowAnnotations("show-annotations", + cl::desc("Add informational comments to the .ll file")); static cl::opt PreserveAssemblyUseListOrder( "preserve-ll-uselistorder", @@ -142,9 +147,9 @@ static ExitOnError ExitOnErr; static std::unique_ptr openInputFile(LLVMContext &Context) { std::unique_ptr MB = ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFilename))); - std::unique_ptr M = - ExitOnErr(getOwningLazyBitcodeModule(std::move(MB), Context, - /*ShouldLazyLoadMetadata=*/true)); + std::unique_ptr M = ExitOnErr(getOwningLazyBitcodeModule( + std::move(MB), Context, + /*ShouldLazyLoadMetadata=*/true, SetImporting)); if (MaterializeMetadata) ExitOnErr(M->materializeMetadata()); else