19 #include "llvm/Option/ArgList.h" 24 using namespace clang;
31 const char *LinkingOutput)
const {
33 ArgStringList CmdArgs;
37 switch (getToolChain().getArch()) {
40 case llvm::Triple::x86:
41 CmdArgs.push_back(
"--32");
43 case llvm::Triple::ppc:
44 CmdArgs.push_back(
"-a32");
46 case llvm::Triple::mips:
47 case llvm::Triple::mipsel:
48 case llvm::Triple::mips64:
49 case llvm::Triple::mips64el: {
54 CmdArgs.push_back(
"-march");
55 CmdArgs.push_back(CPUName.data());
57 CmdArgs.push_back(
"-mabi");
60 if (getToolChain().getTriple().isLittleEndian())
61 CmdArgs.push_back(
"-EL");
63 CmdArgs.push_back(
"-EB");
65 if (Arg *A = Args.getLastArg(options::OPT_G)) {
66 StringRef
v = A->getValue();
67 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
74 case llvm::Triple::arm:
75 case llvm::Triple::armeb:
76 case llvm::Triple::thumb:
77 case llvm::Triple::thumbeb: {
81 CmdArgs.push_back(
"-mfpu=vfp");
83 CmdArgs.push_back(
"-mfpu=softvfp");
85 switch (getToolChain().getTriple().getEnvironment()) {
86 case llvm::Triple::GNUEABIHF:
87 case llvm::Triple::GNUEABI:
88 case llvm::Triple::EABI:
89 CmdArgs.push_back(
"-meabi=5");
93 CmdArgs.push_back(
"-matpcs");
97 case llvm::Triple::sparc:
98 case llvm::Triple::sparcel:
99 case llvm::Triple::sparcv9: {
100 std::string CPU =
getCPUName(Args, getToolChain().getTriple());
107 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
109 CmdArgs.push_back(
"-o");
112 for (
const auto &II : Inputs)
113 CmdArgs.push_back(II.getFilename());
115 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
116 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
123 const char *LinkingOutput)
const {
127 const llvm::Triple::ArchType Arch = ToolChain.
getArch();
129 !Args.hasArg(options::OPT_shared) &&
130 (Args.hasArg(options::OPT_pie) || ToolChain.
isPIEDefault());
131 ArgStringList CmdArgs;
134 Args.ClaimAllArgs(options::OPT_g_Group);
136 Args.ClaimAllArgs(options::OPT_emit_llvm);
139 Args.ClaimAllArgs(options::OPT_w);
142 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
145 CmdArgs.push_back(
"-pie");
147 CmdArgs.push_back(
"--eh-frame-hdr");
148 if (Args.hasArg(options::OPT_static)) {
149 CmdArgs.push_back(
"-Bstatic");
151 if (Args.hasArg(options::OPT_rdynamic))
152 CmdArgs.push_back(
"-export-dynamic");
153 if (Args.hasArg(options::OPT_shared)) {
154 CmdArgs.push_back(
"-Bshareable");
156 CmdArgs.push_back(
"-dynamic-linker");
157 CmdArgs.push_back(
"/libexec/ld-elf.so.1");
159 if (ToolChain.
getTriple().getOSMajorVersion() >= 9) {
160 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
161 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
162 CmdArgs.push_back(
"--hash-style=both");
165 CmdArgs.push_back(
"--enable-new-dtags");
171 case llvm::Triple::x86:
172 CmdArgs.push_back(
"-m");
173 CmdArgs.push_back(
"elf_i386_fbsd");
175 case llvm::Triple::ppc:
176 CmdArgs.push_back(
"-m");
177 CmdArgs.push_back(
"elf32ppc_fbsd");
179 case llvm::Triple::mips:
180 CmdArgs.push_back(
"-m");
181 CmdArgs.push_back(
"elf32btsmip_fbsd");
183 case llvm::Triple::mipsel:
184 CmdArgs.push_back(
"-m");
185 CmdArgs.push_back(
"elf32ltsmip_fbsd");
187 case llvm::Triple::mips64:
188 CmdArgs.push_back(
"-m");
190 CmdArgs.push_back(
"elf32btsmipn32_fbsd");
192 CmdArgs.push_back(
"elf64btsmip_fbsd");
194 case llvm::Triple::mips64el:
195 CmdArgs.push_back(
"-m");
197 CmdArgs.push_back(
"elf32ltsmipn32_fbsd");
199 CmdArgs.push_back(
"elf64ltsmip_fbsd");
205 if (Arg *A = Args.getLastArg(options::OPT_G)) {
207 StringRef
v = A->getValue();
208 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
214 CmdArgs.push_back(
"-o");
217 assert(Output.
isNothing() &&
"Invalid output.");
220 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
221 const char *crt1 =
nullptr;
222 if (!Args.hasArg(options::OPT_shared)) {
223 if (Args.hasArg(options::OPT_pg))
231 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crt1)));
233 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
235 const char *crtbegin =
nullptr;
236 if (Args.hasArg(options::OPT_static))
237 crtbegin =
"crtbeginT.o";
238 else if (Args.hasArg(options::OPT_shared) || IsPIE)
239 crtbegin =
"crtbeginS.o";
241 crtbegin =
"crtbegin.o";
243 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crtbegin)));
246 Args.AddAllArgs(CmdArgs, options::OPT_L);
248 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
249 Args.AddAllArgs(CmdArgs, options::OPT_e);
250 Args.AddAllArgs(CmdArgs, options::OPT_s);
251 Args.AddAllArgs(CmdArgs, options::OPT_t);
252 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
253 Args.AddAllArgs(CmdArgs, options::OPT_r);
256 assert(!Inputs.empty() &&
"Must have at least one input.");
265 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
270 if (Args.hasArg(options::OPT_pg))
271 CmdArgs.push_back(
"-lm_p");
273 CmdArgs.push_back(
"-lm");
275 if (NeedsSanitizerDeps)
281 if (Args.hasArg(options::OPT_pg))
282 CmdArgs.push_back(
"-lgcc_p");
284 CmdArgs.push_back(
"-lgcc");
285 if (Args.hasArg(options::OPT_static)) {
286 CmdArgs.push_back(
"-lgcc_eh");
287 }
else if (Args.hasArg(options::OPT_pg)) {
288 CmdArgs.push_back(
"-lgcc_eh_p");
290 CmdArgs.push_back(
"--as-needed");
291 CmdArgs.push_back(
"-lgcc_s");
292 CmdArgs.push_back(
"--no-as-needed");
295 if (Args.hasArg(options::OPT_pthread)) {
296 if (Args.hasArg(options::OPT_pg))
297 CmdArgs.push_back(
"-lpthread_p");
299 CmdArgs.push_back(
"-lpthread");
302 if (Args.hasArg(options::OPT_pg)) {
303 if (Args.hasArg(options::OPT_shared))
304 CmdArgs.push_back(
"-lc");
306 CmdArgs.push_back(
"-lc_p");
307 CmdArgs.push_back(
"-lgcc_p");
309 CmdArgs.push_back(
"-lc");
310 CmdArgs.push_back(
"-lgcc");
313 if (Args.hasArg(options::OPT_static)) {
314 CmdArgs.push_back(
"-lgcc_eh");
315 }
else if (Args.hasArg(options::OPT_pg)) {
316 CmdArgs.push_back(
"-lgcc_eh_p");
318 CmdArgs.push_back(
"--as-needed");
319 CmdArgs.push_back(
"-lgcc_s");
320 CmdArgs.push_back(
"--no-as-needed");
324 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
325 if (Args.hasArg(options::OPT_shared) || IsPIE)
326 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
328 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
329 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
334 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
335 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
340 FreeBSD::FreeBSD(
const Driver &D,
const llvm::Triple &Triple,
346 if ((Triple.getArch() == llvm::Triple::x86 || Triple.isMIPS32() ||
347 Triple.getArch() == llvm::Triple::ppc) &&
355 if (
getTriple().getOSMajorVersion() >= 10)
361 const llvm::opt::ArgList &DriverArgs,
362 llvm::opt::ArgStringList &CC1Args)
const {
364 "",
"", DriverArgs, CC1Args);
368 ArgStringList &CmdArgs)
const {
370 bool Profiling = Args.hasArg(options::OPT_pg);
374 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
378 CmdArgs.push_back(Profiling ?
"-lstdc++_p" :
"-lstdc++");
392 case llvm::Triple::GNUEABIHF:
393 case llvm::Triple::GNUEABI:
394 case llvm::Triple::EABI:
395 return llvm::ExceptionHandling::None;
399 return llvm::ExceptionHandling::SjLj;
400 return llvm::ExceptionHandling::None;
409 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
410 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
411 const bool IsMIPS64 =
getTriple().isMIPS64();
413 Res |= SanitizerKind::Address;
414 Res |= SanitizerKind::Vptr;
415 if (IsX86_64 || IsMIPS64) {
416 Res |= SanitizerKind::Leak;
417 Res |= SanitizerKind::Thread;
419 if (IsX86 || IsX86_64) {
420 Res |= SanitizerKind::Function;
421 Res |= SanitizerKind::SafeStack;
422 Res |= SanitizerKind::Fuzzer;
423 Res |= SanitizerKind::FuzzerNoLink;
426 Res |= SanitizerKind::Memory;
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
The base class of the type hierarchy.
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...
void addCommand(std::unique_ptr< Command > C)
vfs::FileSystem & getVFS() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
Defines the virtual file system interface vfs::FileSystem.
bool exists(const Twine &Path)
Check whether a file exists. Provided for convenience.
Compilation - A set of tasks to perform for a single driver invocation.