diff --git a/lld/test/wasm/ctor-gc.test b/lld/test/wasm/ctor-gc.test --- a/lld/test/wasm/ctor-gc.test +++ b/lld/test/wasm/ctor-gc.test @@ -7,6 +7,10 @@ ; RUN: rm -f %t.lib.a ; RUN: llvm-ar rcs %t.lib.a %t.lib.o %t.ctor.o ; RUN: wasm-ld %t.start.o %t.lib.a -o %t.wasm +; RUN: wasm-ld %t.start.o --whole-archive %t.lib.a -o %t2.wasm ; RUN: obj2yaml %t.wasm | FileCheck %s +; RUN: obj2yaml %t2.wasm | FileCheck %s -check-prefix=WHOLEARCHIVE ; CHECK-NOT: __wasm_call_ctors + +; WHOLEARCHIVE: __wasm_call_ctors diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -252,8 +252,15 @@ // Handle -whole-archive. if (inWholeArchive) { - for (MemoryBufferRef &m : getArchiveMembers(mbref)) - files.push_back(createObjectFile(m, path)); + for (MemoryBufferRef &m : getArchiveMembers(mbref)) { + auto *object = createObjectFile(m, path); + // Mark object as live; object members are normally not + // live by default but -whole-archive is designed to treat + // them as such. + object->markLive(); + files.push_back(object); + } + return; } diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -59,8 +59,7 @@ return mbref; } -InputFile *createObjectFile(MemoryBufferRef mb, - StringRef archiveName) { +InputFile *createObjectFile(MemoryBufferRef mb, StringRef archiveName) { file_magic magic = identify_magic(mb.getBuffer()); if (magic == file_magic::wasm_object) { std::unique_ptr bin =