[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