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(llvm::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");
204 if (Arg *A = Args.getLastArg(options::OPT_G)) {
206 StringRef
v = A->getValue();
207 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
213 CmdArgs.push_back(
"-o");
216 assert(Output.
isNothing() &&
"Invalid output.");
219 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
220 const char *crt1 =
nullptr;
221 if (!Args.hasArg(options::OPT_shared)) {
222 if (Args.hasArg(options::OPT_pg))
230 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crt1)));
232 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
234 const char *crtbegin =
nullptr;
235 if (Args.hasArg(options::OPT_static))
236 crtbegin =
"crtbeginT.o";
237 else if (Args.hasArg(options::OPT_shared) || IsPIE)
238 crtbegin =
"crtbeginS.o";
240 crtbegin =
"crtbegin.o";
242 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crtbegin)));
245 Args.AddAllArgs(CmdArgs, options::OPT_L);
247 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
248 Args.AddAllArgs(CmdArgs, options::OPT_e);
249 Args.AddAllArgs(CmdArgs, options::OPT_s);
250 Args.AddAllArgs(CmdArgs, options::OPT_t);
251 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
252 Args.AddAllArgs(CmdArgs, options::OPT_r);
255 assert(!Inputs.empty() &&
"Must have at least one input.");
264 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
269 if (Args.hasArg(options::OPT_pg))
270 CmdArgs.push_back(
"-lm_p");
272 CmdArgs.push_back(
"-lm");
274 if (NeedsSanitizerDeps)
280 if (Args.hasArg(options::OPT_pg))
281 CmdArgs.push_back(
"-lgcc_p");
283 CmdArgs.push_back(
"-lgcc");
284 if (Args.hasArg(options::OPT_static)) {
285 CmdArgs.push_back(
"-lgcc_eh");
286 }
else if (Args.hasArg(options::OPT_pg)) {
287 CmdArgs.push_back(
"-lgcc_eh_p");
289 CmdArgs.push_back(
"--as-needed");
290 CmdArgs.push_back(
"-lgcc_s");
291 CmdArgs.push_back(
"--no-as-needed");
294 if (Args.hasArg(options::OPT_pthread)) {
295 if (Args.hasArg(options::OPT_pg))
296 CmdArgs.push_back(
"-lpthread_p");
298 CmdArgs.push_back(
"-lpthread");
301 if (Args.hasArg(options::OPT_pg)) {
302 if (Args.hasArg(options::OPT_shared))
303 CmdArgs.push_back(
"-lc");
305 CmdArgs.push_back(
"-lc_p");
306 CmdArgs.push_back(
"-lgcc_p");
308 CmdArgs.push_back(
"-lc");
309 CmdArgs.push_back(
"-lgcc");
312 if (Args.hasArg(options::OPT_static)) {
313 CmdArgs.push_back(
"-lgcc_eh");
314 }
else if (Args.hasArg(options::OPT_pg)) {
315 CmdArgs.push_back(
"-lgcc_eh_p");
317 CmdArgs.push_back(
"--as-needed");
318 CmdArgs.push_back(
"-lgcc_s");
319 CmdArgs.push_back(
"--no-as-needed");
323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
324 if (Args.hasArg(options::OPT_shared) || IsPIE)
325 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
327 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
328 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
333 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
334 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
339 FreeBSD::FreeBSD(
const Driver &D,
const llvm::Triple &Triple,
345 if ((Triple.getArch() == llvm::Triple::x86 || Triple.isMIPS32() ||
346 Triple.getArch() == llvm::Triple::ppc) &&
354 if (
getTriple().getOSMajorVersion() >= 10)
360 const llvm::opt::ArgList &DriverArgs,
361 llvm::opt::ArgStringList &CC1Args)
const {
363 "",
"", DriverArgs, CC1Args);
367 ArgStringList &CmdArgs)
const {
369 bool Profiling = Args.hasArg(options::OPT_pg);
373 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
377 CmdArgs.push_back(Profiling ?
"-lstdc++_p" :
"-lstdc++");
391 case llvm::Triple::GNUEABIHF:
392 case llvm::Triple::GNUEABI:
393 case llvm::Triple::EABI:
398 return llvm::ExceptionHandling::SjLj;
408 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
409 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
410 const bool IsMIPS64 =
getTriple().isMIPS64();
412 Res |= SanitizerKind::Address;
413 Res |= SanitizerKind::PointerCompare;
414 Res |= SanitizerKind::PointerSubtract;
415 Res |= SanitizerKind::Vptr;
416 if (IsX86_64 || IsMIPS64) {
417 Res |= SanitizerKind::Leak;
418 Res |= SanitizerKind::Thread;
420 if (IsX86 || IsX86_64) {
422 Res |= SanitizerKind::SafeStack;
423 Res |= SanitizerKind::Fuzzer;
424 Res |= SanitizerKind::FuzzerNoLink;
427 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.