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:
Hans Wennborg 2016-10-12 09:00:06 +00:00
parent 829c0eab91
commit cb8f2ef644
4 changed files with 50 additions and 5 deletions

View File

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

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}