diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
| commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
| tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /clang/lib/Driver/ToolChains/WebAssembly.cpp | |
| parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) | |
Notes
Diffstat (limited to 'clang/lib/Driver/ToolChains/WebAssembly.cpp')
| -rw-r--r-- | clang/lib/Driver/ToolChains/WebAssembly.cpp | 37 | 
1 files changed, 32 insertions, 5 deletions
diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp index 907f86b8233c..10168736400f 100644 --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -40,7 +40,7 @@ std::string wasm::Linker::getLinkerPath(const ArgList &Args) const {      if (!UseLinker.empty()) {        if (llvm::sys::path::is_absolute(UseLinker) &&            llvm::sys::fs::can_execute(UseLinker)) -        return UseLinker; +        return std::string(UseLinker);        // Accept 'lld', and 'ld' as aliases for the default linker        if (UseLinker != "lld" && UseLinker != "ld") @@ -62,6 +62,12 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,    const char *Linker = Args.MakeArgString(getLinkerPath(Args));    ArgStringList CmdArgs; +  CmdArgs.push_back("-m"); +  if (getToolChain().getTriple().isArch64Bit()) +    CmdArgs.push_back("wasm64"); +  else +    CmdArgs.push_back("wasm32"); +    if (Args.hasArg(options::OPT_s))      CmdArgs.push_back("--strip-all"); @@ -69,8 +75,26 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,    Args.AddAllArgs(CmdArgs, options::OPT_u);    ToolChain.AddFilePathLibArgs(Args, CmdArgs); +  const char *Crt1 = "crt1.o"; +  const char *Entry = NULL; +  if (const Arg *A = Args.getLastArg(options::OPT_mexec_model_EQ)) { +    StringRef CM = A->getValue(); +    if (CM == "command") { +      // Use default values. +    } else if (CM == "reactor") { +      Crt1 = "crt1-reactor.o"; +      Entry = "_initialize"; +    } else { +      ToolChain.getDriver().Diag(diag::err_drv_invalid_argument_to_option) +          << CM << A->getOption().getName(); +    } +  }    if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) -    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); +    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(Crt1))); +  if (Entry) { +    CmdArgs.push_back(Args.MakeArgString("--entry")); +    CmdArgs.push_back(Args.MakeArgString(Entry)); +  }    AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA); @@ -90,7 +114,8 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,    CmdArgs.push_back("-o");    CmdArgs.push_back(Output.getFilename()); -  C.addCommand(std::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs)); +  C.addCommand(std::make_unique<Command>( +      JA, *this, ResponseFileSupport::AtFileCurCP(), Linker, CmdArgs, Inputs));    // When optimizing, if wasm-opt is available, run it.    if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { @@ -112,7 +137,9 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,          CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));          CmdArgs.push_back("-o");          CmdArgs.push_back(Output.getFilename()); -        C.addCommand(std::make_unique<Command>(JA, *this, WasmOpt, CmdArgs, Inputs)); +        C.addCommand(std::make_unique<Command>( +            JA, *this, ResponseFileSupport::AtFileCurCP(), WasmOpt, CmdArgs, +            Inputs));        }      }    } @@ -283,7 +310,7 @@ void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,      CIncludeDirs.split(dirs, ":");      for (StringRef dir : dirs) {        StringRef Prefix = -          llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : ""; +          llvm::sys::path::is_absolute(dir) ? "" : StringRef(D.SysRoot);        addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);      }      return;  | 
