14#include "clang/Config/config.h"
19#include "llvm/Option/ArgList.h"
20#include "llvm/Support/VirtualFileSystem.h"
32 const char *LinkingOutput)
const {
39 ArgStringList CmdArgs;
44 case llvm::Triple::x86:
45 CmdArgs.push_back(
"--32");
47 case llvm::Triple::arm:
48 case llvm::Triple::armeb:
49 case llvm::Triple::thumb:
50 case llvm::Triple::thumbeb: {
51 StringRef MArch, MCPU;
54 CmdArgs.push_back(Args.MakeArgString(
"-mcpu=" + Arch));
58 case llvm::Triple::mips:
59 case llvm::Triple::mipsel:
60 case llvm::Triple::mips64:
61 case llvm::Triple::mips64el: {
66 CmdArgs.push_back(
"-march");
67 CmdArgs.push_back(CPUName.data());
69 CmdArgs.push_back(
"-mabi");
72 if (Triple.isLittleEndian())
73 CmdArgs.push_back(
"-EL");
75 CmdArgs.push_back(
"-EB");
81 case llvm::Triple::sparc:
82 case llvm::Triple::sparcel: {
83 CmdArgs.push_back(
"-32");
90 case llvm::Triple::sparcv9: {
91 CmdArgs.push_back(
"-64");
102 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
104 CmdArgs.push_back(
"-o");
107 for (
const auto &II : Inputs)
108 CmdArgs.push_back(II.getFilename());
111 C.addCommand(std::make_unique<Command>(JA, *
this,
113 Exec, CmdArgs, Inputs, Output));
120 const char *LinkingOutput)
const {
126 ArgStringList CmdArgs;
129 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
131 CmdArgs.push_back(
"--eh-frame-hdr");
132 if (Args.hasArg(options::OPT_static)) {
133 CmdArgs.push_back(
"-Bstatic");
134 if (Args.hasArg(options::OPT_pie)) {
135 Args.AddAllArgs(CmdArgs, options::OPT_pie);
136 CmdArgs.push_back(
"--no-dynamic-linker");
139 if (Args.hasArg(options::OPT_rdynamic))
140 CmdArgs.push_back(
"-export-dynamic");
141 if (Args.hasArg(options::OPT_shared)) {
142 CmdArgs.push_back(
"-shared");
143 }
else if (!Args.hasArg(options::OPT_r)) {
144 Args.AddAllArgs(CmdArgs, options::OPT_pie);
145 CmdArgs.push_back(
"-dynamic-linker");
146 CmdArgs.push_back(
"/libexec/ld.elf_so");
153 case llvm::Triple::x86:
154 CmdArgs.push_back(
"-m");
155 CmdArgs.push_back(
"elf_i386");
157 case llvm::Triple::arm:
158 case llvm::Triple::thumb:
159 CmdArgs.push_back(
"-m");
160 switch (Triple.getEnvironment()) {
161 case llvm::Triple::EABI:
162 case llvm::Triple::GNUEABI:
163 CmdArgs.push_back(
"armelf_nbsd_eabi");
165 case llvm::Triple::EABIHF:
166 case llvm::Triple::GNUEABIHF:
167 CmdArgs.push_back(
"armelf_nbsd_eabihf");
170 CmdArgs.push_back(
"armelf_nbsd");
174 case llvm::Triple::armeb:
175 case llvm::Triple::thumbeb:
177 CmdArgs.push_back(
"-m");
178 switch (Triple.getEnvironment()) {
179 case llvm::Triple::EABI:
180 case llvm::Triple::GNUEABI:
181 CmdArgs.push_back(
"armelfb_nbsd_eabi");
183 case llvm::Triple::EABIHF:
184 case llvm::Triple::GNUEABIHF:
185 CmdArgs.push_back(
"armelfb_nbsd_eabihf");
188 CmdArgs.push_back(
"armelfb_nbsd");
192 case llvm::Triple::mips64:
193 case llvm::Triple::mips64el:
195 CmdArgs.push_back(
"-m");
197 CmdArgs.push_back(
"elf32btsmip");
199 CmdArgs.push_back(
"elf32ltsmip");
201 CmdArgs.push_back(
"-m");
203 CmdArgs.push_back(
"elf64btsmip");
205 CmdArgs.push_back(
"elf64ltsmip");
208 case llvm::Triple::ppc:
209 CmdArgs.push_back(
"-m");
210 CmdArgs.push_back(
"elf32ppc_nbsd");
213 case llvm::Triple::ppc64:
214 case llvm::Triple::ppc64le:
215 CmdArgs.push_back(
"-m");
216 CmdArgs.push_back(
"elf64ppc");
219 case llvm::Triple::riscv32:
220 CmdArgs.push_back(
"-m");
221 CmdArgs.push_back(
"elf32lriscv");
224 case llvm::Triple::riscv64:
225 CmdArgs.push_back(
"-m");
226 CmdArgs.push_back(
"elf64lriscv");
229 case llvm::Triple::sparc:
230 CmdArgs.push_back(
"-m");
231 CmdArgs.push_back(
"elf32_sparc");
234 case llvm::Triple::sparcv9:
235 CmdArgs.push_back(
"-m");
236 CmdArgs.push_back(
"elf64_sparc");
243 if (Triple.isRISCV())
244 CmdArgs.push_back(
"-X");
248 CmdArgs.push_back(
"-o");
252 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
254 if (!Args.hasArg(options::OPT_shared)) {
260 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
269 Args.AddAllArgs(CmdArgs, options::OPT_L);
270 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
271 Args.AddAllArgs(CmdArgs, options::OPT_s);
272 Args.AddAllArgs(CmdArgs, options::OPT_t);
273 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
274 Args.AddAllArgs(CmdArgs, options::OPT_r);
282 CmdArgs.push_back(
"-rpath");
286 bool useLibgcc =
true;
288 case llvm::Triple::aarch64:
289 case llvm::Triple::aarch64_be:
290 case llvm::Triple::arm:
291 case llvm::Triple::armeb:
292 case llvm::Triple::thumb:
293 case llvm::Triple::thumbeb:
294 case llvm::Triple::ppc:
295 case llvm::Triple::ppc64:
296 case llvm::Triple::ppc64le:
297 case llvm::Triple::riscv32:
298 case llvm::Triple::riscv64:
299 case llvm::Triple::sparc:
300 case llvm::Triple::sparcv9:
301 case llvm::Triple::x86:
302 case llvm::Triple::x86_64:
309 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
312 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
313 !Args.hasArg(options::OPT_static);
319 CmdArgs.push_back(
"-lm");
321 if (NeedsSanitizerDeps)
325 if (Args.hasArg(options::OPT_pthread))
326 CmdArgs.push_back(
"-lpthread");
327 CmdArgs.push_back(
"-lc");
330 if (Args.hasArg(options::OPT_static)) {
334 CmdArgs.push_back(
"-lgcc_eh");
335 CmdArgs.push_back(
"-lc");
336 CmdArgs.push_back(
"-lgcc");
338 CmdArgs.push_back(
"-lgcc");
339 CmdArgs.push_back(
"--as-needed");
340 CmdArgs.push_back(
"-lgcc_s");
341 CmdArgs.push_back(
"--no-as-needed");
346 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
348 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
360 C.addCommand(std::make_unique<Command>(JA, *
this,
362 Exec, CmdArgs, Inputs, Output));
369 if (!Args.hasArg(options::OPT_nostdlib)) {
375 switch (Triple.getArch()) {
376 case llvm::Triple::x86:
379 case llvm::Triple::arm:
380 case llvm::Triple::armeb:
381 case llvm::Triple::thumb:
382 case llvm::Triple::thumbeb:
383 switch (Triple.getEnvironment()) {
384 case llvm::Triple::EABI:
385 case llvm::Triple::GNUEABI:
388 case llvm::Triple::EABIHF:
389 case llvm::Triple::GNUEABIHF:
397 case llvm::Triple::mips64:
398 case llvm::Triple::mips64el:
404 case llvm::Triple::ppc:
407 case llvm::Triple::sparc:
426 case llvm::Triple::aarch64:
427 case llvm::Triple::aarch64_be:
428 case llvm::Triple::arm:
429 case llvm::Triple::armeb:
430 case llvm::Triple::thumb:
431 case llvm::Triple::thumbeb:
432 case llvm::Triple::ppc:
433 case llvm::Triple::ppc64:
434 case llvm::Triple::ppc64le:
435 case llvm::Triple::riscv32:
436 case llvm::Triple::riscv64:
437 case llvm::Triple::sparc:
438 case llvm::Triple::sparcv9:
439 case llvm::Triple::x86:
440 case llvm::Triple::x86_64:
449 const llvm::opt::ArgList &DriverArgs,
450 llvm::opt::ArgStringList &CC1Args)
const {
453 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
456 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
458 llvm::sys::path::append(Dir,
"include");
462 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
466 StringRef CIncludeDirs(C_INCLUDE_DIRS);
467 if (CIncludeDirs !=
"") {
469 CIncludeDirs.split(dirs,
":");
470 for (StringRef dir : dirs) {
472 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
483 llvm::opt::ArgStringList &CC1Args)
const {
484 const std::string Candidates[] = {
493 for (
const auto &IncludePath : Candidates) {
494 if (!
getVFS().exists(IncludePath +
"/__config"))
504 llvm::opt::ArgStringList &CC1Args)
const {
506 DriverArgs, CC1Args);
511 llvm::Triple::ArchType TArch =
getTriple().getArch();
512 if (TArch == llvm::Triple::arm || TArch == llvm::Triple::armeb ||
513 TArch == llvm::Triple::thumb || TArch == llvm::Triple::thumbeb)
514 return llvm::ExceptionHandling::DwarfCFI;
515 return llvm::ExceptionHandling::None;
519 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
520 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
522 if (IsX86 || IsX86_64) {
523 Res |= SanitizerKind::Address;
524 Res |= SanitizerKind::PointerCompare;
525 Res |= SanitizerKind::PointerSubtract;
526 Res |= SanitizerKind::Leak;
527 Res |= SanitizerKind::SafeStack;
528 Res |= SanitizerKind::Scudo;
529 Res |= SanitizerKind::Vptr;
532 Res |= SanitizerKind::DataFlow;
533 Res |= SanitizerKind::Fuzzer;
534 Res |= SanitizerKind::FuzzerNoLink;
535 Res |= SanitizerKind::HWAddress;
536 Res |= SanitizerKind::KernelAddress;
537 Res |= SanitizerKind::KernelHWAddress;
538 Res |= SanitizerKind::KernelMemory;
539 Res |= SanitizerKind::Memory;
540 Res |= SanitizerKind::Thread;
546 ArgStringList &CC1Args,
550 CC1Args.push_back(
"-D_REENTRANT");
552 VersionTuple OsVersion =
getTriple().getOSVersion();
553 bool UseInitArrayDefault =
554 OsVersion >= VersionTuple(9) || OsVersion.getMajor() == 0 ||
555 getTriple().getArch() == llvm::Triple::aarch64 ||
556 getTriple().getArch() == llvm::Triple::aarch64_be ||
557 getTriple().getArch() == llvm::Triple::arm ||
558 getTriple().getArch() == llvm::Triple::armeb ||
559 getTriple().getArch() == llvm::Triple::riscv32 ||
560 getTriple().getArch() == llvm::Triple::riscv64;
562 if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
563 options::OPT_fno_use_init_array, UseInitArrayDefault))
564 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
std::string ResourceDir
The path to the compiler resource directory.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
bool hasAnySanitizer() const
bool needsSharedRt() const
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport AtFileCurCP()