[lld] r239386 - COFF: Handle references from LTO object to lazy symbols correctly.

Peter Collingbourne peter at pcc.me.uk
Mon Jun 8 21:29:55 PDT 2015


Author: pcc
Date: Mon Jun  8 23:29:54 2015
New Revision: 239386

URL: http://llvm.org/viewvc/llvm-project?rev=239386&view=rev
Log:
COFF: Handle references from LTO object to lazy symbols correctly.

The code generator may create references to runtime library symbols such as
__chkstk which were not visible via LTOModule. Handle these cases by loading
the object file from the library, but abort if we end up having loaded any
bitcode objects.

Because loading the object file may have introduced new undefined references,
call reportRemainingUndefines again to detect and report them.

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

Added:
    lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s
    lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s
    lld/trunk/test/COFF/lto-chkstk.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=239386&r1=239385&r2=239386&view=diff
==============================================================================
--- lld/trunk/COFF/SymbolTable.cpp (original)
+++ lld/trunk/COFF/SymbolTable.cpp Mon Jun  8 23:29:54 2015
@@ -292,8 +292,26 @@ std::error_code SymbolTable::addCombined
       }
       Sym->Body = Body;
     }
+
+    // We may see new references to runtime library symbols such as __chkstk
+    // here. These symbols must be wholly defined in non-bitcode files.
+    if (auto *B = dyn_cast<Lazy>(Sym->Body)) {
+      size_t NumBitcodeFiles = BitcodeFiles.size();
+      if (auto EC = addMemberFile(B))
+        return EC;
+      if (BitcodeFiles.size() != NumBitcodeFiles) {
+        llvm::errs()
+            << "LTO: late loaded symbol created new bitcode reference: " << Name
+            << "\n";
+        return make_error_code(LLDError::BrokenFile);
+      }
+    }
   }
 
+  // New runtime library symbol references may have created undefined references.
+  if (reportRemainingUndefines())
+    return make_error_code(LLDError::BrokenFile);
+
   return std::error_code();
 }
 

Added: lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s?rev=239386&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s (added)
+++ lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s Mon Jun  8 23:29:54 2015
@@ -0,0 +1,3 @@
+.globl __chkstk
+__chkstk:
+ret

Added: lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s?rev=239386&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s (added)
+++ lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s Mon Jun  8 23:29:54 2015
@@ -0,0 +1,3 @@
+.globl foo
+foo:
+ret

Added: lld/trunk/test/COFF/lto-chkstk.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/lto-chkstk.ll?rev=239386&view=auto
==============================================================================
--- lld/trunk/test/COFF/lto-chkstk.ll (added)
+++ lld/trunk/test/COFF/lto-chkstk.ll Mon Jun  8 23:29:54 2015
@@ -0,0 +1,17 @@
+; RUN: llvm-as -o %t.obj %s
+; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/lto-chkstk-foo.obj %S/Inputs/lto-chkstk-foo.s
+; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/lto-chkstk-chkstk.obj %S/Inputs/lto-chkstk-chkstk.s
+; RUN: llvm-ar cru %t.lib %T/lto-chkstk-chkstk.obj
+; RUN: lld -flavor link2 /out:%t.exe /entry:main /subsystem:console %t.obj %T/lto-chkstk-foo.obj %t.lib
+
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc"
+
+define void @main() {
+entry:
+  %array4096 = alloca [4096 x i8]
+  call void @foo([4096 x i8]* %array4096)
+  ret void
+}
+
+declare void @foo([4096 x i8]*)





More information about the llvm-commits mailing list