forked from OSchip/llvm-project
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:
parent
d9e4e98cce
commit
73b75e3d0c
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
.globl __chkstk
|
||||
__chkstk:
|
||||
ret
|
|
@ -0,0 +1,3 @@
|
|||
.globl foo
|
||||
foo:
|
||||
ret
|
|
@ -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]*)
|
Loading…
Reference in New Issue