16 #include "llvm/Option/ArgList.h" 21 using namespace clang;
25 :
GnuTool(
"wasm::Linker",
"lld", TC) {}
39 const char *LinkingOutput)
const {
43 ArgStringList CmdArgs;
44 CmdArgs.push_back(
"-flavor");
45 CmdArgs.push_back(
"wasm");
47 if (Args.hasArg(options::OPT_s))
48 CmdArgs.push_back(
"--strip-all");
50 Args.AddAllArgs(CmdArgs, options::OPT_L);
51 Args.AddAllArgs(CmdArgs, options::OPT_u);
54 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
55 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crt1.o")));
59 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
63 if (Args.hasArg(options::OPT_pthread))
64 CmdArgs.push_back(
"-lpthread");
66 CmdArgs.push_back(
"-lc");
70 CmdArgs.push_back(
"-o");
73 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Linker, CmdArgs, Inputs));
76 WebAssembly::WebAssembly(
const Driver &D,
const llvm::Triple &Triple,
77 const llvm::opt::ArgList &Args)
80 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
82 getProgramPaths().push_back(getDriver().getInstalledDir());
84 getFilePaths().push_back(getDriver().SysRoot +
"/lib");
87 bool WebAssembly::IsMathErrnoDefault()
const {
return false; }
89 bool WebAssembly::IsObjCNonFragileABIDefault()
const {
return true; }
91 bool WebAssembly::UseObjCMixedDispatch()
const {
return true; }
93 bool WebAssembly::isPICDefault()
const {
return false; }
95 bool WebAssembly::isPIEDefault()
const {
return false; }
97 bool WebAssembly::isPICDefaultForced()
const {
return false; }
99 bool WebAssembly::IsIntegratedAssemblerDefault()
const {
return true; }
101 bool WebAssembly::hasBlocksRuntime()
const {
return false; }
104 bool WebAssembly::SupportsProfiling()
const {
return false; }
106 bool WebAssembly::HasNativeLLVMSupport()
const {
return true; }
108 void WebAssembly::addClangTargetOptions(
const ArgList &DriverArgs,
109 ArgStringList &CC1Args,
111 if (DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
112 options::OPT_fno_use_init_array,
true))
113 CC1Args.push_back(
"-fuse-init-array");
121 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
122 StringRef
Value = A->getValue();
123 if (Value !=
"libc++")
124 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
125 << A->getAsString(Args);
130 void WebAssembly::AddClangSystemIncludeArgs(
const ArgList &DriverArgs,
131 ArgStringList &CC1Args)
const {
132 if (!DriverArgs.hasArg(options::OPT_nostdinc))
133 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
"/include");
136 void WebAssembly::AddClangCXXStdlibIncludeArgs(
const ArgList &DriverArgs,
137 ArgStringList &CC1Args)
const {
138 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
139 !DriverArgs.hasArg(options::OPT_nostdincxx))
140 addSystemInclude(DriverArgs, CC1Args,
141 getDriver().SysRoot +
"/include/c++/v1");
144 void WebAssembly::AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
145 llvm::opt::ArgStringList &CmdArgs)
const {
147 switch (GetCXXStdlibType(Args)) {
149 CmdArgs.push_back(
"-lc++");
150 CmdArgs.push_back(
"-lc++abi");
153 llvm_unreachable(
"invalid stdlib name");
157 std::string WebAssembly::getThreadModel()
const {
165 Tool *WebAssembly::buildLinker()
const {
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
void addCommand(std::unique_ptr< Command > C)
Dataflow Directional Tag Classes.
Compilation - A set of tasks to perform for a single driver invocation.