[LLD] [COFF] Fix automatically importing data symbols from DLLs with LTO

This broke in 51dcb292cc, "[lld-link] diagnose undefined symbols
before LTO when possible" (very soon after the 9.0 branch, so
luckily the 9.0 release is unaffected).

The code for loading objects we believe might be needed for autoimport
(loadMinGWAutomaticImports()) does run before the new
reportUnresolvable() function, but it had a condition to only operate
on symbols from regular object files. This condition came from
resolveRemainingUndefines(), but as loadMinGWAutomaticImports() now
has to operate before the LTO, it has to operate on undefineds from
LTO objects as well.

Differential Revision: https://reviews.llvm.org/D70166
This commit is contained in:
Martin Storsjö 2019-11-13 09:40:30 +02:00
parent 597b77fb7f
commit 38bc9559ba
2 changed files with 28 additions and 2 deletions

View File

@ -227,8 +227,6 @@ void SymbolTable::loadMinGWAutomaticImports() {
auto *undef = dyn_cast<Undefined>(sym);
if (!undef)
continue;
if (!sym->isUsedInRegularObj)
continue;
if (undef->getWeakAlias())
continue;

View File

@ -0,0 +1,28 @@
; REQUIRES: x86
; RUN: echo -e ".global variable\n.global DllMainCRTStartup\n.text\nDllMainCRTStartup:\nret\n.data\nvariable:\n.long 42" > %t-lib.s
; RUN: llvm-mc -triple=x86_64-windows-gnu %t-lib.s -filetype=obj -o %t-lib.obj
; RUN: lld-link -out:%t-lib.dll -dll -entry:DllMainCRTStartup %t-lib.obj -lldmingw -implib:%t-lib.lib
; RUN: llvm-as -o %t.obj %s
; RUN: lld-link -lldmingw -out:%t.exe -entry:entry %t.obj %t-lib.lib
; RUN: llvm-readobj --coff-imports %t.exe | FileCheck -check-prefix=IMPORTS %s
; IMPORTS: Import {
; IMPORTS-NEXT: Name: autoimport-lto.ll.tmp-lib.dll
; IMPORTS-NEXT: ImportLookupTableRVA:
; IMPORTS-NEXT: ImportAddressTableRVA:
; IMPORTS-NEXT: Symbol: variable (0)
; IMPORTS-NEXT: }
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-w64-windows-gnu"
@variable = external global i32
define i32 @entry() {
entry:
%0 = load i32, i32* @variable
ret i32 %0
}