Index: clang/docs/ClangCommandLineReference.rst =================================================================== --- clang/docs/ClangCommandLineReference.rst +++ clang/docs/ClangCommandLineReference.rst @@ -2599,6 +2599,12 @@ .. option:: -msimd128, -mno-simd128 +.. option:: -mexec-model= + +Select between "command" and "reactor" executable models. Commands have a main +function which scopes the lifetime of the program. Reactors are activated and +remain active until explicitly terminated. + X86 --- .. option:: -m3dnow, -mno-3dnow Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -148,6 +148,10 @@ Group, DocName<"PowerPC">; def m_wasm_Features_Group : OptionGroup<"">, Group, DocName<"WebAssembly">; +// The features added by this group will not be added to target features. +// These are explicitly handled. +def m_wasm_Features_Driver_Group : OptionGroup<"">, + Group, DocName<"WebAssembly Driver">; def m_x86_Features_Group : OptionGroup<"">, Group, Flags<[CoreOption]>, DocName<"X86">; def m_riscv_Features_Group : OptionGroup<"">, @@ -2189,6 +2193,9 @@ def mno_multivalue : Flag<["-"], "mno-multivalue">, Group; def mtail_call : Flag<["-"], "mtail-call">, Group; def mno_tail_call : Flag<["-"], "mno-tail-call">, Group; +def mexec_model_EQ : Joined<["-"], "mexec-model=">, Group, + Values<"command,reactor">, + HelpText<"Executable model (WebAssembly only)">; def mamdgpu_debugger_abi : Joined<["-"], "mamdgpu-debugger-abi=">, Flags<[HelpHidden]>, Index: clang/lib/Driver/ToolChains/WebAssembly.cpp =================================================================== --- clang/lib/Driver/ToolChains/WebAssembly.cpp +++ clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -67,8 +67,23 @@ Args.AddAllArgs(CmdArgs, options::OPT_u); ToolChain.AddFilePathLibArgs(Args, CmdArgs); - if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) - CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); + if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { + const char *CrtO = "crt1.o"; + const char *Entry = NULL; + if (const Arg *A = Args.getLastArg(options::OPT_mexec_model_EQ)) { + CrtO = llvm::StringSwitch(A->getValue()) + .Case("reactor", "reactor-crt1.o") + .Default(CrtO); + Entry = llvm::StringSwitch(A->getValue()) + .Case("reactor", "__wasi_unstable_reactor_start") + .Default(CrtO); + } + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(CrtO))); + if (Entry) { + CmdArgs.push_back(Args.MakeArgString("--entry")); + CmdArgs.push_back(Args.MakeArgString(Entry)); + } + } AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);