Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions lld/test/wasm/lto/thin-archivecollision.ll
Original file line number Diff line number Diff line change
@@ -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 }
11 changes: 6 additions & 5 deletions lld/wasm/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() +
Expand Down Expand Up @@ -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.
Expand Down