[lld] 90af55d - [LLD][ELF] Use offset in thin archives to disambiguate thinLTO members

Hongtao Yu via llvm-commits llvm-commits at lists.llvm.org
Fri May 15 12:02:55 PDT 2020


Author: Hongtao Yu
Date: 2020-05-15T12:02:08-07:00
New Revision: 90af55d8a972b268d1b30feec8fb407ca856e110

URL: https://github.com/llvm/llvm-project/commit/90af55d8a972b268d1b30feec8fb407ca856e110
DIFF: https://github.com/llvm/llvm-project/commit/90af55d8a972b268d1b30feec8fb407ca856e110.diff

LOG: [LLD][ELF] Use offset in thin archives to disambiguate thinLTO members

This is fixing a thinLTO module collision issue for thin archives. The problem is that we always use a zero offset to name members in a thin archive and that causes the following build error:

    ld.lld: error: Expected at most one ThinLTO module per bitcode file

which happens to a thin archive that has two members with the same object file name (whose paths will be ignored by thinLTO driver)

The fix here is to use real member offset instead as is done for non-thin archives.

Differential Revision: https://reviews.llvm.org/D79880

Added: 
    lld/test/ELF/lto/thinlto-thin-archive-collision.ll

Modified: 
    lld/ELF/InputFiles.cpp
    lld/test/ELF/lto/thinlto.ll

Removed: 
    


################################################################################
diff  --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 7facee3e5b08..7a165e28cdc4 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1162,8 +1162,7 @@ void ArchiveFile::fetch(const Archive::Symbol &sym) {
   if (tar && c.getParent()->isThin())
     tar->append(relativeToRoot(CHECK(c.getFullName(), this)), mb.getBuffer());
 
-  InputFile *file = createObjectFile(
-      mb, getName(), c.getParent()->isThin() ? 0 : c.getChildOffset());
+  InputFile *file = createObjectFile(mb, getName(), c.getChildOffset());
   file->groupId = groupId;
   parseFile(file);
 }

diff  --git a/lld/test/ELF/lto/thinlto-thin-archive-collision.ll b/lld/test/ELF/lto/thinlto-thin-archive-collision.ll
new file mode 100644
index 000000000000..1a175f29d369
--- /dev/null
+++ b/lld/test/ELF/lto/thinlto-thin-archive-collision.ll
@@ -0,0 +1,27 @@
+; REQUIRES: x86
+; RUN: rm -fr %t && mkdir %t && cd %t
+; RUN: mkdir thinlto-archives thinlto-archives/a thinlto-archives/b
+; RUN: opt -thinlto-bc -o thinlto-archives/main.o %s
+; RUN: opt -thinlto-bc -o thinlto-archives/a/thin.o %S/Inputs/thin1.ll
+; RUN: opt -thinlto-bc -o thinlto-archives/b/thin.o %S/Inputs/thin2.ll
+; RUN: llvm-ar qcT thinlto-archives/thin.a thinlto-archives/a/thin.o thinlto-archives/b/thin.o
+; RUN: ld.lld thinlto-archives/main.o thinlto-archives/thin.a -o thinlto-archives/main.exe --save-temps
+; RUN: FileCheck %s < thinlto-archives/main.exe.resolution.txt
+
+; CHECK: thinlto-archives/main.o
+; CHECK: thinlto-archives/thin.a(thin.o at {{[1-9][0-9]+}})
+; CHECK-NEXT: -r=thinlto-archives/thin.a(thin.o at {{[1-9][0-9]+}}),foo,pl
+; CHECK: thinlto-archives/thin.a(thin.o at {{[1-9][0-9]+}})
+; CHECK-NEXT: -r=thinlto-archives/thin.a(thin.o at {{[1-9][0-9]+}}),blah,pl
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-scei-ps4"
+
+declare i32 @blah(i32 %meh)
+declare i32 @foo(i32 %goo)
+
+define i32 @_start() {
+  call i32 @foo(i32 0)
+  call i32 @blah(i32 0)
+  ret i32 0
+}

diff  --git a/lld/test/ELF/lto/thinlto.ll b/lld/test/ELF/lto/thinlto.ll
index 918f6ffd4c65..5d5df641566b 100644
--- a/lld/test/ELF/lto/thinlto.ll
+++ b/lld/test/ELF/lto/thinlto.ll
@@ -62,7 +62,7 @@
 ; RUN: cp %t2.o %t.dir/t.o
 ; RUN: llvm-ar rcsT %t.dir/t.a %t.dir/t.o
 ; RUN: ld.lld -save-temps %t1.o %t.dir/t.a -o %t.null
-; RUN: ls '%t.dir/t.a(t.o at 0).0.preopt.bc'
+; RUN: ls %t.dir/t.a*.0.preopt.bc
 
 ; NM1: T f
 ; NM2: T g


        


More information about the llvm-commits mailing list