18 #include "llvm/Option/ArgList.h" 19 #include "llvm/Support/VirtualFileSystem.h" 24 using namespace clang;
31 const char *LinkingOutput)
const {
33 ArgStringList CmdArgs;
34 const auto &D = getToolChain().getDriver();
38 switch (getToolChain().getArch()) {
41 case llvm::Triple::x86:
42 CmdArgs.push_back(
"--32");
44 case llvm::Triple::ppc:
45 CmdArgs.push_back(
"-a32");
47 case llvm::Triple::mips:
48 case llvm::Triple::mipsel:
49 case llvm::Triple::mips64:
50 case llvm::Triple::mips64el: {
55 CmdArgs.push_back(
"-march");
56 CmdArgs.push_back(CPUName.data());
58 CmdArgs.push_back(
"-mabi");
61 if (getToolChain().getTriple().isLittleEndian())
62 CmdArgs.push_back(
"-EL");
64 CmdArgs.push_back(
"-EB");
66 if (Arg *A = Args.getLastArg(options::OPT_G)) {
67 StringRef
v = A->getValue();
68 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
75 case llvm::Triple::arm:
76 case llvm::Triple::armeb:
77 case llvm::Triple::thumb:
78 case llvm::Triple::thumbeb: {
82 CmdArgs.push_back(
"-mfpu=vfp");
84 CmdArgs.push_back(
"-mfpu=softvfp");
86 switch (getToolChain().getTriple().getEnvironment()) {
87 case llvm::Triple::GNUEABIHF:
88 case llvm::Triple::GNUEABI:
89 case llvm::Triple::EABI:
90 CmdArgs.push_back(
"-meabi=5");
94 CmdArgs.push_back(
"-matpcs");
98 case llvm::Triple::sparc:
99 case llvm::Triple::sparcel:
100 case llvm::Triple::sparcv9: {
101 std::string CPU =
getCPUName(Args, getToolChain().getTriple());
108 for (
const Arg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
109 options::OPT_fdebug_prefix_map_EQ)) {
110 StringRef Map = A->getValue();
111 if (Map.find(
'=') == StringRef::npos)
112 D.Diag(diag::err_drv_invalid_argument_to_option)
113 << Map << A->getOption().getName();
115 CmdArgs.push_back(Args.MakeArgString(
"--debug-prefix-map"));
116 CmdArgs.push_back(Args.MakeArgString(Map));
121 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
123 CmdArgs.push_back(
"-o");
126 for (
const auto &II : Inputs)
127 CmdArgs.push_back(II.getFilename());
129 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
130 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
137 const char *LinkingOutput)
const {
141 const llvm::Triple::ArchType Arch = ToolChain.
getArch();
143 !Args.hasArg(options::OPT_shared) &&
144 (Args.hasArg(options::OPT_pie) || ToolChain.
isPIEDefault());
145 ArgStringList CmdArgs;
148 Args.ClaimAllArgs(options::OPT_g_Group);
150 Args.ClaimAllArgs(options::OPT_emit_llvm);
153 Args.ClaimAllArgs(options::OPT_w);
156 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
159 CmdArgs.push_back(
"-pie");
161 CmdArgs.push_back(
"--eh-frame-hdr");
162 if (Args.hasArg(options::OPT_static)) {
163 CmdArgs.push_back(
"-Bstatic");
165 if (Args.hasArg(options::OPT_rdynamic))
166 CmdArgs.push_back(
"-export-dynamic");
167 if (Args.hasArg(options::OPT_shared)) {
168 CmdArgs.push_back(
"-Bshareable");
170 CmdArgs.push_back(
"-dynamic-linker");
171 CmdArgs.push_back(
"/libexec/ld-elf.so.1");
173 const llvm::Triple &T = ToolChain.
getTriple();
174 if (T.getOSMajorVersion() >= 9) {
175 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc || T.isX86())
176 CmdArgs.push_back(
"--hash-style=both");
178 CmdArgs.push_back(
"--enable-new-dtags");
184 case llvm::Triple::x86:
185 CmdArgs.push_back(
"-m");
186 CmdArgs.push_back(
"elf_i386_fbsd");
188 case llvm::Triple::ppc:
189 CmdArgs.push_back(
"-m");
190 CmdArgs.push_back(
"elf32ppc_fbsd");
192 case llvm::Triple::mips:
193 CmdArgs.push_back(
"-m");
194 CmdArgs.push_back(
"elf32btsmip_fbsd");
196 case llvm::Triple::mipsel:
197 CmdArgs.push_back(
"-m");
198 CmdArgs.push_back(
"elf32ltsmip_fbsd");
200 case llvm::Triple::mips64:
201 CmdArgs.push_back(
"-m");
203 CmdArgs.push_back(
"elf32btsmipn32_fbsd");
205 CmdArgs.push_back(
"elf64btsmip_fbsd");
207 case llvm::Triple::mips64el:
208 CmdArgs.push_back(
"-m");
210 CmdArgs.push_back(
"elf32ltsmipn32_fbsd");
212 CmdArgs.push_back(
"elf64ltsmip_fbsd");
214 case llvm::Triple::riscv32:
215 CmdArgs.push_back(
"-m");
216 CmdArgs.push_back(
"elf32lriscv");
218 case llvm::Triple::riscv64:
219 CmdArgs.push_back(
"-m");
220 CmdArgs.push_back(
"elf64lriscv");
226 if (Arg *A = Args.getLastArg(options::OPT_G)) {
228 StringRef
v = A->getValue();
229 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
235 CmdArgs.push_back(
"-o");
238 assert(Output.
isNothing() &&
"Invalid output.");
241 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
242 const char *crt1 =
nullptr;
243 if (!Args.hasArg(options::OPT_shared)) {
244 if (Args.hasArg(options::OPT_pg))
252 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crt1)));
254 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
256 const char *crtbegin =
nullptr;
257 if (Args.hasArg(options::OPT_static))
258 crtbegin =
"crtbeginT.o";
259 else if (Args.hasArg(options::OPT_shared) || IsPIE)
260 crtbegin =
"crtbeginS.o";
262 crtbegin =
"crtbegin.o";
264 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crtbegin)));
267 Args.AddAllArgs(CmdArgs, options::OPT_L);
269 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
270 Args.AddAllArgs(CmdArgs, options::OPT_e);
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);
277 assert(!Inputs.empty() &&
"Must have at least one input.");
286 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
288 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
289 !Args.hasArg(options::OPT_static);
295 if (Args.hasArg(options::OPT_pg))
296 CmdArgs.push_back(
"-lm_p");
298 CmdArgs.push_back(
"-lm");
300 if (NeedsSanitizerDeps)
306 if (Args.hasArg(options::OPT_pg))
307 CmdArgs.push_back(
"-lgcc_p");
309 CmdArgs.push_back(
"-lgcc");
310 if (Args.hasArg(options::OPT_static)) {
311 CmdArgs.push_back(
"-lgcc_eh");
312 }
else if (Args.hasArg(options::OPT_pg)) {
313 CmdArgs.push_back(
"-lgcc_eh_p");
315 CmdArgs.push_back(
"--as-needed");
316 CmdArgs.push_back(
"-lgcc_s");
317 CmdArgs.push_back(
"--no-as-needed");
320 if (Args.hasArg(options::OPT_pthread)) {
321 if (Args.hasArg(options::OPT_pg))
322 CmdArgs.push_back(
"-lpthread_p");
324 CmdArgs.push_back(
"-lpthread");
327 if (Args.hasArg(options::OPT_pg)) {
328 if (Args.hasArg(options::OPT_shared))
329 CmdArgs.push_back(
"-lc");
331 CmdArgs.push_back(
"-lc_p");
332 CmdArgs.push_back(
"-lgcc_p");
334 CmdArgs.push_back(
"-lc");
335 CmdArgs.push_back(
"-lgcc");
338 if (Args.hasArg(options::OPT_static)) {
339 CmdArgs.push_back(
"-lgcc_eh");
340 }
else if (Args.hasArg(options::OPT_pg)) {
341 CmdArgs.push_back(
"-lgcc_eh_p");
343 CmdArgs.push_back(
"--as-needed");
344 CmdArgs.push_back(
"-lgcc_s");
345 CmdArgs.push_back(
"--no-as-needed");
349 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
350 if (Args.hasArg(options::OPT_shared) || IsPIE)
351 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
353 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
354 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
359 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
360 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
365 FreeBSD::FreeBSD(
const Driver &D,
const llvm::Triple &Triple,
371 if ((Triple.getArch() == llvm::Triple::x86 || Triple.isMIPS32() ||
372 Triple.getArch() == llvm::Triple::ppc) &&
380 if (
getTriple().getOSMajorVersion() >= 10)
386 if (
getTriple().getOSMajorVersion() < 12)
392 const llvm::opt::ArgList &DriverArgs,
393 llvm::opt::ArgStringList &CC1Args)
const {
395 "",
"", DriverArgs, CC1Args);
399 ArgStringList &CmdArgs)
const {
401 bool Profiling = Args.hasArg(options::OPT_pg);
405 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
409 CmdArgs.push_back(Profiling ?
"-lstdc++_p" :
"-lstdc++");
415 ArgStringList &CC1Args)
const {
428 case llvm::Triple::GNUEABIHF:
429 case llvm::Triple::GNUEABI:
430 case llvm::Triple::EABI:
435 return llvm::ExceptionHandling::SjLj;
447 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
448 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
449 const bool IsMIPS64 =
getTriple().isMIPS64();
451 Res |= SanitizerKind::Address;
452 Res |= SanitizerKind::PointerCompare;
453 Res |= SanitizerKind::PointerSubtract;
454 Res |= SanitizerKind::Vptr;
455 if (IsX86_64 || IsMIPS64) {
456 Res |= SanitizerKind::Leak;
457 Res |= SanitizerKind::Thread;
459 if (IsX86 || IsX86_64) {
461 Res |= SanitizerKind::SafeStack;
462 Res |= SanitizerKind::Fuzzer;
463 Res |= SanitizerKind::FuzzerNoLink;
466 Res |= SanitizerKind::Memory;
471 ArgStringList &CC1Args,
473 if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
474 options::OPT_fno_use_init_array,
476 CC1Args.push_back(
"-fno-use-init-array");
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
The base class of the type hierarchy.
constexpr XRayInstrMask Function
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
llvm::vfs::FileSystem & getVFS() const
void addCommand(std::unique_ptr< Command > C)
void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
constexpr XRayInstrMask None
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
Compilation - A set of tasks to perform for a single driver invocation.