From: Rui Ueyama Date: Tue, 10 Sep 2019 11:50:26 +0000 (+0000) Subject: [LLD][COFF] Add index to disambiguate archive members when using -wholearchive X-Git-Tag: llvmorg-11-init~9573 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=89efb03463eecc021e8613b79c43ea8ab135ca49;p=platform%2Fupstream%2Fllvm.git [LLD][COFF] Add index to disambiguate archive members when using -wholearchive Patch by Markus Böck. PR42951: When linking an archive with members that have the same name linking fails when using the -wholearchive option. This patch passes the index of the member in the archive to the offset parameter to disambiguate the member. Differential Revision: https://reviews.llvm.org/D66239 llvm-svn: 371509 --- diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 6e27edb..aaf0367 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -188,8 +188,9 @@ void LinkerDriver::addBuffer(std::unique_ptr mb, Archive *archive = file.get(); make>(std::move(file)); // take ownership + int memberIndex = 0; for (MemoryBufferRef m : getArchiveMembers(archive)) - addArchiveBuffer(m, "", filename, 0); + addArchiveBuffer(m, "", filename, memberIndex++); return; } symtab->addFile(make(mbref)); diff --git a/lld/test/COFF/thinlto-whole-archives.ll b/lld/test/COFF/thinlto-whole-archives.ll new file mode 100644 index 0000000..4ee9574 --- /dev/null +++ b/lld/test/COFF/thinlto-whole-archives.ll @@ -0,0 +1,30 @@ +; REQUIRES: x86 +; RUN: rm -fr %T/thinlto-whole-archives +; RUN: mkdir %T/thinlto-whole-archives %T/thinlto-whole-archives/a %T/thinlto-whole-archives/b +; RUN: opt -thinlto-bc -o %T/thinlto-whole-archives/main.obj %s +; RUN: opt -thinlto-bc -o %T/thinlto-whole-archives/a/bar.obj %S/Inputs/lto-dep.ll +; RUN: opt -thinlto-bc -o %T/thinlto-whole-archives/b/bar.obj %S/Inputs/bar.ll +; RUN: llvm-ar crs %T/thinlto-whole-archives/a.lib %T/thinlto-whole-archives/a/bar.obj %T/thinlto-whole-archives/b/bar.obj +; RUN: lld-link -out:%T/thinlto-whole-archives/main.exe -entry:main \ +; RUN: -wholearchive -lldsavetemps -subsystem:console %T/thinlto-whole-archives/main.obj \ +; RUN: %T/thinlto-whole-archives/a.lib +; RUN: FileCheck %s < %T/thinlto-whole-archives/main.exe.resolution.txt + +; CHECK: {{[/\\]thinlto-whole-archives[/\\]main.obj$}} +; CHECK: {{^-r=.*[/\\]thinlto-whole-archives[/\\]main.obj,main,px$}} +; CHECK: {{[/\\]thinlto-whole-archives[/\\]a.libbar.obj[0-9]+$}} +; CHECK-NEXT: {{^-r=.*[/\\]thinlto-whole-archives[/\\]a.libbar.obj[0-9]+,foo,p$}} +; CHECK-NEXT: {{[/\\]thinlto-whole-archives[/\\]a.libbar.obj[0-9]+$}} +; CHECK-NEXT: {{^-r=.*[/\\]thinlto-whole-archives[/\\]a.libbar.obj[0-9]+,bar,p$}} + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +declare void @bar() +declare void @foo() + +define i32 @main() { + call void @foo() + call void @bar() + ret i32 0 +}