forked from OSchip/llvm-project
LTO: Don't follow lazy references when seeing new definitions in the combined LTO object
Following the lazy reference might bring in an object file that depends on bitcode files that weren't part of the LTO step. Differential Revision: https://reviews.llvm.org/D25461 llvm-svn: 283989
This commit is contained in:
parent
829c0eab91
commit
cb8f2ef644
|
@ -347,11 +347,13 @@ void SymbolTable::addCombinedLTOObject(ObjectFile *Obj) {
|
|||
Sym->Body = Body;
|
||||
continue;
|
||||
}
|
||||
if (auto *L = dyn_cast<Lazy>(Existing)) {
|
||||
// We may see new references to runtime library symbols such as __chkstk
|
||||
// here. These symbols must be wholly defined in non-bitcode files.
|
||||
addMemberFile(L);
|
||||
continue;
|
||||
if (isa<Undefined>(Body)) {
|
||||
if (auto *L = dyn_cast<Lazy>(Existing)) {
|
||||
// We may see new references to runtime library symbols such as __chkstk
|
||||
// here. These symbols must be wholly defined in non-bitcode files.
|
||||
addMemberFile(L);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
int Comp = Existing->compare(Body);
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
||||
target triple = "i686-pc-windows-msvc18.0.0"
|
||||
|
||||
define void @dummy() {
|
||||
ret void
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
||||
target triple = "i686-pc-windows-msvc18.0.0"
|
||||
|
||||
define double @quadruple(double %x) {
|
||||
entry:
|
||||
; The symbol __real@40800000 is used to materialize the 4.0 constant.
|
||||
%mul = fmul double %x, 4.0
|
||||
ret double %mul
|
||||
}
|
||||
|
||||
|
||||
declare void @dummy()
|
||||
define void @f() {
|
||||
call void @dummy()
|
||||
ret void
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
; RUN: llc -mtriple=i686-pc-windows-msvc -filetype=obj -o %T/lto-lazy-reference-quadruple.obj %S/Inputs/lto-lazy-reference-quadruple.ll
|
||||
; RUN: llvm-as -o %T/lto-lazy-reference-dummy.bc %S/Inputs/lto-lazy-reference-dummy.ll
|
||||
; RUN: rm -f %t.lib
|
||||
; RUN: llvm-ar cru %t.lib %T/lto-lazy-reference-quadruple.obj %T/lto-lazy-reference-dummy.bc
|
||||
; RUN: llvm-as -o %t.obj %s
|
||||
; RUN: lld-link /out:%t.exe /entry:main /subsystem:console %t.obj %t.lib
|
||||
|
||||
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
||||
target triple = "i686-pc-windows-msvc18.0.0"
|
||||
|
||||
define double @main(double %x) {
|
||||
entry:
|
||||
; When compiled, this defines the __real@40800000 symbol, which already has a
|
||||
; lazy definition in the lib file from lto-lazy-reference-quadruple.obj. This
|
||||
; test makes sure we *don't* try to take the definition from the lazy
|
||||
; reference, because that can bring in new references to bitcode files after
|
||||
; LTO, such as lto-lazy-reference-dummy.bc in this case.
|
||||
%mul = fmul double %x, 4.0
|
||||
|
||||
ret double %mul
|
||||
}
|
Loading…
Reference in New Issue