Index: test/wasm/archive-export.ll =================================================================== --- /dev/null +++ test/wasm/archive-export.ll @@ -0,0 +1,32 @@ +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: - Type: EXPORT +CHECK: - 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: - Type: EXPORT +NOEXPORT: - Name: _start +NOEXPORT-NEXT: Kind: FUNCTION +NOEXPORT-NEXT: Index: 1 +NOEXPORT-NEXT: - Type: CODE Index: wasm/Driver.cpp =================================================================== --- wasm/Driver.cpp +++ 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();