14#include "clang/Config/config.h"
19#include "llvm/Option/ArgList.h"
20#include "llvm/Support/VirtualFileSystem.h"
32 const char *LinkingOutput)
const {
36 ArgStringList CmdArgs;
45 case llvm::Triple::x86:
46 CmdArgs.push_back(
"--32");
48 case llvm::Triple::ppc:
49 case llvm::Triple::ppcle:
50 CmdArgs.push_back(
"-a32");
52 case llvm::Triple::mips:
53 case llvm::Triple::mipsel:
54 case llvm::Triple::mips64:
55 case llvm::Triple::mips64el: {
60 CmdArgs.push_back(
"-march");
61 CmdArgs.push_back(CPUName.data());
63 CmdArgs.push_back(
"-mabi");
66 if (Triple.isLittleEndian())
67 CmdArgs.push_back(
"-EL");
69 CmdArgs.push_back(
"-EB");
71 if (Arg *A = Args.getLastArg(options::OPT_G)) {
72 StringRef
v = A->getValue();
73 CmdArgs.push_back(Args.MakeArgString(
"-G" +
v));
80 case llvm::Triple::arm:
81 case llvm::Triple::armeb:
82 case llvm::Triple::thumb:
83 case llvm::Triple::thumbeb: {
87 CmdArgs.push_back(
"-mfpu=vfp");
89 CmdArgs.push_back(
"-mfpu=softvfp");
91 CmdArgs.push_back(
"-meabi=5");
94 case llvm::Triple::sparcv9: {
102 for (
const Arg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
103 options::OPT_fdebug_prefix_map_EQ)) {
104 StringRef Map = A->getValue();
105 if (!Map.contains(
'='))
106 D.Diag(diag::err_drv_invalid_argument_to_option)
107 << Map << A->getOption().getName();
109 CmdArgs.push_back(Args.MakeArgString(
"--debug-prefix-map"));
110 CmdArgs.push_back(Args.MakeArgString(Map));
115 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
117 CmdArgs.push_back(
"-o");
120 for (
const auto &II : Inputs)
121 CmdArgs.push_back(II.getFilename());
124 C.addCommand(std::make_unique<Command>(JA, *
this,
126 Exec, CmdArgs, Inputs, Output));
133 const char *LinkingOutput)
const {
138 !Args.hasArg(options::OPT_shared) &&
140 ArgStringList CmdArgs;
143 Args.ClaimAllArgs(options::OPT_g_Group);
145 Args.ClaimAllArgs(options::OPT_emit_llvm);
148 Args.ClaimAllArgs(options::OPT_w);
151 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
154 CmdArgs.push_back(
"-pie");
156 CmdArgs.push_back(
"--eh-frame-hdr");
157 if (Args.hasArg(options::OPT_static)) {
158 CmdArgs.push_back(
"-Bstatic");
160 if (Args.hasArg(options::OPT_rdynamic))
161 CmdArgs.push_back(
"-export-dynamic");
162 if (Args.hasArg(options::OPT_shared)) {
163 CmdArgs.push_back(
"-shared");
164 }
else if (!Args.hasArg(options::OPT_r)) {
165 CmdArgs.push_back(
"-dynamic-linker");
166 CmdArgs.push_back(
"/libexec/ld-elf.so.1");
169 if (Arch == llvm::Triple::arm || T.isX86())
170 CmdArgs.push_back(
"--hash-style=both");
171 CmdArgs.push_back(
"--enable-new-dtags");
177 case llvm::Triple::x86:
178 CmdArgs.push_back(
"-m");
179 CmdArgs.push_back(
"elf_i386_fbsd");
181 case llvm::Triple::ppc:
182 CmdArgs.push_back(
"-m");
183 CmdArgs.push_back(
"elf32ppc_fbsd");
185 case llvm::Triple::ppcle:
186 CmdArgs.push_back(
"-m");
188 CmdArgs.push_back(
"elf32lppc");
190 case llvm::Triple::mips:
191 CmdArgs.push_back(
"-m");
192 CmdArgs.push_back(
"elf32btsmip_fbsd");
194 case llvm::Triple::mipsel:
195 CmdArgs.push_back(
"-m");
196 CmdArgs.push_back(
"elf32ltsmip_fbsd");
198 case llvm::Triple::mips64:
199 CmdArgs.push_back(
"-m");
201 CmdArgs.push_back(
"elf32btsmipn32_fbsd");
203 CmdArgs.push_back(
"elf64btsmip_fbsd");
205 case llvm::Triple::mips64el:
206 CmdArgs.push_back(
"-m");
208 CmdArgs.push_back(
"elf32ltsmipn32_fbsd");
210 CmdArgs.push_back(
"elf64ltsmip_fbsd");
212 case llvm::Triple::riscv64:
213 CmdArgs.push_back(
"-m");
214 CmdArgs.push_back(
"elf64lriscv");
215 CmdArgs.push_back(
"-X");
221 if (Arg *A = Args.getLastArg(options::OPT_G)) {
223 StringRef
v = A->getValue();
224 CmdArgs.push_back(Args.MakeArgString(
"-G" +
v));
231 CmdArgs.push_back(
"-o");
235 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
237 const char *crt1 =
nullptr;
238 if (!Args.hasArg(options::OPT_shared)) {
239 if (Args.hasArg(options::OPT_pg))
251 const char *crtbegin =
nullptr;
252 if (Args.hasArg(options::OPT_static))
253 crtbegin =
"crtbeginT.o";
254 else if (Args.hasArg(options::OPT_shared) || IsPIE)
255 crtbegin =
"crtbeginS.o";
257 crtbegin =
"crtbegin.o";
262 Args.AddAllArgs(CmdArgs, options::OPT_L);
264 Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,
265 options::OPT_t, options::OPT_r});
268 assert(!Inputs.empty() &&
"Must have at least one input.");
270 auto Input = llvm::find_if(
272 if (Input == Inputs.end())
275 Input = Inputs.begin();
287 bool Profiling = Args.hasArg(options::OPT_pg) && Major != 0 && Major < 14;
288 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
291 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
292 !Args.hasArg(options::OPT_static);
299 CmdArgs.push_back(
"-lm_p");
301 CmdArgs.push_back(
"-lm");
305 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
315 CmdArgs.push_back(
"-lm_p");
317 CmdArgs.push_back(
"-lm");
320 if (NeedsSanitizerDeps)
327 CmdArgs.push_back(
"-lgcc_p");
329 CmdArgs.push_back(
"-lgcc");
330 if (Args.hasArg(options::OPT_static)) {
331 CmdArgs.push_back(
"-lgcc_eh");
332 }
else if (Profiling) {
333 CmdArgs.push_back(
"-lgcc_eh_p");
335 CmdArgs.push_back(
"--as-needed");
336 CmdArgs.push_back(
"-lgcc_s");
337 CmdArgs.push_back(
"--no-as-needed");
340 if (Args.hasArg(options::OPT_pthread)) {
342 CmdArgs.push_back(
"-lpthread_p");
344 CmdArgs.push_back(
"-lpthread");
348 if (Args.hasArg(options::OPT_shared))
349 CmdArgs.push_back(
"-lc");
351 CmdArgs.push_back(
"-lc_p");
352 CmdArgs.push_back(
"-lgcc_p");
354 CmdArgs.push_back(
"-lc");
355 CmdArgs.push_back(
"-lgcc");
358 if (Args.hasArg(options::OPT_static)) {
359 CmdArgs.push_back(
"-lgcc_eh");
360 }
else if (Profiling) {
361 CmdArgs.push_back(
"-lgcc_eh_p");
363 CmdArgs.push_back(
"--as-needed");
364 CmdArgs.push_back(
"-lgcc_s");
365 CmdArgs.push_back(
"--no-as-needed");
369 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
371 const char *crtend =
nullptr;
372 if (Args.hasArg(options::OPT_shared) || IsPIE)
373 crtend =
"crtendS.o";
382 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
383 C.addCommand(std::make_unique<Command>(JA, *
this,
385 Exec, CmdArgs, Inputs, Output));
396 if (Triple.isArch32Bit() &&
404 unsigned Major =
getTriple().getOSMajorVersion();
405 if (Major >= 12 || Major == 0)
411 const llvm::opt::ArgList &DriverArgs,
412 llvm::opt::ArgStringList &CC1Args)
const {
415 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
418 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
420 llvm::sys::path::append(Dir,
"include");
424 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
428 StringRef CIncludeDirs(C_INCLUDE_DIRS);
429 if (CIncludeDirs !=
"") {
431 CIncludeDirs.split(dirs,
":");
432 for (StringRef dir : dirs) {
434 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
445 llvm::opt::ArgStringList &CC1Args)
const {
451 ArgStringList &CmdArgs)
const {
452 unsigned Major =
getTriple().getOSMajorVersion();
453 bool Profiling = Args.hasArg(options::OPT_pg) && Major != 0 && Major < 14;
455 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
456 if (Args.hasArg(options::OPT_fexperimental_library))
457 CmdArgs.push_back(
"-lc++experimental");
461 ArgStringList &CC1Args)
const {
466 ArgStringList &CC1Args)
const {
488 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
489 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
490 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
491 const bool IsMIPS64 =
getTriple().isMIPS64();
493 Res |= SanitizerKind::Address;
494 Res |= SanitizerKind::PointerCompare;
495 Res |= SanitizerKind::PointerSubtract;
496 Res |= SanitizerKind::Vptr;
497 if (IsAArch64 || IsX86_64 || IsMIPS64) {
498 Res |= SanitizerKind::Leak;
499 Res |= SanitizerKind::Thread;
501 if (IsAArch64 || IsX86 || IsX86_64) {
502 Res |= SanitizerKind::SafeStack;
503 Res |= SanitizerKind::Fuzzer;
504 Res |= SanitizerKind::FuzzerNoLink;
506 if (IsAArch64 || IsX86_64) {
507 Res |= SanitizerKind::KernelAddress;
508 Res |= SanitizerKind::KernelMemory;
509 Res |= SanitizerKind::Memory;
515 ArgStringList &CC1Args,
517 unsigned Major =
getTriple().getOSMajorVersion();
518 if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
519 options::OPT_fno_use_init_array,
520 (Major >= 12 || Major == 0)))
521 CC1Args.push_back(
"-fno-use-init-array");
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
LTOKind getLTOMode(bool IsOffload=false) const
Get the specific kind of LTO being performed.
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
bool isUsingLTO(bool IsOffload=false) const
Returns true if we are performing any kind of LTO.
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
static constexpr ResponseFileSupport AtFileCurCP()