17 #include "llvm/Option/ArgList.h" 18 #include "llvm/Support/VirtualFileSystem.h" 23 using namespace clang;
30 const char *LinkingOutput)
const {
32 ArgStringList CmdArgs;
36 switch (getToolChain().getArch()) {
39 case llvm::Triple::x86:
40 CmdArgs.push_back(
"--32");
42 case llvm::Triple::ppc:
43 CmdArgs.push_back(
"-a32");
45 case llvm::Triple::mips:
46 case llvm::Triple::mipsel:
47 case llvm::Triple::mips64:
48 case llvm::Triple::mips64el: {
53 CmdArgs.push_back(
"-march");
54 CmdArgs.push_back(CPUName.data());
56 CmdArgs.push_back(
"-mabi");
59 if (getToolChain().getTriple().isLittleEndian())
60 CmdArgs.push_back(
"-EL");
62 CmdArgs.push_back(
"-EB");
64 if (Arg *A = Args.getLastArg(options::OPT_G)) {
65 StringRef
v = A->getValue();
66 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
73 case llvm::Triple::arm:
74 case llvm::Triple::armeb:
75 case llvm::Triple::thumb:
76 case llvm::Triple::thumbeb: {
80 CmdArgs.push_back(
"-mfpu=vfp");
82 CmdArgs.push_back(
"-mfpu=softvfp");
84 switch (getToolChain().getTriple().getEnvironment()) {
85 case llvm::Triple::GNUEABIHF:
86 case llvm::Triple::GNUEABI:
87 case llvm::Triple::EABI:
88 CmdArgs.push_back(
"-meabi=5");
92 CmdArgs.push_back(
"-matpcs");
96 case llvm::Triple::sparc:
97 case llvm::Triple::sparcel:
98 case llvm::Triple::sparcv9: {
99 std::string CPU =
getCPUName(Args, getToolChain().getTriple());
106 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
108 CmdArgs.push_back(
"-o");
111 for (
const auto &II : Inputs)
112 CmdArgs.push_back(II.getFilename());
114 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
115 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
122 const char *LinkingOutput)
const {
126 const llvm::Triple::ArchType Arch = ToolChain.
getArch();
128 !Args.hasArg(options::OPT_shared) &&
129 (Args.hasArg(options::OPT_pie) || ToolChain.
isPIEDefault());
130 ArgStringList CmdArgs;
133 Args.ClaimAllArgs(options::OPT_g_Group);
135 Args.ClaimAllArgs(options::OPT_emit_llvm);
138 Args.ClaimAllArgs(options::OPT_w);
141 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
144 CmdArgs.push_back(
"-pie");
146 CmdArgs.push_back(
"--eh-frame-hdr");
147 if (Args.hasArg(options::OPT_static)) {
148 CmdArgs.push_back(
"-Bstatic");
150 if (Args.hasArg(options::OPT_rdynamic))
151 CmdArgs.push_back(
"-export-dynamic");
152 if (Args.hasArg(options::OPT_shared)) {
153 CmdArgs.push_back(
"-Bshareable");
155 CmdArgs.push_back(
"-dynamic-linker");
156 CmdArgs.push_back(
"/libexec/ld-elf.so.1");
158 if (ToolChain.
getTriple().getOSMajorVersion() >= 9) {
159 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
160 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
161 CmdArgs.push_back(
"--hash-style=both");
164 CmdArgs.push_back(
"--enable-new-dtags");
170 case llvm::Triple::x86:
171 CmdArgs.push_back(
"-m");
172 CmdArgs.push_back(
"elf_i386_fbsd");
174 case llvm::Triple::ppc:
175 CmdArgs.push_back(
"-m");
176 CmdArgs.push_back(
"elf32ppc_fbsd");
178 case llvm::Triple::mips:
179 CmdArgs.push_back(
"-m");
180 CmdArgs.push_back(
"elf32btsmip_fbsd");
182 case llvm::Triple::mipsel:
183 CmdArgs.push_back(
"-m");
184 CmdArgs.push_back(
"elf32ltsmip_fbsd");
186 case llvm::Triple::mips64:
187 CmdArgs.push_back(
"-m");
189 CmdArgs.push_back(
"elf32btsmipn32_fbsd");
191 CmdArgs.push_back(
"elf64btsmip_fbsd");
193 case llvm::Triple::mips64el:
194 CmdArgs.push_back(
"-m");
196 CmdArgs.push_back(
"elf32ltsmipn32_fbsd");
198 CmdArgs.push_back(
"elf64ltsmip_fbsd");
200 case llvm::Triple::riscv32:
201 CmdArgs.push_back(
"-m");
202 CmdArgs.push_back(
"elf32lriscv");
204 case llvm::Triple::riscv64:
205 CmdArgs.push_back(
"-m");
206 CmdArgs.push_back(
"elf64lriscv");
212 if (Arg *A = Args.getLastArg(options::OPT_G)) {
214 StringRef
v = A->getValue();
215 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
221 CmdArgs.push_back(
"-o");
224 assert(Output.
isNothing() &&
"Invalid output.");
227 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
228 const char *crt1 =
nullptr;
229 if (!Args.hasArg(options::OPT_shared)) {
230 if (Args.hasArg(options::OPT_pg))
238 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crt1)));
240 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
242 const char *crtbegin =
nullptr;
243 if (Args.hasArg(options::OPT_static))
244 crtbegin =
"crtbeginT.o";
245 else if (Args.hasArg(options::OPT_shared) || IsPIE)
246 crtbegin =
"crtbeginS.o";
248 crtbegin =
"crtbegin.o";
250 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crtbegin)));
253 Args.AddAllArgs(CmdArgs, options::OPT_L);
255 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
256 Args.AddAllArgs(CmdArgs, options::OPT_e);
257 Args.AddAllArgs(CmdArgs, options::OPT_s);
258 Args.AddAllArgs(CmdArgs, options::OPT_t);
259 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
260 Args.AddAllArgs(CmdArgs, options::OPT_r);
263 assert(!Inputs.empty() &&
"Must have at least one input.");
272 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
274 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
275 !Args.hasArg(options::OPT_static);
281 if (Args.hasArg(options::OPT_pg))
282 CmdArgs.push_back(
"-lm_p");
284 CmdArgs.push_back(
"-lm");
286 if (NeedsSanitizerDeps)
292 if (Args.hasArg(options::OPT_pg))
293 CmdArgs.push_back(
"-lgcc_p");
295 CmdArgs.push_back(
"-lgcc");
296 if (Args.hasArg(options::OPT_static)) {
297 CmdArgs.push_back(
"-lgcc_eh");
298 }
else if (Args.hasArg(options::OPT_pg)) {
299 CmdArgs.push_back(
"-lgcc_eh_p");
301 CmdArgs.push_back(
"--as-needed");
302 CmdArgs.push_back(
"-lgcc_s");
303 CmdArgs.push_back(
"--no-as-needed");
306 if (Args.hasArg(options::OPT_pthread)) {
307 if (Args.hasArg(options::OPT_pg))
308 CmdArgs.push_back(
"-lpthread_p");
310 CmdArgs.push_back(
"-lpthread");
313 if (Args.hasArg(options::OPT_pg)) {
314 if (Args.hasArg(options::OPT_shared))
315 CmdArgs.push_back(
"-lc");
317 CmdArgs.push_back(
"-lc_p");
318 CmdArgs.push_back(
"-lgcc_p");
320 CmdArgs.push_back(
"-lc");
321 CmdArgs.push_back(
"-lgcc");
324 if (Args.hasArg(options::OPT_static)) {
325 CmdArgs.push_back(
"-lgcc_eh");
326 }
else if (Args.hasArg(options::OPT_pg)) {
327 CmdArgs.push_back(
"-lgcc_eh_p");
329 CmdArgs.push_back(
"--as-needed");
330 CmdArgs.push_back(
"-lgcc_s");
331 CmdArgs.push_back(
"--no-as-needed");
335 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
336 if (Args.hasArg(options::OPT_shared) || IsPIE)
337 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
339 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
340 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
345 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
346 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
351 FreeBSD::FreeBSD(
const Driver &D,
const llvm::Triple &Triple,
357 if ((Triple.getArch() == llvm::Triple::x86 || Triple.isMIPS32() ||
358 Triple.getArch() == llvm::Triple::ppc) &&
366 if (
getTriple().getOSMajorVersion() >= 10)
372 if (
getTriple().getOSMajorVersion() < 12)
378 const llvm::opt::ArgList &DriverArgs,
379 llvm::opt::ArgStringList &CC1Args)
const {
381 "",
"", DriverArgs, CC1Args);
385 ArgStringList &CmdArgs)
const {
387 bool Profiling = Args.hasArg(options::OPT_pg);
391 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
395 CmdArgs.push_back(Profiling ?
"-lstdc++_p" :
"-lstdc++");
409 case llvm::Triple::GNUEABIHF:
410 case llvm::Triple::GNUEABI:
411 case llvm::Triple::EABI:
416 return llvm::ExceptionHandling::SjLj;
426 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
427 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
428 const bool IsMIPS64 =
getTriple().isMIPS64();
430 Res |= SanitizerKind::Address;
431 Res |= SanitizerKind::PointerCompare;
432 Res |= SanitizerKind::PointerSubtract;
433 Res |= SanitizerKind::Vptr;
434 if (IsX86_64 || IsMIPS64) {
435 Res |= SanitizerKind::Leak;
436 Res |= SanitizerKind::Thread;
438 if (IsX86 || IsX86_64) {
440 Res |= SanitizerKind::SafeStack;
441 Res |= SanitizerKind::Fuzzer;
442 Res |= SanitizerKind::FuzzerNoLink;
445 Res |= SanitizerKind::Memory;
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)
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.