[lld] [lld][WebAssembly] Use the archive offset with --whole-archive (PR #78791)

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 19 14:25:06 PST 2024


https://github.com/sbc100 updated https://github.com/llvm/llvm-project/pull/78791

>From 357f1e65358afb15b101907817e34da9c12a80c9 Mon Sep 17 00:00:00 2001
From: Sam Clegg <sbc at chromium.org>
Date: Fri, 19 Jan 2024 21:08:51 +0000
Subject: [PATCH] [lld][WebAssembly] Use the archive offset with
 --whole-archive

This essentially ports 0b1413a8 from the ELF linker.
---
 lld/test/wasm/lto/thin-archivecollision.ll | 34 ++++++++++++++++++++++
 lld/wasm/Driver.cpp                        | 11 +++----
 2 files changed, 40 insertions(+), 5 deletions(-)
 create mode 100644 lld/test/wasm/lto/thin-archivecollision.ll

diff --git a/lld/test/wasm/lto/thin-archivecollision.ll b/lld/test/wasm/lto/thin-archivecollision.ll
new file mode 100644
index 00000000000000..5b3a423de4020c
--- /dev/null
+++ b/lld/test/wasm/lto/thin-archivecollision.ll
@@ -0,0 +1,34 @@
+; Based on lld/test/ELF/lto/thin-archivecollision.ll
+
+; RUN: opt -module-summary %s -o %t.o
+; RUN: mkdir -p %t1 %t2
+; RUN: opt -module-summary %p/Inputs/thin1.ll -o %t1/t.coll.o
+; RUN: opt -module-summary %p/Inputs/thin2.ll -o %t2/t.coll.o
+
+; RUN: rm -f %t.a
+; RUN: llvm-ar rcs %t.a %t1/t.coll.o %t2/t.coll.o
+; RUN: wasm-ld %t.o %t.a -o %t
+; RUN: obj2yaml %t | FileCheck %s
+
+; Check we handle this case correctly even in presence of --whole-archive.
+; RUN: wasm-ld %t.o --whole-archive %t.a -o %t
+; RUN: obj2yaml %t | FileCheck %s
+
+; CHECK: Name:            _start
+; CHECK: Name:            foo
+; CHECK: Name:            blah
+
+target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+define i32 @_start() #0 {
+entry:
+  %call = call i32 @foo(i32 23)
+  %call1 = call i32 @blah(i32 37)
+  ret i32 0
+}
+
+declare i32 @foo(i32) #1
+declare i32 @blah(i32) #1
+
+attributes #0 = { noinline optnone }
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 716a2d9ebfe306..32c042b5695a4b 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -233,19 +233,20 @@ static void readImportFile(StringRef filename) {
 
 // Returns slices of MB by parsing MB as an archive file.
 // Each slice consists of a member file in the archive.
-std::vector<MemoryBufferRef> static getArchiveMembers(MemoryBufferRef mb) {
+std::vector<std::pair<MemoryBufferRef, uint64_t>> static getArchiveMembers(
+    MemoryBufferRef mb) {
   std::unique_ptr<Archive> file =
       CHECK(Archive::create(mb),
             mb.getBufferIdentifier() + ": failed to parse archive");
 
-  std::vector<MemoryBufferRef> v;
+  std::vector<std::pair<MemoryBufferRef, uint64_t>> v;
   Error err = Error::success();
   for (const Archive::Child &c : file->children(err)) {
     MemoryBufferRef mbref =
         CHECK(c.getMemoryBufferRef(),
               mb.getBufferIdentifier() +
                   ": could not get the buffer for a child of the archive");
-    v.push_back(mbref);
+    v.push_back(std::make_pair(mbref, c.getChildOffset()));
   }
   if (err)
     fatal(mb.getBufferIdentifier() +
@@ -273,8 +274,8 @@ void LinkerDriver::addFile(StringRef path) {
 
     // Handle -whole-archive.
     if (inWholeArchive) {
-      for (MemoryBufferRef &m : getArchiveMembers(mbref)) {
-        auto *object = createObjectFile(m, path);
+      for (const auto &[m, offset] : getArchiveMembers(mbref)) {
+        auto *object = createObjectFile(m, path, offset);
         // Mark object as live; object members are normally not
         // live by default but -whole-archive is designed to treat
         // them as such.



More information about the llvm-commits mailing list