[llvm] r251926 - Move metadata linking after lazy global materialization/linking.

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 3 07:11:28 PST 2015


Author: tejohnson
Date: Tue Nov  3 09:11:27 2015
New Revision: 251926

URL: http://llvm.org/viewvc/llvm-project?rev=251926&view=rev
Log:
Move metadata linking after lazy global materialization/linking.

Summary:
Currently, named metadata is linked before the LazilyLinkGlobalValues
list is walked and materialized/linked. As a result, references
from DISubprogram and DIGlobalVariable metadata to yet unmaterialized
functions and variables cause them to be added to the lazy linking
list and their definitions are materialized and linked.

This makes the llvm-link -only-needed option not have the intended
effect when debug information is present, as the otherwise unneeded
functions/variables are still linked in.

Additionally, for ThinLTO I have implemented a mechanism to only link
in debug metadata needed by imported functions. Moving named metadata
linking after lazy GV linking will facilitate applying this mechanism
to the LTO and "llvm-link -only-needed" cases as well.

Reviewers: dexonsmith, tra, dblaikie

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D14195

Added:
    llvm/trunk/test/Linker/Inputs/only-needed-named-metadata.ll
    llvm/trunk/test/Linker/only-needed-named-metadata.ll
Modified:
    llvm/trunk/lib/Linker/LinkModules.cpp

Modified: llvm/trunk/lib/Linker/LinkModules.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=251926&r1=251925&r2=251926&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Tue Nov  3 09:11:27 2015
@@ -1940,15 +1940,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()) {
@@ -1975,6 +1966,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;
 }
 

Added: llvm/trunk/test/Linker/Inputs/only-needed-named-metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/only-needed-named-metadata.ll?rev=251926&view=auto
==============================================================================
--- llvm/trunk/test/Linker/Inputs/only-needed-named-metadata.ll (added)
+++ llvm/trunk/test/Linker/Inputs/only-needed-named-metadata.ll Tue Nov  3 09:11:27 2015
@@ -0,0 +1,9 @@
+ at X = external global i32
+
+declare i32 @foo()
+
+define void @bar() {
+	load i32, i32* @X
+	call i32 @foo()
+	ret void
+}

Added: llvm/trunk/test/Linker/only-needed-named-metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/only-needed-named-metadata.ll?rev=251926&view=auto
==============================================================================
--- llvm/trunk/test/Linker/only-needed-named-metadata.ll (added)
+++ llvm/trunk/test/Linker/only-needed-named-metadata.ll Tue Nov  3 09:11:27 2015
@@ -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()
+
+ at X = global i32 5
+ at 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}




More information about the llvm-commits mailing list