Index: lld/trunk/test/wasm/archive-export.ll =================================================================== --- lld/trunk/test/wasm/archive-export.ll +++ lld/trunk/test/wasm/archive-export.ll @@ -0,0 +1,50 @@ +Test that --export will also fetch lazy symbols from archives + +RUN: llc -filetype=obj %S/Inputs/start.ll -o %t.o +RUN: llc -filetype=obj %S/Inputs/archive1.ll -o %t.a1.o +RUN: llc -filetype=obj %S/Inputs/archive2.ll -o %t.a2.o +RUN: rm -f %t.a +RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o +RUN: wasm-ld --export=archive2_symbol -o %t.wasm %t.a %t.o +RUN: obj2yaml %t.wasm | FileCheck %s +RUN: wasm-ld -o %t.wasm %t.a %t.o +RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=NOEXPORT + +CHECK: Exports: +CHECK-NEXT: - Name: memory +CHECK-NEXT: Kind: MEMORY +CHECK-NEXT: Index: 0 +CHECK-NEXT: - Name: __heap_base +CHECK-NEXT: Kind: GLOBAL +CHECK-NEXT: Index: 1 +CHECK-NEXT: - Name: __data_end +CHECK-NEXT: Kind: GLOBAL +CHECK-NEXT: Index: 2 +CHECK-NEXT: - Name: foo +CHECK-NEXT: Kind: FUNCTION +CHECK-NEXT: Index: 2 +CHECK-NEXT: - Name: bar +CHECK-NEXT: Kind: FUNCTION +CHECK-NEXT: Index: 3 +CHECK-NEXT: - Name: archive2_symbol +CHECK-NEXT: Kind: FUNCTION +CHECK-NEXT: Index: 4 +CHECK-NEXT: - Name: _start +CHECK-NEXT: Kind: FUNCTION +CHECK-NEXT: Index: 1 +CHECK-NEXT: - Type: CODE + +NOEXPORT: Exports: +NOEXPORT-NEXT: - Name: memory +NOEXPORT-NEXT: Kind: MEMORY +NOEXPORT-NEXT: Index: 0 +NOEXPORT-NEXT: - Name: __heap_base +NOEXPORT-NEXT: Kind: GLOBAL +NOEXPORT-NEXT: Index: 1 +NOEXPORT-NEXT: - Name: __data_end +NOEXPORT-NEXT: Kind: GLOBAL +NOEXPORT-NEXT: Index: 2 +NOEXPORT-NEXT: - Name: _start +NOEXPORT-NEXT: Kind: FUNCTION +NOEXPORT-NEXT: Index: 1 +NOEXPORT-NEXT: - Type: CODE Index: lld/trunk/wasm/Driver.cpp =================================================================== --- lld/trunk/wasm/Driver.cpp +++ lld/trunk/wasm/Driver.cpp @@ -484,6 +484,17 @@ for (auto *Arg : Args.filtered(OPT_undefined)) handleUndefined(Arg->getValue()); + // Handle the `--export ` options + // This works like --undefined but also exports the symbol if its found + for (auto *Arg : Args.filtered(OPT_export)) { + Symbol *Sym = handleUndefined(Arg->getValue()); + if (Sym && Sym->isDefined()) + Sym->ForceExport = true; + else if (!Config->AllowUndefined) + error(Twine("symbol exported via --export not found: ") + + Arg->getValue()); + } + if (!Config->Relocatable) { // Add synthetic dummies for weak undefined functions. handleWeakUndefines(); @@ -503,16 +514,6 @@ if (errorCount()) return; - // Handle --export. - for (auto *Arg : Args.filtered(OPT_export)) { - StringRef Name = Arg->getValue(); - Symbol *Sym = Symtab->find(Name); - if (Sym && Sym->isDefined()) - Sym->ForceExport = true; - else if (!Config->AllowUndefined) - error("symbol exported via --export not found: " + Name); - } - // Do link-time optimization if given files are LLVM bitcode files. // This compiles bitcode files into real object files. Symtab->addCombinedLTOObject();