10#include "clang/Config/config.h"
15#include "llvm/Support/Path.h"
16#include "llvm/Support/VirtualFileSystem.h"
44 if (StringRef(D.Dir).starts_with(SysRoot))
45 addPathIfExists(D, D.Dir +
"/../lib", Paths);
47 addPathIfExists(D, SysRoot +
"/lib", Paths);
48 addPathIfExists(D, SysRoot +
"/usr/lib", Paths);
49 addPathIfExists(D, SysRoot +
"/usr/lib/w32api", Paths);
53 if (
getArch() == llvm::Triple::x86_64 ||
getArch() == llvm::Triple::aarch64 ||
54 getArch() == llvm::Triple::arm ||
getArch() == llvm::Triple::thumb)
55 return llvm::ExceptionHandling::WinEH;
56 return llvm::ExceptionHandling::DwarfCFI;
60 ArgStringList &CC1Args)
const {
64 if (DriverArgs.hasArg(options::OPT_nostdinc))
67 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
70 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
72 llvm::sys::path::append(P,
"include");
76 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
80 StringRef CIncludeDirs(C_INCLUDE_DIRS);
81 if (CIncludeDirs !=
"") {
83 CIncludeDirs.split(Dirs,
":");
84 for (StringRef Dir : Dirs) {
86 llvm::sys::path::is_absolute(Dir) ?
"" : StringRef(SysRoot);
99 std::string MultiarchIncludeDir =
getTriple().str();
100 if (!MultiarchIncludeDir.empty() &&
101 D.getVFS().exists(SysRoot +
"/usr/include/" + MultiarchIncludeDir))
103 SysRoot +
"/usr/include/" + MultiarchIncludeDir);
115 const ArgList &DriverArgs, ArgStringList &CC1Args,
BoundArch BA,
117 CC1Args.push_back(
"-fno-use-init-array");
124 const char *LinkingOutput)
const {
128 const bool IsStatic = Args.hasArg(options::OPT_static);
130 ArgStringList CmdArgs;
133 Args.ClaimAllArgs(options::OPT_g_Group);
135 Args.ClaimAllArgs(options::OPT_emit_llvm);
138 Args.ClaimAllArgs(options::OPT_w);
141 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
143 if (Args.hasArg(options::OPT_s))
144 CmdArgs.push_back(
"-s");
146 CmdArgs.push_back(
"-m");
148 case llvm::Triple::x86:
149 CmdArgs.push_back(
"i386pe");
151 case llvm::Triple::x86_64:
152 CmdArgs.push_back(
"i386pep");
154 case llvm::Triple::arm:
155 case llvm::Triple::thumb:
157 CmdArgs.push_back(
"thumb2pe");
159 case llvm::Triple::aarch64:
160 if (Args.hasArg(options::OPT_marm64x))
161 CmdArgs.push_back(
"arm64xpe");
163 CmdArgs.push_back(
"arm64ecpe");
165 CmdArgs.push_back(
"arm64pe");
167 case llvm::Triple::mipsel:
168 CmdArgs.push_back(
"mipspe");
171 D.
Diag(diag::err_target_unknown_triple)
176 Args.getLastArg(options::OPT_mwindows, options::OPT_mconsole);
177 if (SubsysArg && SubsysArg->getOption().matches(options::OPT_mwindows)) {
178 CmdArgs.push_back(
"--subsystem");
179 CmdArgs.push_back(
"windows");
180 }
else if (SubsysArg &&
181 SubsysArg->getOption().matches(options::OPT_mconsole)) {
182 CmdArgs.push_back(
"--subsystem");
183 CmdArgs.push_back(
"console");
187 CmdArgs.push_back(
"--wrap=_Znwj");
188 CmdArgs.push_back(
"--wrap=_Znaj");
189 CmdArgs.push_back(
"--wrap=_ZdlPv");
190 CmdArgs.push_back(
"--wrap=_ZdaPv");
191 CmdArgs.push_back(
"--wrap=_ZnwjRKSt9nothrow_t");
192 CmdArgs.push_back(
"--wrap=_ZnajRKSt9nothrow_t");
193 CmdArgs.push_back(
"--wrap=_ZdlPvRKSt9nothrow_t");
194 CmdArgs.push_back(
"--wrap=_ZdaPvRKSt9nothrow_t");
196 CmdArgs.push_back(
"--wrap=_Znwm");
197 CmdArgs.push_back(
"--wrap=_Znam");
198 CmdArgs.push_back(
"--wrap=_ZdlPv");
199 CmdArgs.push_back(
"--wrap=_ZdaPv");
200 CmdArgs.push_back(
"--wrap=_ZnwmRKSt9nothrow_t");
201 CmdArgs.push_back(
"--wrap=_ZnamRKSt9nothrow_t");
202 CmdArgs.push_back(
"--wrap=_ZdlPvRKSt9nothrow_t");
203 CmdArgs.push_back(
"--wrap=_ZdaPvRKSt9nothrow_t");
206 if (Args.hasArg(options::OPT_mdll))
207 CmdArgs.push_back(
"--dll");
208 else if (Args.hasArg(options::OPT_shared))
209 CmdArgs.push_back(
"--shared");
210 if (Args.hasArg(options::OPT_static))
211 CmdArgs.push_back(
"-Bstatic");
213 CmdArgs.push_back(
"-Bdynamic");
215 CmdArgs.push_back(
"--dll-search-prefix=cyg");
216 if (Args.hasArg(options::OPT_rdynamic))
217 CmdArgs.push_back(
"--export-all-symbols");
221 if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_mdll)) {
226 CmdArgs.push_back(
"--large-address-aware");
230 CmdArgs.push_back(
"--tsaware");
233 CmdArgs.push_back(
"-o");
239 !llvm::sys::path::has_extension(OutputFile))
240 CmdArgs.push_back(Args.MakeArgString(Twine(OutputFile) +
".exe"));
242 CmdArgs.push_back(OutputFile);
244 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
246 const bool IsShared = Args.hasArg(options::OPT_shared);
247 if (Args.hasArg(options::OPT_mdll) || IsShared) {
248 CmdArgs.push_back(
"-e");
250 ?
"__cygwin_dll_entry@12"
251 :
"_cygwin_dll_entry");
252 CmdArgs.push_back(
"--enable-auto-image-base");
255 if (!Args.hasArg(options::OPT_mdll) && !IsShared)
268 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
276 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
277 CmdArgs.push_back(
"--no-demangle");
282 CmdArgs.push_back(
"--disable-high-entropy-va");
283 CmdArgs.push_back(
"--disable-nxcompat");
285 bool NeedsSanitizerDeps =
295 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
298 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
299 !Args.hasArg(options::OPT_static);
300 if (OnlyLibstdcxxStatic)
301 CmdArgs.push_back(
"-Bstatic");
303 if (OnlyLibstdcxxStatic)
304 CmdArgs.push_back(
"-Bdynamic");
306 CmdArgs.push_back(
"-lm");
310 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
317 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
320 CmdArgs.push_back(
"-lm");
323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_r)) {
324 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
326 CmdArgs.push_back(
"--start-group");
328 if (NeedsSanitizerDeps)
334 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
335 Args.hasArg(options::OPT_pthreads);
338 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
339 !Args.hasArg(options::OPT_static);
353 CmdArgs.push_back(
"-lpthread");
355 if (Args.hasArg(options::OPT_fsplit_stack))
356 CmdArgs.push_back(
"--wrap=pthread_create");
358 if (!Args.hasArg(options::OPT_nolibc))
359 CmdArgs.push_back(
"-lc");
362 CmdArgs.push_back(
"-lcygwin");
363 if (Args.hasArg(options::OPT_mwindows)) {
364 CmdArgs.push_back(
"-lgdi32");
365 CmdArgs.push_back(
"-lcomdlg32");
367 CmdArgs.push_back(
"-ladvapi32");
368 CmdArgs.push_back(
"-lshell32");
369 CmdArgs.push_back(
"-luser32");
370 CmdArgs.push_back(
"-lkernel32");
373 CmdArgs.push_back(
"--end-group");
378 if (!Args.hasArg(options::OPT_nostartfiles)) {
379 if (!Args.hasArg(options::OPT_mdll, options::OPT_shared)) {
381 CmdArgs.push_back(Args.MakeArgString(std::move(*O)));
387 Args.addAllArgs(CmdArgs, {options::OPT_T, options::OPT_t});
390 C.addCommand(std::make_unique<Command>(JA, *
this,
392 Exec, CmdArgs, Inputs, Output));
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
DiagnosticBuilder Diag(unsigned DiagID) const
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
SmallVector< InputInfo, 4 > InputInfoList
Top level wrappers for InstallAPI frontend operations.
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr ResponseFileSupport AtFileCurCP()