diff options
author | Sam Clegg <sbc@chromium.org> | 2024-01-19 14:42:03 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-19 14:42:03 -0800 |
commit | 39e024d9e2ec00de00d6815596572579e4c03beb (patch) | |
tree | c60a0ce5a8ac698a2421713561008a7ea20032f6 | |
parent | f9bc1ee3fcf913df7e3f0684a8f3b98dc55dff73 (diff) | |
download | llvm-39e024d9e2ec00de00d6815596572579e4c03beb.zip llvm-39e024d9e2ec00de00d6815596572579e4c03beb.tar.gz llvm-39e024d9e2ec00de00d6815596572579e4c03beb.tar.bz2 |
[lld][WebAssembly] Use the archive offset with --whole-archive (#78791)
This essentially ports 0b1413a8 from the ELF linker.
-rw-r--r-- | lld/test/wasm/lto/thin-archivecollision.ll | 34 | ||||
-rw-r--r-- | lld/wasm/Driver.cpp | 11 |
2 files changed, 40 insertions, 5 deletions
diff --git a/lld/test/wasm/lto/thin-archivecollision.ll b/lld/test/wasm/lto/thin-archivecollision.ll new file mode 100644 index 0000000..5b3a423 --- /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 716a2d9..32c042b 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. |