mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 13:50:11 +00:00
[lld][WebAssembly] Use the archive offset with --whole-archive (#78791)
This essentially ports 0b1413a8
from the ELF linker.
This commit is contained in:
parent
f9bc1ee3fc
commit
39e024d9e2
34
lld/test/wasm/lto/thin-archivecollision.ll
Normal file
34
lld/test/wasm/lto/thin-archivecollision.ll
Normal file
@ -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 }
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user