13#include "clang/Config/config.h"
18#include "llvm/Option/ArgList.h"
19#include "llvm/Support/VirtualFileSystem.h"
31 const char *LinkingOutput)
const {
35 ArgStringList CmdArgs;
44 case llvm::Triple::x86:
45 CmdArgs.push_back(
"--32");
47 case llvm::Triple::ppc:
48 case llvm::Triple::ppcle:
49 CmdArgs.push_back(
"-a32");
51 case llvm::Triple::mips:
52 case llvm::Triple::mipsel:
53 case llvm::Triple::mips64:
54 case llvm::Triple::mips64el: {
59 CmdArgs.push_back(
"-march");
60 CmdArgs.push_back(CPUName.data());
62 CmdArgs.push_back(
"-mabi");
65 if (Triple.isLittleEndian())
66 CmdArgs.push_back(
"-EL");
68 CmdArgs.push_back(
"-EB");
70 if (Arg *A = Args.getLastArg(options::OPT_G)) {
71 StringRef v = A->getValue();
72 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
79 case llvm::Triple::arm:
80 case llvm::Triple::armeb:
81 case llvm::Triple::thumb:
82 case llvm::Triple::thumbeb: {
86 CmdArgs.push_back(
"-mfpu=vfp");
88 CmdArgs.push_back(
"-mfpu=softvfp");
90 CmdArgs.push_back(
"-meabi=5");
93 case llvm::Triple::sparcv9: {
101 for (
const Arg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
102 options::OPT_fdebug_prefix_map_EQ)) {
103 StringRef Map = A->getValue();
104 if (!Map.contains(
'='))
105 D.Diag(diag::err_drv_invalid_argument_to_option)
106 << Map << A->getOption().getName();
108 CmdArgs.push_back(Args.MakeArgString(
"--debug-prefix-map"));
109 CmdArgs.push_back(Args.MakeArgString(Map));
114 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
116 CmdArgs.push_back(
"-o");
119 for (
const auto &II : Inputs)
120 CmdArgs.push_back(II.getFilename());
123 C.addCommand(std::make_unique<Command>(JA, *
this,
125 Exec, CmdArgs, Inputs, Output));
132 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");
168 if (
Arch == llvm::Triple::arm || Triple.isX86())
169 CmdArgs.push_back(
"--hash-style=both");
170 CmdArgs.push_back(
"--enable-new-dtags");
176 case llvm::Triple::x86:
177 CmdArgs.push_back(
"-m");
178 CmdArgs.push_back(
"elf_i386_fbsd");
180 case llvm::Triple::ppc:
181 CmdArgs.push_back(
"-m");
182 CmdArgs.push_back(
"elf32ppc_fbsd");
184 case llvm::Triple::ppcle:
185 CmdArgs.push_back(
"-m");
187 CmdArgs.push_back(
"elf32lppc");
189 case llvm::Triple::mips:
190 CmdArgs.push_back(
"-m");
191 CmdArgs.push_back(
"elf32btsmip_fbsd");
193 case llvm::Triple::mipsel:
194 CmdArgs.push_back(
"-m");
195 CmdArgs.push_back(
"elf32ltsmip_fbsd");
197 case llvm::Triple::mips64:
198 CmdArgs.push_back(
"-m");
200 CmdArgs.push_back(
"elf32btsmipn32_fbsd");
202 CmdArgs.push_back(
"elf64btsmip_fbsd");
204 case llvm::Triple::mips64el:
205 CmdArgs.push_back(
"-m");
207 CmdArgs.push_back(
"elf32ltsmipn32_fbsd");
209 CmdArgs.push_back(
"elf64ltsmip_fbsd");
211 case llvm::Triple::riscv64:
212 CmdArgs.push_back(
"-m");
213 CmdArgs.push_back(
"elf64lriscv");
215 case llvm::Triple::riscv32be:
216 CmdArgs.push_back(
"-m");
217 CmdArgs.push_back(
"elf32briscv");
219 case llvm::Triple::riscv64be:
220 CmdArgs.push_back(
"-m");
221 CmdArgs.push_back(
"elf64briscv");
223 case llvm::Triple::loongarch64:
224 CmdArgs.push_back(
"-m");
225 CmdArgs.push_back(
"elf64loongarch");
231 if (Triple.isLoongArch64() || Triple.isRISCV64()) {
232 CmdArgs.push_back(
"-X");
233 if (Args.hasArg(options::OPT_mno_relax))
234 CmdArgs.push_back(
"--no-relax");
237 if (Arg *A = Args.getLastArg(options::OPT_G)) {
239 StringRef v = A->getValue();
240 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
247 CmdArgs.push_back(
"-o");
251 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
253 const char *crt1 =
nullptr;
254 if (!Args.hasArg(options::OPT_shared)) {
255 if (Args.hasArg(options::OPT_pg))
267 const char *crtbegin =
nullptr;
268 if (Args.hasArg(options::OPT_static))
269 crtbegin =
"crtbeginT.o";
270 else if (Args.hasArg(options::OPT_shared) || IsPIE)
271 crtbegin =
"crtbeginS.o";
273 crtbegin =
"crtbegin.o";
278 Args.AddAllArgs(CmdArgs, options::OPT_L);
280 Args.addAllArgs(CmdArgs,
281 {options::OPT_T_Group, options::OPT_s, options::OPT_t});
293 bool Profiling = Args.hasArg(options::OPT_pg) && Major != 0 && Major < 14;
294 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
297 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
298 !Args.hasArg(options::OPT_static);
305 CmdArgs.push_back(
"-lm_p");
307 CmdArgs.push_back(
"-lm");
311 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
318 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
322 CmdArgs.push_back(
"-lm_p");
324 CmdArgs.push_back(
"-lm");
327 if (NeedsSanitizerDeps)
334 CmdArgs.push_back(
"-lgcc_p");
336 CmdArgs.push_back(
"-lgcc");
337 if (Args.hasArg(options::OPT_static)) {
338 CmdArgs.push_back(
"-lgcc_eh");
339 }
else if (Profiling) {
340 CmdArgs.push_back(
"-lgcc_eh_p");
342 CmdArgs.push_back(
"--as-needed");
343 CmdArgs.push_back(
"-lgcc_s");
344 CmdArgs.push_back(
"--no-as-needed");
347 if (Args.hasArg(options::OPT_pthread)) {
349 CmdArgs.push_back(
"-lpthread_p");
351 CmdArgs.push_back(
"-lpthread");
355 if (Args.hasArg(options::OPT_shared))
356 CmdArgs.push_back(
"-lc");
358 CmdArgs.push_back(
"-lc_p");
359 CmdArgs.push_back(
"-lgcc_p");
361 CmdArgs.push_back(
"-lc");
362 CmdArgs.push_back(
"-lgcc");
365 if (Args.hasArg(options::OPT_static)) {
366 CmdArgs.push_back(
"-lgcc_eh");
367 }
else if (Profiling) {
368 CmdArgs.push_back(
"-lgcc_eh_p");
370 CmdArgs.push_back(
"--as-needed");
371 CmdArgs.push_back(
"-lgcc_s");
372 CmdArgs.push_back(
"--no-as-needed");
376 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
378 const char *crtend =
nullptr;
379 if (Args.hasArg(options::OPT_shared) || IsPIE)
380 crtend =
"crtendS.o";
389 const char *Exec = Args.MakeArgString(
getToolChain().GetLinkerPath());
390 C.addCommand(std::make_unique<Command>(JA, *
this,
392 Exec, CmdArgs, Inputs, Output));
403 if (Triple.isArch32Bit() &&
411 const llvm::opt::ArgList &DriverArgs,
412 llvm::opt::ArgStringList &CC1Args)
const {
415 if (DriverArgs.hasArg(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) :
"";
441 concat(D.SysRoot,
"/usr/include"));
445 llvm::opt::ArgStringList &CC1Args)
const {
451 ArgStringList &CmdArgs)
const {
453 unsigned Major =
getTriple().getOSMajorVersion();
454 bool SuffixedLib = Args.hasArg(options::OPT_pg) && Major != 0 && Major < 14;
457 CmdArgs.begin(), CmdArgs.end(),
458 [](
const char *S) { return StringRef(S) ==
"-lc++"; },
"-lc++_p");
462 ArgStringList &CC1Args)
const {
467 ArgStringList &CC1Args)
const {
489 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
490 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
491 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
492 const bool IsMIPS64 =
getTriple().isMIPS64();
494 Res |= SanitizerKind::Address;
495 Res |= SanitizerKind::PointerCompare;
496 Res |= SanitizerKind::PointerSubtract;
497 Res |= SanitizerKind::Vptr;
498 if (IsAArch64 || IsX86_64 || IsMIPS64) {
499 Res |= SanitizerKind::Leak;
500 Res |= SanitizerKind::Thread;
502 if (IsAArch64 || IsX86 || IsX86_64) {
503 Res |= SanitizerKind::SafeStack;
504 Res |= SanitizerKind::Fuzzer;
505 Res |= SanitizerKind::FuzzerNoLink;
507 if (IsAArch64 || IsX86_64) {
508 Res |= SanitizerKind::KernelAddress;
509 Res |= SanitizerKind::KernelMemory;
510 Res |= SanitizerKind::Memory;
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
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
SmallVector< InputInfo, 4 > InputInfoList
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr ResponseFileSupport AtFileCurCP()