diff --git a/lld/test/wasm/Inputs/ctor-ctor.s b/lld/test/wasm/Inputs/ctor-ctor.s deleted file mode 100644 --- a/lld/test/wasm/Inputs/ctor-ctor.s +++ /dev/null @@ -1,15 +0,0 @@ - .section .text.def,"",@ - .globl def -def: - .functype def () -> () - end_function - - .section .text.test_ctor,"",@ - .globl test_ctor -test_ctor: - .functype test_ctor () -> () - end_function - - .section .init_array,"",@ - .p2align 2 - .int32 test_ctor diff --git a/lld/test/wasm/Inputs/ctor-lib.s b/lld/test/wasm/Inputs/ctor-lib.s deleted file mode 100644 --- a/lld/test/wasm/Inputs/ctor-lib.s +++ /dev/null @@ -1,14 +0,0 @@ - .section .text.lib_func,"",@ - .globl lib_func -lib_func: - .functype lib_func () -> () - end_function - - .section .text.unused_lib_func,"",@ - .globl unused_lib_func -unused_lib_func: - .functype unused_lib_func () -> () - call def - end_function - - .functype def () -> () diff --git a/lld/test/wasm/Inputs/ctor-setup-call-def.s b/lld/test/wasm/Inputs/ctor-setup-call-def.s deleted file mode 100644 --- a/lld/test/wasm/Inputs/ctor-setup-call-def.s +++ /dev/null @@ -1,21 +0,0 @@ -# Like Inputs/ctor-setup.s, except it calls `def` instead of `lib_func`, -# so it pulls in the .o file containing `ctor`. - - .section .text._start,"",@ - .globl _start -_start: - .functype _start () -> () - end_function - - .section .text.setup,"",@ - .globl setup -setup: - .functype setup () -> () - call def - end_function - - .section .init_array,"",@ - .p2align 2 - .int32 setup - -.functype def () -> () diff --git a/lld/test/wasm/Inputs/ctor-setup.s b/lld/test/wasm/Inputs/ctor-setup.s deleted file mode 100644 --- a/lld/test/wasm/Inputs/ctor-setup.s +++ /dev/null @@ -1,19 +0,0 @@ -# Like Inputs/ctor-start.s, except it calls `lib_func` from a ctor -# instead of from `_start`. - - .globl _start -_start: - .functype _start () -> () - end_function - - .globl setup -setup: - .functype setup () -> () - call lib_func - end_function - - .section .init_array,"",@ - .p2align 2 - .int32 setup - - .functype lib_func () -> () diff --git a/lld/test/wasm/Inputs/ctor-start.s b/lld/test/wasm/Inputs/ctor-start.s deleted file mode 100644 --- a/lld/test/wasm/Inputs/ctor-start.s +++ /dev/null @@ -1,7 +0,0 @@ - .globl _start -_start: - .functype _start () -> () - call lib_func - end_function - - .functype lib_func () -> () diff --git a/lld/test/wasm/ctor-gc-setup.test b/lld/test/wasm/ctor-gc-setup.test deleted file mode 100644 --- a/lld/test/wasm/ctor-gc-setup.test +++ /dev/null @@ -1,12 +0,0 @@ -; Like ctor-gc.test, but main object calls a function from its constructor, -; which shouldn't matter; `ctor` shouldn't be pulled in. -; -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-ctor.s -o %t.ctor.o -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-lib.s -o %t.lib.o -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-setup.s -o %t.setup.o -; RUN: rm -f %t.lib.a -; RUN: llvm-ar rcs %t.lib.a %t.lib.o %t.ctor.o -; RUN: wasm-ld %t.setup.o %t.lib.a -o %t.wasm -; RUN: obj2yaml %t.wasm | FileCheck %s - -; CHECK-NOT: Name: test_ctor diff --git a/lld/test/wasm/ctor-gc.test b/lld/test/wasm/ctor-gc.test deleted file mode 100644 --- a/lld/test/wasm/ctor-gc.test +++ /dev/null @@ -1,16 +0,0 @@ -; Verify that constructors from a .o file which it initially depends on but -; doesn't ultimately contribute to the final link are not included. -; -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-ctor.s -o %t.ctor.o -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-lib.s -o %t.lib.o -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-start.s -o %t.start.o -; 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/test/wasm/ctor-no-gc.test b/lld/test/wasm/ctor-no-gc.test deleted file mode 100644 --- a/lld/test/wasm/ctor-no-gc.test +++ /dev/null @@ -1,12 +0,0 @@ -; Like ctor-gc-setup.test, but it calls a different function, so it does pull -; in the object containing `ctor`, so `ctor` is linked in. -; -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-ctor.s -o %t.ctor.o -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-lib.s -o %t.lib.o -; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ctor-setup-call-def.s -o %t.setup-call-def.o -; RUN: rm -f %t.lib.a -; RUN: llvm-ar rcs %t.lib.a %t.lib.o %t.ctor.o -; RUN: wasm-ld %t.setup-call-def.o %t.lib.a -o %t.wasm -; RUN: obj2yaml %t.wasm | FileCheck %s - -; CHECK: Name: test_ctor diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -253,15 +253,8 @@ // Handle -whole-archive. if (inWholeArchive) { - 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); - } - + for (MemoryBufferRef &m : getArchiveMembers(mbref)) + files.push_back(createObjectFile(m, path)); return; } diff --git a/lld/wasm/InputFiles.h b/lld/wasm/InputFiles.h --- a/lld/wasm/InputFiles.h +++ b/lld/wasm/InputFiles.h @@ -61,14 +61,8 @@ MutableArrayRef getMutableSymbols() { return symbols; } - // An InputFile is considered live if any of the symbols defined by it - // are live. - void markLive() { live = true; } - bool isLive() const { return live; } - protected: - InputFile(Kind k, MemoryBufferRef m) - : mb(m), fileKind(k), live(!config->gcSections) {} + InputFile(Kind k, MemoryBufferRef m) : mb(m), fileKind(k) {} void checkArch(llvm::Triple::ArchType arch) const; @@ -79,7 +73,6 @@ private: const Kind fileKind; - bool live; }; // .a file (ar archive) @@ -103,10 +96,6 @@ explicit ObjFile(MemoryBufferRef m, StringRef archiveName) : InputFile(ObjectKind, m) { this->archiveName = std::string(archiveName); - - // If this isn't part of an archive, it's eagerly linked, so mark it live. - if (archiveName.empty()) - markLive(); } static bool classof(const InputFile *f) { return f->kind() == ObjectKind; } @@ -171,10 +160,6 @@ explicit BitcodeFile(MemoryBufferRef m, StringRef archiveName) : InputFile(BitcodeKind, m) { this->archiveName = std::string(archiveName); - - // If this isn't part of an archive, it's eagerly linked, so mark it live. - if (archiveName.empty()) - markLive(); } static bool classof(const InputFile *f) { return f->kind() == BitcodeKind; } diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -72,7 +72,8 @@ 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 = diff --git a/lld/wasm/MarkLive.cpp b/lld/wasm/MarkLive.cpp --- a/lld/wasm/MarkLive.cpp +++ b/lld/wasm/MarkLive.cpp @@ -42,7 +42,6 @@ private: void enqueue(Symbol *sym); - void enqueueInitFunctions(const ObjFile *sym); void mark(); bool isCallCtorsLive(); @@ -56,35 +55,11 @@ if (!sym || sym->isLive()) return; LLVM_DEBUG(dbgs() << "markLive: " << sym->getName() << "\n"); - - InputFile *file = sym->getFile(); - bool needInitFunctions = file && !file->isLive() && sym->isDefined(); - sym->markLive(); - - // Mark ctor functions in the object that defines this symbol live. - // The ctor functions are all referenced by the synthetic callCtors - // function. However, this function does not contain relocations so we - // have to manually mark the ctors as live. - if (needInitFunctions) - enqueueInitFunctions(cast(file)); - if (InputChunk *chunk = sym->getChunk()) queue.push_back(chunk); } -// The ctor functions are all referenced by the synthetic callCtors -// function. However, this function does not contain relocations so we -// have to manually mark the ctors as live. -void MarkLive::enqueueInitFunctions(const ObjFile *obj) { - const WasmLinkingData &l = obj->getWasmObj()->linkingData(); - for (const WasmInitFunc &f : l.InitFunctions) { - auto *initSym = obj->getFunctionSymbol(f.Symbol); - if (!initSym->isDiscarded()) - enqueue(initSym); - } -} - void MarkLive::run() { // Add GC root symbols. if (!config->entry.empty()) @@ -98,17 +73,10 @@ if (WasmSym::callDtors) enqueue(WasmSym::callDtors); - // Enqueue constructors in objects explicitly live from the command-line. - for (const ObjFile *obj : symtab->objectFiles) - if (obj->isLive()) - enqueueInitFunctions(obj); + if (WasmSym::initMemory) + enqueue(WasmSym::initMemory); mark(); - - // If we have any non-discarded init functions, mark `__wasm_call_ctors` as - // live so that we assign it an index and call it. - if (isCallCtorsLive()) - WasmSym::callCtors->markLive(); } void MarkLive::mark() { @@ -190,11 +158,9 @@ // it can call them. for (const ObjFile *file : symtab->objectFiles) { const WasmLinkingData &l = file->getWasmObj()->linkingData(); - for (const WasmInitFunc &f : l.InitFunctions) { - auto *sym = file->getFunctionSymbol(f.Symbol); - if (!sym->isDiscarded() && sym->isLive()) + for (const WasmInitFunc &f : l.InitFunctions) + if (!file->getFunctionSymbol(f.Symbol)->isDiscarded()) return true; - } } return false; diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp --- a/lld/wasm/Symbols.cpp +++ b/lld/wasm/Symbols.cpp @@ -137,8 +137,6 @@ void Symbol::markLive() { assert(!isDiscarded()); - if (file != NULL) - file->markLive(); if (auto *g = dyn_cast(this)) g->global->live = true; if (auto *e = dyn_cast(this)) diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -1262,8 +1262,9 @@ for (const WasmInitFunc &f : l.InitFunctions) { FunctionSymbol *sym = file->getFunctionSymbol(f.Symbol); // comdat exclusions can cause init functions be discarded. - if (sym->isDiscarded() || !sym->isLive()) + if (sym->isDiscarded()) continue; + assert(sym->isLive()); if (sym->signature->Params.size() != 0) error("constructor functions cannot take arguments: " + toString(*sym)); LLVM_DEBUG(dbgs() << "initFunctions: " << toString(*sym) << "\n");