Index: test/wasm/load-undefined.ll =================================================================== --- /dev/null +++ test/wasm/load-undefined.ll @@ -0,0 +1,31 @@ +; Verify that the -u / --undefined option is able to pull in symbols from +; an archive, and doesn't error when uses to pull in a symbol already loaded. +; +; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/ret64.ll -o %t.o +; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/ret32.ll -o %t2.o +; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t3.o +; RUN: llvm-ar rcs %t2.a %t2.o +; RUN: lld -flavor wasm %t3.o %t2.a %t.o -o %t.wasm -u ret32 --undefined ret64 +; RUN: obj2yaml %t.wasm | FileCheck %s + + +define i32 @_start() local_unnamed_addr { +entry: + ret i32 1 +} + +; CHECK: - Type: EXPORT +; CHECK-NEXT: Exports: +; CHECK-NEXT: - Name: memory +; CHECK-NEXT: Kind: MEMORY +; CHECK-NEXT: Index: 0 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 0 +; CHECK-NEXT: - Name: ret32 +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Name: ret64 +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 2 +; CHECK-NEXT: - Type: Index: wasm/Driver.cpp =================================================================== --- wasm/Driver.cpp +++ wasm/Driver.cpp @@ -248,6 +248,7 @@ Args.hasFlag(OPT_check_signatures, OPT_no_check_signatures, false); Config->EmitRelocs = Args.hasArg(OPT_emit_relocs); Config->Entry = Args.getLastArgValue(OPT_entry); + std::vector Undefined = args::getStrings(Args, OPT_undefined); Config->ImportMemory = Args.hasArg(OPT_import_memory); Config->OutputFile = Args.getLastArgValue(OPT_o); Config->Relocatable = Args.hasArg(OPT_relocatable); @@ -277,6 +278,8 @@ if (Config->Relocatable && !Config->Entry.empty()) error("entry point specified for relocatable output file"); + if (Config->Relocatable && !Undefined.empty()) + error("undefined symbols specified for relocatable output file"); if (!Config->Relocatable) { if (Config->Entry.empty()) @@ -284,6 +287,10 @@ static WasmSignature Signature = {{}, WASM_TYPE_NORESULT}; addSyntheticUndefinedFunction(Config->Entry, &Signature); + // Handle the `--undefined ` options. + for (StringRef S : Undefined) + addSyntheticUndefinedFunction(S, nullptr); + addSyntheticGlobal("__stack_pointer", 0); } Index: wasm/Options.td =================================================================== --- wasm/Options.td +++ wasm/Options.td @@ -6,6 +6,11 @@ class J: Joined<["--", "-"], name>; class S: Separate<["--", "-"], name>; +multiclass Eq { + def "": Separate<["--", "-"], name>; + def _eq: Joined<["--", "-"], name # "=">, Alias(NAME)>; +} + def L: JoinedOrSeparate<["-"], "L">, MetaVarName<"">, HelpText<"Add a directory to the library search path">; @@ -54,6 +59,9 @@ def sysroot: J<"sysroot=">, HelpText<"Set the system root">; +defm undefined: Eq<"undefined">, + HelpText<"Force undefined symbol during linking">; + def z: JoinedOrSeparate<["-"], "z">, MetaVarName<"