15 #include "llvm/Option/ArgList.h" 20 using namespace clang;
24 :
GnuTool(
"wasm::Linker",
"lld", TC) {}
38 const char *LinkingOutput)
const {
42 ArgStringList CmdArgs;
43 CmdArgs.push_back(
"-flavor");
44 CmdArgs.push_back(
"wasm");
46 if (Args.hasArg(options::OPT_s))
47 CmdArgs.push_back(
"--strip-all");
49 Args.AddAllArgs(CmdArgs, options::OPT_L);
50 Args.AddAllArgs(CmdArgs, options::OPT_u);
53 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
54 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crt1.o")));
58 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
62 if (Args.hasArg(options::OPT_pthread))
63 CmdArgs.push_back(
"-lpthread");
65 CmdArgs.push_back(
"-allow-undefined-file");
66 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"wasm.syms")));
67 CmdArgs.push_back(
"-lc");
71 CmdArgs.push_back(
"-o");
74 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Linker, CmdArgs, Inputs));
77 WebAssembly::WebAssembly(
const Driver &D,
const llvm::Triple &Triple,
78 const llvm::opt::ArgList &Args)
81 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
83 getProgramPaths().push_back(getDriver().getInstalledDir());
85 getFilePaths().push_back(getDriver().SysRoot +
"/lib");
88 bool WebAssembly::IsMathErrnoDefault()
const {
return false; }
90 bool WebAssembly::IsObjCNonFragileABIDefault()
const {
return true; }
92 bool WebAssembly::UseObjCMixedDispatch()
const {
return true; }
94 bool WebAssembly::isPICDefault()
const {
return false; }
96 bool WebAssembly::isPIEDefault()
const {
return false; }
98 bool WebAssembly::isPICDefaultForced()
const {
return false; }
100 bool WebAssembly::IsIntegratedAssemblerDefault()
const {
return true; }
102 bool WebAssembly::hasBlocksRuntime()
const {
return false; }
105 bool WebAssembly::SupportsProfiling()
const {
return false; }
107 bool WebAssembly::HasNativeLLVMSupport()
const {
return true; }
109 void WebAssembly::addClangTargetOptions(
const ArgList &DriverArgs,
110 ArgStringList &CC1Args,
112 if (DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
113 options::OPT_fno_use_init_array,
true))
114 CC1Args.push_back(
"-fuse-init-array");
125 void WebAssembly::AddClangSystemIncludeArgs(
const ArgList &DriverArgs,
126 ArgStringList &CC1Args)
const {
127 if (!DriverArgs.hasArg(options::OPT_nostdinc))
128 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
"/include");
131 void WebAssembly::AddClangCXXStdlibIncludeArgs(
const ArgList &DriverArgs,
132 ArgStringList &CC1Args)
const {
133 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
134 !DriverArgs.hasArg(options::OPT_nostdincxx))
135 addSystemInclude(DriverArgs, CC1Args,
136 getDriver().SysRoot +
"/include/c++/v1");
139 std::string WebAssembly::getThreadModel()
const {
147 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.