16 #include "llvm/Option/ArgList.h" 21 using namespace clang;
25 :
GnuTool(
"wasm::Linker",
"lld", TC) {}
30 const llvm::Triple &TargetTriple,
32 return (TargetTriple.getArchName() +
"-" +
33 TargetTriple.getOSAndEnvironmentName()).
str();
44 const char *LinkingOutput)
const {
48 ArgStringList CmdArgs;
50 if (Args.hasArg(options::OPT_s))
51 CmdArgs.push_back(
"--strip-all");
53 Args.AddAllArgs(CmdArgs, options::OPT_L);
54 Args.AddAllArgs(CmdArgs, options::OPT_u);
57 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
58 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crt1.o")));
62 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
66 if (Args.hasArg(options::OPT_pthread))
67 CmdArgs.push_back(
"-lpthread");
69 CmdArgs.push_back(
"-lc");
73 CmdArgs.push_back(
"-o");
76 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Linker, CmdArgs, Inputs));
79 WebAssembly::WebAssembly(
const Driver &D,
const llvm::Triple &Triple,
80 const llvm::opt::ArgList &Args)
83 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
85 getProgramPaths().push_back(getDriver().getInstalledDir());
87 if (getTriple().getOS() == llvm::Triple::UnknownOS) {
92 getFilePaths().push_back(getDriver().SysRoot +
"/lib");
94 const std::string MultiarchTriple =
96 getFilePaths().push_back(getDriver().SysRoot +
"/lib/" + MultiarchTriple);
100 bool WebAssembly::IsMathErrnoDefault()
const {
return false; }
102 bool WebAssembly::IsObjCNonFragileABIDefault()
const {
return true; }
104 bool WebAssembly::UseObjCMixedDispatch()
const {
return true; }
106 bool WebAssembly::isPICDefault()
const {
return false; }
108 bool WebAssembly::isPIEDefault()
const {
return false; }
110 bool WebAssembly::isPICDefaultForced()
const {
return false; }
112 bool WebAssembly::IsIntegratedAssemblerDefault()
const {
return true; }
114 bool WebAssembly::hasBlocksRuntime()
const {
return false; }
117 bool WebAssembly::SupportsProfiling()
const {
return false; }
119 bool WebAssembly::HasNativeLLVMSupport()
const {
return true; }
121 void WebAssembly::addClangTargetOptions(
const ArgList &DriverArgs,
122 ArgStringList &CC1Args,
124 if (DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
125 options::OPT_fno_use_init_array,
true))
126 CC1Args.push_back(
"-fuse-init-array");
134 WebAssembly::GetCXXStdlibType(
const ArgList &Args)
const {
135 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
136 StringRef
Value = A->getValue();
137 if (Value !=
"libc++")
138 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
139 << A->getAsString(Args);
144 void WebAssembly::AddClangSystemIncludeArgs(
const ArgList &DriverArgs,
145 ArgStringList &CC1Args)
const {
146 if (!DriverArgs.hasArg(options::OPT_nostdinc)) {
147 if (getTriple().getOS() != llvm::Triple::UnknownOS) {
148 const std::string MultiarchTriple =
150 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
"/include/" + MultiarchTriple);
152 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
"/include");
156 void WebAssembly::AddClangCXXStdlibIncludeArgs(
const ArgList &DriverArgs,
157 ArgStringList &CC1Args)
const {
158 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
159 !DriverArgs.hasArg(options::OPT_nostdincxx)) {
160 if (getTriple().getOS() != llvm::Triple::UnknownOS) {
161 const std::string MultiarchTriple =
163 addSystemInclude(DriverArgs, CC1Args,
164 getDriver().SysRoot +
"/include/" + MultiarchTriple +
"/c++/v1");
166 addSystemInclude(DriverArgs, CC1Args,
167 getDriver().SysRoot +
"/include/c++/v1");
171 void WebAssembly::AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
172 llvm::opt::ArgStringList &CmdArgs)
const {
174 switch (GetCXXStdlibType(Args)) {
176 CmdArgs.push_back(
"-lc++");
177 CmdArgs.push_back(
"-lc++abi");
180 llvm_unreachable(
"invalid stdlib name");
184 std::string WebAssembly::getThreadModel()
const {
192 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.