diff options
-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]*) |