diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 4a12633c305..74ca197ddb3 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1892,15 +1892,6 @@ bool ModuleLinker::run() { linkGlobalValueBody(Src); } - // Remap all of the named MDNodes in Src into the DstM module. We do this - // after linking GlobalValues so that MDNodes that reference GlobalValues - // are properly remapped. - linkNamedMDNodes(); - - // Merge the module flags into the DstM module. - if (linkModuleFlagsMetadata()) - return true; - // Update the initializers in the DstM module now that all globals that may // be referenced are in DstM. for (GlobalVariable &Src : SrcM->globals()) { @@ -1927,6 +1918,15 @@ bool ModuleLinker::run() { return true; } + // Remap all of the named MDNodes in Src into the DstM module. We do this + // after linking GlobalValues so that MDNodes that reference GlobalValues + // are properly remapped. + linkNamedMDNodes(); + + // Merge the module flags into the DstM module. + if (linkModuleFlagsMetadata()) + return true; + return false; } diff --git a/test/Linker/Inputs/only-needed-named-metadata.ll b/test/Linker/Inputs/only-needed-named-metadata.ll new file mode 100644 index 00000000000..fa7bc2e3cc8 --- /dev/null +++ b/test/Linker/Inputs/only-needed-named-metadata.ll @@ -0,0 +1,9 @@ +@X = external global i32 + +declare i32 @foo() + +define void @bar() { + load i32, i32* @X + call i32 @foo() + ret void +} diff --git a/test/Linker/only-needed-named-metadata.ll b/test/Linker/only-needed-named-metadata.ll new file mode 100644 index 00000000000..f64637d3c75 --- /dev/null +++ b/test/Linker/only-needed-named-metadata.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as %S/only-needed-named-metadata.ll -o %t.bc +; RUN: llvm-as %S/Inputs/only-needed-named-metadata.ll -o %t2.bc +; RUN: llvm-link -S -only-needed %t2.bc %t.bc | FileCheck %s +; RUN: llvm-link -S -internalize -only-needed %t2.bc %t.bc | FileCheck %s + +; CHECK: @U = external global i32 +; CHECK: declare i32 @unused() + +@X = global i32 5 +@U = global i32 6 +define i32 @foo() { ret i32 7 } +define i32 @unused() { ret i32 8 } + +!llvm.named = !{!0, !1} +!0 = !{i32 ()* @unused} +!1 = !{i32* @U}