Index: include/llvm/IR/Metadata.h =================================================================== --- include/llvm/IR/Metadata.h +++ include/llvm/IR/Metadata.h @@ -1278,6 +1278,11 @@ if (!Use) return; *Use = MD; + + if (*Use) + MetadataTracking::track(*Use); + + // Equivalent to MetadataTracking::untrack Use = nullptr; } }; Index: test/ThinLTO/X86/Inputs/lazy-load-temporaries-cleanup.b.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/Inputs/lazy-load-temporaries-cleanup.b.ll @@ -0,0 +1,11 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @patatino() { + ret void +} + +!named = !{!0} + +!0 = distinct !{!1, i8 0} +!1 = !{i8 1} Index: test/ThinLTO/X86/lazy-load-temporaries-cleanup.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/lazy-load-temporaries-cleanup.ll @@ -0,0 +1,3 @@ +; This test ensures that metadata temporaries are properly tracked, then cleaned up + +; RUN: opt -module-summary -bitcode-mdindex-threshold=0 %S/Inputs/lazy-load-temporaries-cleanup.b.ll | llvm-dis -materialize-metadata -set-importing Index: tools/llvm-dis/llvm-dis.cpp =================================================================== --- tools/llvm-dis/llvm-dis.cpp +++ tools/llvm-dis/llvm-dis.cpp @@ -51,6 +51,9 @@ DontPrint("disable-output", cl::desc("Don't output the .ll file"), cl::Hidden); static cl::opt +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")); @@ -144,7 +147,7 @@ ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFilename))); std::unique_ptr M = ExitOnErr(getOwningLazyBitcodeModule(std::move(MB), Context, - /*ShouldLazyLoadMetadata=*/true)); + /*ShouldLazyLoadMetadata=*/true, SetImporting)); if (MaterializeMetadata) ExitOnErr(M->materializeMetadata()); else