15 #include "llvm/Option/ArgList.h"
17 using namespace clang::driver;
18 using namespace clang::driver::tools;
19 using namespace clang::driver::toolchains;
20 using namespace clang;
21 using namespace llvm::opt;
24 :
GnuTool(
"wasm::Linker",
"lld", TC) {}
38 const char *LinkingOutput)
const {
43 ArgStringList CmdArgs;
44 CmdArgs.push_back(
"-flavor");
45 CmdArgs.push_back(
"wasm");
52 CmdArgs.push_back(
"--gc-sections");
54 if (Args.hasArg(options::OPT_rdynamic))
55 CmdArgs.push_back(
"-export-dynamic");
56 if (Args.hasArg(options::OPT_s))
57 CmdArgs.push_back(
"--strip-all");
58 if (Args.hasArg(options::OPT_shared))
59 CmdArgs.push_back(
"-shared");
60 if (Args.hasArg(options::OPT_static))
61 CmdArgs.push_back(
"-Bstatic");
63 Args.AddAllArgs(CmdArgs, options::OPT_L);
66 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
67 if (Args.hasArg(options::OPT_shared))
68 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"rcrt1.o")));
69 else if (Args.hasArg(options::OPT_pie))
70 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"Scrt1.o")));
72 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crt1.o")));
74 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
79 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
83 if (Args.hasArg(options::OPT_pthread))
84 CmdArgs.push_back(
"-lpthread");
86 CmdArgs.push_back(
"-allow-undefined-file");
87 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"wasm.syms")));
88 CmdArgs.push_back(
"-lc");
89 CmdArgs.push_back(
"-lcompiler_rt");
92 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
93 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
95 CmdArgs.push_back(
"-o");
98 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Linker, CmdArgs, Inputs));
101 WebAssembly::WebAssembly(
const Driver &D,
const llvm::Triple &Triple,
102 const llvm::opt::ArgList &Args)
105 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
107 getProgramPaths().push_back(getDriver().getInstalledDir());
109 getFilePaths().push_back(getDriver().SysRoot +
"/lib");
112 bool WebAssembly::IsMathErrnoDefault()
const {
return false; }
114 bool WebAssembly::IsObjCNonFragileABIDefault()
const {
return true; }
116 bool WebAssembly::UseObjCMixedDispatch()
const {
return true; }
118 bool WebAssembly::isPICDefault()
const {
return false; }
120 bool WebAssembly::isPIEDefault()
const {
return false; }
122 bool WebAssembly::isPICDefaultForced()
const {
return false; }
124 bool WebAssembly::IsIntegratedAssemblerDefault()
const {
return true; }
127 bool WebAssembly::SupportsObjCGC()
const {
return false; }
129 bool WebAssembly::hasBlocksRuntime()
const {
return false; }
132 bool WebAssembly::SupportsProfiling()
const {
return false; }
134 bool WebAssembly::HasNativeLLVMSupport()
const {
return true; }
136 void WebAssembly::addClangTargetOptions(
const ArgList &DriverArgs,
137 ArgStringList &CC1Args,
139 if (DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
140 options::OPT_fno_use_init_array,
true))
141 CC1Args.push_back(
"-fuse-init-array");
152 void WebAssembly::AddClangSystemIncludeArgs(
const ArgList &DriverArgs,
153 ArgStringList &CC1Args)
const {
154 if (!DriverArgs.hasArg(options::OPT_nostdinc))
155 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
"/include");
158 void WebAssembly::AddClangCXXStdlibIncludeArgs(
const ArgList &DriverArgs,
159 ArgStringList &CC1Args)
const {
160 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
161 !DriverArgs.hasArg(options::OPT_nostdincxx))
162 addSystemInclude(DriverArgs, CC1Args,
163 getDriver().SysRoot +
"/include/c++/v1");
166 Tool *WebAssembly::buildLinker()
const {
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
void addCommand(std::unique_ptr< Command > C)
Compilation - A set of tasks to perform for a single driver invocation.