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::loongarch64:
216 CmdArgs.push_back(
"-m");
217 CmdArgs.push_back(
"elf64loongarch");
223 if (Triple.isLoongArch64() || Triple.isRISCV64()) {
224 CmdArgs.push_back(
"-X");
225 if (Args.hasArg(options::OPT_mno_relax))
226 CmdArgs.push_back(
"--no-relax");
229 if (Arg *A = Args.getLastArg(options::OPT_G)) {
231 StringRef v = A->getValue();
232 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
239 CmdArgs.push_back(
"-o");
243 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
245 const char *crt1 =
nullptr;
246 if (!Args.hasArg(options::OPT_shared)) {
247 if (Args.hasArg(options::OPT_pg))
259 const char *crtbegin =
nullptr;
260 if (Args.hasArg(options::OPT_static))
261 crtbegin =
"crtbeginT.o";
262 else if (Args.hasArg(options::OPT_shared) || IsPIE)
263 crtbegin =
"crtbeginS.o";
265 crtbegin =
"crtbegin.o";
270 Args.AddAllArgs(CmdArgs, options::OPT_L);
272 Args.addAllArgs(CmdArgs,
273 {options::OPT_T_Group, options::OPT_s, options::OPT_t});
285 bool Profiling = Args.hasArg(options::OPT_pg) && Major != 0 && Major < 14;
286 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
289 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
290 !Args.hasArg(options::OPT_static);
297 CmdArgs.push_back(
"-lm_p");
299 CmdArgs.push_back(
"-lm");
303 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
310 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
314 CmdArgs.push_back(
"-lm_p");
316 CmdArgs.push_back(
"-lm");
319 if (NeedsSanitizerDeps)
326 CmdArgs.push_back(
"-lgcc_p");
328 CmdArgs.push_back(
"-lgcc");
329 if (Args.hasArg(options::OPT_static)) {
330 CmdArgs.push_back(
"-lgcc_eh");
331 }
else if (Profiling) {
332 CmdArgs.push_back(
"-lgcc_eh_p");
334 CmdArgs.push_back(
"--as-needed");
335 CmdArgs.push_back(
"-lgcc_s");
336 CmdArgs.push_back(
"--no-as-needed");
339 if (Args.hasArg(options::OPT_pthread)) {
341 CmdArgs.push_back(
"-lpthread_p");
343 CmdArgs.push_back(
"-lpthread");
347 if (Args.hasArg(options::OPT_shared))
348 CmdArgs.push_back(
"-lc");
350 CmdArgs.push_back(
"-lc_p");
351 CmdArgs.push_back(
"-lgcc_p");
353 CmdArgs.push_back(
"-lc");
354 CmdArgs.push_back(
"-lgcc");
357 if (Args.hasArg(options::OPT_static)) {
358 CmdArgs.push_back(
"-lgcc_eh");
359 }
else if (Profiling) {
360 CmdArgs.push_back(
"-lgcc_eh_p");
362 CmdArgs.push_back(
"--as-needed");
363 CmdArgs.push_back(
"-lgcc_s");
364 CmdArgs.push_back(
"--no-as-needed");
368 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
370 const char *crtend =
nullptr;
371 if (Args.hasArg(options::OPT_shared) || IsPIE)
372 crtend =
"crtendS.o";
381 const char *Exec = Args.MakeArgString(
getToolChain().GetLinkerPath());
382 C.addCommand(std::make_unique<Command>(JA, *
this,
384 Exec, CmdArgs, Inputs, Output));
395 if (Triple.isArch32Bit() &&
403 const llvm::opt::ArgList &DriverArgs,
404 llvm::opt::ArgStringList &CC1Args)
const {
407 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
410 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
412 llvm::sys::path::append(Dir,
"include");
416 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
420 StringRef CIncludeDirs(C_INCLUDE_DIRS);
421 if (CIncludeDirs !=
"") {
423 CIncludeDirs.split(dirs,
":");
424 for (StringRef dir : dirs) {
426 llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) :
"";
433 concat(D.SysRoot,
"/usr/include"));
437 llvm::opt::ArgStringList &CC1Args)
const {
443 ArgStringList &CmdArgs)
const {
445 unsigned Major =
getTriple().getOSMajorVersion();
446 bool SuffixedLib = Args.hasArg(options::OPT_pg) && Major != 0 && Major < 14;
449 CmdArgs.begin(), CmdArgs.end(),
450 [](
const char *S) { return StringRef(S) ==
"-lc++"; },
"-lc++_p");
454 ArgStringList &CC1Args)
const {
459 ArgStringList &CC1Args)
const {
481 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
482 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
483 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
484 const bool IsMIPS64 =
getTriple().isMIPS64();
486 Res |= SanitizerKind::Address;
487 Res |= SanitizerKind::PointerCompare;
488 Res |= SanitizerKind::PointerSubtract;
489 Res |= SanitizerKind::Vptr;
490 if (IsAArch64 || IsX86_64 || IsMIPS64) {
491 Res |= SanitizerKind::Leak;
492 Res |= SanitizerKind::Thread;
494 if (IsAArch64 || IsX86 || IsX86_64) {
495 Res |= SanitizerKind::SafeStack;
496 Res |= SanitizerKind::Fuzzer;
497 Res |= SanitizerKind::FuzzerNoLink;
499 if (IsAArch64 || IsX86_64) {
500 Res |= SanitizerKind::KernelAddress;
501 Res |= SanitizerKind::KernelMemory;
502 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()