[PATCH] D79880: [LLD][ELF] Use offset in thin-archive to disambiguate thinLTO members

Hongtao Yu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 13 09:44:34 PDT 2020


hoyFB created this revision.
Herald added subscribers: llvm-commits, dexonsmith, steven_wu, MaskRay, hiraditya, arichardson, inglorion, emaste.
Herald added a reviewer: espindola.
Herald added a reviewer: MaskRay.
Herald added a project: LLVM.
hoyFB edited the summary of this revision.
hoyFB added reviewers: ruiu, wenlei.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79880

Files:
  lld/ELF/InputFiles.cpp
  lld/test/ELF/lto/thinlto-thinarchivecollision.ll
  lld/test/ELF/lto/thinlto.ll


Index: lld/test/ELF/lto/thinlto.ll
===================================================================
--- lld/test/ELF/lto/thinlto.ll
+++ 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\(t.o\ at\ *\).0.preopt.bc
 
 ; NM1: T f
 ; NM2: T g
Index: lld/test/ELF/lto/thinlto-thinarchivecollision.ll
===================================================================
--- /dev/null
+++ lld/test/ELF/lto/thinlto-thinarchivecollision.ll
@@ -0,0 +1,27 @@
+; REQUIRES: x86
+; RUN: rm -fr %T/thinlto-archives
+; RUN: mkdir %T/thinlto-archives %T/thinlto-archives/a %T/thinlto-archives/b
+; RUN: opt -thinlto-bc -o %T/thinlto-archives/main.o %s
+; RUN: opt -thinlto-bc -o %T/thinlto-archives/a/thin.o %S/Inputs/thin1.ll
+; RUN: opt -thinlto-bc -o %T/thinlto-archives/b/thin.o %S/Inputs/thin2.ll
+; RUN: llvm-ar qcT %T/thinlto-archives/thin.a %T/thinlto-archives/a/thin.o %T/thinlto-archives/b/thin.o
+; RUN: ld.lld --entry=main %T/thinlto-archives/main.o %T/thinlto-archives/thin.a -o %T/thinlto-archives/main.exe -save-temps
+; RUN: FileCheck %s < %T/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 @main() {
+  call i32 @foo(i32 0)
+  call i32 @blah(i32 0)
+  ret i32 0
+}
\ No newline at end of file
Index: lld/ELF/InputFiles.cpp
===================================================================
--- lld/ELF/InputFiles.cpp
+++ lld/ELF/InputFiles.cpp
@@ -1161,8 +1161,7 @@
   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);
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79880.263755.patch
Type: text/x-patch
Size: 2490 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200513/b41510bd/attachment.bin>


More information about the llvm-commits mailing list