diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2015-06-09 04:29:54 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2015-06-09 04:29:54 +0000 |
commit | 73b75e3d0cdada5b7a9ed097ee9a912d8bd13dcc (patch) | |
tree | 7923d128168a33617d812238335e0eacb3a2a6e0 | |
parent | d9e4e98cceef2a47da2c1cc53f66af2b1e8cbbfb (diff) | |
download | bcm5719-llvm-73b75e3d0cdada5b7a9ed097ee9a912d8bd13dcc.tar.gz bcm5719-llvm-73b75e3d0cdada5b7a9ed097ee9a912d8bd13dcc.zip |
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
llvm-svn: 239386
-rw-r--r-- | lld/COFF/SymbolTable.cpp | 18 | ||||
-rw-r--r-- | lld/test/COFF/Inputs/lto-chkstk-chkstk.s | 3 | ||||
-rw-r--r-- | lld/test/COFF/Inputs/lto-chkstk-foo.s | 3 | ||||
-rw-r--r-- | lld/test/COFF/lto-chkstk.ll | 17 |
4 files changed, 41 insertions, 0 deletions
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 55721f78528..8d6754e6e35 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -292,8 +292,26 @@ std::error_code SymbolTable::addCombinedLTOObject() { } 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(); } diff --git a/lld/test/COFF/Inputs/lto-chkstk-chkstk.s b/lld/test/COFF/Inputs/lto-chkstk-chkstk.s new file mode 100644 index 00000000000..292b30d5ffa --- /dev/null +++ b/lld/test/COFF/Inputs/lto-chkstk-chkstk.s @@ -0,0 +1,3 @@ +.globl __chkstk +__chkstk: +ret diff --git a/lld/test/COFF/Inputs/lto-chkstk-foo.s b/lld/test/COFF/Inputs/lto-chkstk-foo.s new file mode 100644 index 00000000000..a69f870a1b6 --- /dev/null +++ b/lld/test/COFF/Inputs/lto-chkstk-foo.s @@ -0,0 +1,3 @@ +.globl foo +foo: +ret diff --git a/lld/test/COFF/lto-chkstk.ll b/lld/test/COFF/lto-chkstk.ll new file mode 100644 index 00000000000..7fa3742c0dd --- /dev/null +++ b/lld/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]*) |