[lld] r283989 - LTO: Don't follow lazy references when seeing new definitions in the combined LTO object

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 12 02:00:07 PDT 2016


Author: hans
Date: Wed Oct 12 04:00:06 2016
New Revision: 283989

URL: http://llvm.org/viewvc/llvm-project?rev=283989&view=rev
Log:
LTO: Don't follow lazy references when seeing new definitions in the combined LTO object

Following the lazy reference might bring in an object file that depends
on bitcode files that weren't part of the LTO step.

Differential Revision: https://reviews.llvm.org/D25461

Added:
    lld/trunk/test/COFF/Inputs/lto-lazy-reference-dummy.ll
    lld/trunk/test/COFF/Inputs/lto-lazy-reference-quadruple.ll
    lld/trunk/test/COFF/lto-lazy-reference.ll
Modified:
    lld/trunk/COFF/SymbolTable.cpp

Modified: lld/trunk/COFF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=283989&r1=283988&r2=283989&view=diff
==============================================================================
--- lld/trunk/COFF/SymbolTable.cpp (original)
+++ lld/trunk/COFF/SymbolTable.cpp Wed Oct 12 04:00:06 2016
@@ -347,11 +347,13 @@ void SymbolTable::addCombinedLTOObject(O
       Sym->Body = Body;
       continue;
     }
-    if (auto *L = dyn_cast<Lazy>(Existing)) {
-      // We may see new references to runtime library symbols such as __chkstk
-      // here. These symbols must be wholly defined in non-bitcode files.
-      addMemberFile(L);
-      continue;
+    if (isa<Undefined>(Body)) {
+      if (auto *L = dyn_cast<Lazy>(Existing)) {
+        // We may see new references to runtime library symbols such as __chkstk
+        // here. These symbols must be wholly defined in non-bitcode files.
+        addMemberFile(L);
+        continue;
+      }
     }
 
     int Comp = Existing->compare(Body);

Added: lld/trunk/test/COFF/Inputs/lto-lazy-reference-dummy.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/lto-lazy-reference-dummy.ll?rev=283989&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/lto-lazy-reference-dummy.ll (added)
+++ lld/trunk/test/COFF/Inputs/lto-lazy-reference-dummy.ll Wed Oct 12 04:00:06 2016
@@ -0,0 +1,6 @@
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i686-pc-windows-msvc18.0.0"
+
+define void @dummy() {
+  ret void
+}

Added: lld/trunk/test/COFF/Inputs/lto-lazy-reference-quadruple.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/lto-lazy-reference-quadruple.ll?rev=283989&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/lto-lazy-reference-quadruple.ll (added)
+++ lld/trunk/test/COFF/Inputs/lto-lazy-reference-quadruple.ll Wed Oct 12 04:00:06 2016
@@ -0,0 +1,16 @@
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i686-pc-windows-msvc18.0.0"
+
+define double @quadruple(double %x) {
+entry:
+  ; The symbol __real at 40800000 is used to materialize the 4.0 constant.
+  %mul = fmul double %x, 4.0
+  ret double %mul
+}
+
+
+declare void @dummy()
+define void @f() {
+  call void @dummy()
+  ret void
+}

Added: lld/trunk/test/COFF/lto-lazy-reference.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/lto-lazy-reference.ll?rev=283989&view=auto
==============================================================================
--- lld/trunk/test/COFF/lto-lazy-reference.ll (added)
+++ lld/trunk/test/COFF/lto-lazy-reference.ll Wed Oct 12 04:00:06 2016
@@ -0,0 +1,21 @@
+; RUN: llc -mtriple=i686-pc-windows-msvc -filetype=obj -o %T/lto-lazy-reference-quadruple.obj %S/Inputs/lto-lazy-reference-quadruple.ll
+; RUN: llvm-as -o %T/lto-lazy-reference-dummy.bc %S/Inputs/lto-lazy-reference-dummy.ll
+; RUN: rm -f %t.lib
+; RUN: llvm-ar cru %t.lib %T/lto-lazy-reference-quadruple.obj %T/lto-lazy-reference-dummy.bc
+; RUN: llvm-as -o %t.obj %s
+; RUN: lld-link /out:%t.exe /entry:main /subsystem:console %t.obj %t.lib
+
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i686-pc-windows-msvc18.0.0"
+
+define double @main(double %x) {
+entry:
+  ; When compiled, this defines the __real at 40800000 symbol, which already has a
+  ; lazy definition in the lib file from  lto-lazy-reference-quadruple.obj. This
+  ; test makes sure we *don't* try to take the definition from the lazy
+  ; reference, because that can bring in new references to bitcode files after
+  ; LTO, such as lto-lazy-reference-dummy.bc in this case.
+  %mul = fmul double %x, 4.0
+
+  ret double %mul
+}




More information about the llvm-commits mailing list