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
This commit is contained in:
Peter Collingbourne 2015-06-09 04:29:54 +00:00
parent d9e4e98cce
commit 73b75e3d0c
4 changed files with 41 additions and 0 deletions

View File

@ -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();
}

View File

@ -0,0 +1,3 @@
.globl __chkstk
__chkstk:
ret

View File

@ -0,0 +1,3 @@
.globl foo
foo:
ret

View File

@ -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]*)