11 #include "clang/Config/config.h" 16 #include "llvm/Support/FileSystem.h" 17 #include "llvm/Support/Path.h" 18 #include "llvm/Option/ArgList.h" 23 using namespace clang;
29 const llvm::Triple &TargetTriple,
31 return (TargetTriple.getArchName() +
"-" +
32 TargetTriple.getOSAndEnvironmentName()).str();
37 if (
const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
38 StringRef UseLinker = A->getValue();
39 if (!UseLinker.empty()) {
40 if (llvm::sys::path::is_absolute(UseLinker) &&
41 llvm::sys::fs::can_execute(UseLinker))
45 if (UseLinker !=
"lld" && UseLinker !=
"ld")
47 << A->getAsString(Args);
58 const char *LinkingOutput)
const {
61 const char *
Linker = Args.MakeArgString(getLinkerPath(Args));
62 ArgStringList CmdArgs;
64 if (Args.hasArg(options::OPT_s))
65 CmdArgs.push_back(
"--strip-all");
67 Args.AddAllArgs(CmdArgs, options::OPT_L);
68 Args.AddAllArgs(CmdArgs, options::OPT_u);
71 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
72 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crt1.o")));
76 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
80 if (Args.hasArg(options::OPT_pthread)) {
81 CmdArgs.push_back(
"-lpthread");
82 CmdArgs.push_back(
"--shared-memory");
85 CmdArgs.push_back(
"-lc");
89 CmdArgs.push_back(
"-o");
92 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Linker, CmdArgs, Inputs));
95 WebAssembly::WebAssembly(
const Driver &D,
const llvm::Triple &Triple,
96 const llvm::opt::ArgList &Args)
99 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
101 getProgramPaths().push_back(getDriver().getInstalledDir());
103 if (getTriple().getOS() == llvm::Triple::UnknownOS) {
108 getFilePaths().push_back(getDriver().SysRoot +
"/lib");
110 const std::string MultiarchTriple =
112 getFilePaths().push_back(getDriver().SysRoot +
"/lib/" + MultiarchTriple);
116 bool WebAssembly::IsMathErrnoDefault()
const {
return false; }
118 bool WebAssembly::IsObjCNonFragileABIDefault()
const {
return true; }
120 bool WebAssembly::UseObjCMixedDispatch()
const {
return true; }
122 bool WebAssembly::isPICDefault()
const {
return false; }
124 bool WebAssembly::isPIEDefault()
const {
return false; }
126 bool WebAssembly::isPICDefaultForced()
const {
return false; }
128 bool WebAssembly::IsIntegratedAssemblerDefault()
const {
return true; }
130 bool WebAssembly::hasBlocksRuntime()
const {
return false; }
133 bool WebAssembly::SupportsProfiling()
const {
return false; }
135 bool WebAssembly::HasNativeLLVMSupport()
const {
return true; }
137 void WebAssembly::addClangTargetOptions(
const ArgList &DriverArgs,
138 ArgStringList &CC1Args,
140 if (DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
141 options::OPT_fno_use_init_array,
true))
142 CC1Args.push_back(
"-fuse-init-array");
145 if (DriverArgs.hasFlag(options::OPT_pthread, options::OPT_no_pthread,
147 if (DriverArgs.hasFlag(options::OPT_mno_atomics, options::OPT_matomics,
149 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
152 if (DriverArgs.hasFlag(options::OPT_mno_bulk_memory,
153 options::OPT_mbulk_memory,
false))
154 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
156 <<
"-mno-bulk-memory";
157 if (DriverArgs.hasFlag(options::OPT_mno_mutable_globals,
158 options::OPT_mmutable_globals,
false))
159 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
161 <<
"-mno-mutable-globals";
162 CC1Args.push_back(
"-target-feature");
163 CC1Args.push_back(
"+atomics");
164 CC1Args.push_back(
"-target-feature");
165 CC1Args.push_back(
"+bulk-memory");
166 CC1Args.push_back(
"-target-feature");
167 CC1Args.push_back(
"+mutable-globals");
176 WebAssembly::GetCXXStdlibType(
const ArgList &Args)
const {
177 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
178 StringRef
Value = A->getValue();
179 if (Value !=
"libc++")
180 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
181 << A->getAsString(Args);
186 void WebAssembly::AddClangSystemIncludeArgs(
const ArgList &DriverArgs,
187 ArgStringList &CC1Args)
const {
188 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
191 const Driver &D = getDriver();
193 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
195 llvm::sys::path::append(P,
"include");
196 addSystemInclude(DriverArgs, CC1Args, P);
199 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
203 StringRef CIncludeDirs(C_INCLUDE_DIRS);
204 if (CIncludeDirs !=
"") {
206 CIncludeDirs.split(dirs,
":");
207 for (StringRef dir : dirs) {
209 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
210 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
215 if (getTriple().getOS() != llvm::Triple::UnknownOS) {
216 const std::string MultiarchTriple =
218 addSystemInclude(DriverArgs, CC1Args, D.
SysRoot +
"/include/" + MultiarchTriple);
220 addSystemInclude(DriverArgs, CC1Args, D.
SysRoot +
"/include");
223 void WebAssembly::AddClangCXXStdlibIncludeArgs(
const ArgList &DriverArgs,
224 ArgStringList &CC1Args)
const {
225 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
226 !DriverArgs.hasArg(options::OPT_nostdincxx)) {
227 if (getTriple().getOS() != llvm::Triple::UnknownOS) {
228 const std::string MultiarchTriple =
230 addSystemInclude(DriverArgs, CC1Args,
231 getDriver().SysRoot +
"/include/" + MultiarchTriple +
234 addSystemInclude(DriverArgs, CC1Args,
235 getDriver().SysRoot +
"/include/c++/v1");
239 void WebAssembly::AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
240 llvm::opt::ArgStringList &CmdArgs)
const {
242 switch (GetCXXStdlibType(Args)) {
244 CmdArgs.push_back(
"-lc++");
245 CmdArgs.push_back(
"-lc++abi");
248 llvm_unreachable(
"invalid stdlib name");
254 if (getTriple().isOSEmscripten()) {
255 Res |= SanitizerKind::Vptr | SanitizerKind::Leak | SanitizerKind::Address;
260 Tool *WebAssembly::buildLinker()
const {
DiagnosticBuilder Diag(unsigned DiagID) 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.
std::string SysRoot
sysroot, if present
Compilation - A set of tasks to perform for a single driver invocation.
std::string ResourceDir
The path to the compiler resource directory.