[PATCH] COFF: Handle references from LTO object to lazy symbols correctly.

Peter Collingbourne peter at pcc.me.uk
Mon Jun 8 21:34:14 PDT 2015


REPOSITORY
  rL LLVM

http://reviews.llvm.org/D10332

Files:
  lld/trunk/COFF/SymbolTable.cpp
  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

Index: lld/trunk/test/COFF/lto-chkstk.ll
===================================================================
--- lld/trunk/test/COFF/lto-chkstk.ll
+++ lld/trunk/test/COFF/lto-chkstk.ll
@@ -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]*)
Index: lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s
===================================================================
--- lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s
+++ lld/trunk/test/COFF/Inputs/lto-chkstk-foo.s
@@ -0,0 +1,3 @@
+.globl foo
+foo:
+ret
Index: lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s
===================================================================
--- lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s
+++ lld/trunk/test/COFF/Inputs/lto-chkstk-chkstk.s
@@ -0,0 +1,3 @@
+.globl __chkstk
+__chkstk:
+ret
Index: lld/trunk/COFF/SymbolTable.cpp
===================================================================
--- lld/trunk/COFF/SymbolTable.cpp
+++ lld/trunk/COFF/SymbolTable.cpp
@@ -292,8 +292,26 @@
       }
       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();
 }

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10332.27361.patch
Type: text/x-patch
Size: 2426 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150609/62f9c58d/attachment.bin>


More information about the llvm-commits mailing list