19 #include "llvm/Option/ArgList.h"
21 using namespace clang::driver;
22 using namespace clang::driver::tools;
23 using namespace clang::driver::toolchains;
24 using namespace clang;
25 using namespace llvm::opt;
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().getArch() == llvm::Triple::mips ||
61 getToolChain().getArch() == llvm::Triple::mips64)
62 CmdArgs.push_back(
"-EB");
64 CmdArgs.push_back(
"-EL");
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 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
110 CmdArgs.push_back(
"-o");
113 for (
const auto &II : Inputs)
114 CmdArgs.push_back(II.getFilename());
116 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
117 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
124 const char *LinkingOutput)
const {
128 const llvm::Triple::ArchType Arch = ToolChain.
getArch();
130 !Args.hasArg(options::OPT_shared) &&
131 (Args.hasArg(options::OPT_pie) || ToolChain.
isPIEDefault());
132 ArgStringList CmdArgs;
135 Args.ClaimAllArgs(options::OPT_g_Group);
137 Args.ClaimAllArgs(options::OPT_emit_llvm);
140 Args.ClaimAllArgs(options::OPT_w);
143 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
146 CmdArgs.push_back(
"-pie");
148 CmdArgs.push_back(
"--eh-frame-hdr");
149 if (Args.hasArg(options::OPT_static)) {
150 CmdArgs.push_back(
"-Bstatic");
152 if (Args.hasArg(options::OPT_rdynamic))
153 CmdArgs.push_back(
"-export-dynamic");
154 if (Args.hasArg(options::OPT_shared)) {
155 CmdArgs.push_back(
"-Bshareable");
157 CmdArgs.push_back(
"-dynamic-linker");
158 CmdArgs.push_back(
"/libexec/ld-elf.so.1");
160 if (ToolChain.
getTriple().getOSMajorVersion() >= 9) {
161 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
162 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
163 CmdArgs.push_back(
"--hash-style=both");
166 CmdArgs.push_back(
"--enable-new-dtags");
171 if (Arch == llvm::Triple::x86) {
172 CmdArgs.push_back(
"-m");
173 CmdArgs.push_back(
"elf_i386_fbsd");
176 if (Arch == llvm::Triple::ppc) {
177 CmdArgs.push_back(
"-m");
178 CmdArgs.push_back(
"elf32ppc_fbsd");
181 if (Arg *A = Args.getLastArg(options::OPT_G)) {
182 if (ToolChain.
getArch() == llvm::Triple::mips ||
183 ToolChain.
getArch() == llvm::Triple::mipsel ||
184 ToolChain.
getArch() == llvm::Triple::mips64 ||
185 ToolChain.
getArch() == llvm::Triple::mips64el) {
186 StringRef
v = A->getValue();
187 CmdArgs.push_back(Args.MakeArgString(
"-G" + v));
193 CmdArgs.push_back(
"-o");
196 assert(Output.
isNothing() &&
"Invalid output.");
199 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
200 const char *crt1 =
nullptr;
201 if (!Args.hasArg(options::OPT_shared)) {
202 if (Args.hasArg(options::OPT_pg))
210 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crt1)));
212 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
214 const char *crtbegin =
nullptr;
215 if (Args.hasArg(options::OPT_static))
216 crtbegin =
"crtbeginT.o";
217 else if (Args.hasArg(options::OPT_shared) || IsPIE)
218 crtbegin =
"crtbeginS.o";
220 crtbegin =
"crtbegin.o";
222 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(crtbegin)));
225 Args.AddAllArgs(CmdArgs, options::OPT_L);
227 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
228 Args.AddAllArgs(CmdArgs, options::OPT_e);
229 Args.AddAllArgs(CmdArgs, options::OPT_s);
230 Args.AddAllArgs(CmdArgs, options::OPT_t);
231 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
232 Args.AddAllArgs(CmdArgs, options::OPT_r);
240 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
244 if (Args.hasArg(options::OPT_pg))
245 CmdArgs.push_back(
"-lm_p");
247 CmdArgs.push_back(
"-lm");
249 if (NeedsSanitizerDeps)
253 if (Args.hasArg(options::OPT_pg))
254 CmdArgs.push_back(
"-lgcc_p");
256 CmdArgs.push_back(
"-lgcc");
257 if (Args.hasArg(options::OPT_static)) {
258 CmdArgs.push_back(
"-lgcc_eh");
259 }
else if (Args.hasArg(options::OPT_pg)) {
260 CmdArgs.push_back(
"-lgcc_eh_p");
262 CmdArgs.push_back(
"--as-needed");
263 CmdArgs.push_back(
"-lgcc_s");
264 CmdArgs.push_back(
"--no-as-needed");
267 if (Args.hasArg(options::OPT_pthread)) {
268 if (Args.hasArg(options::OPT_pg))
269 CmdArgs.push_back(
"-lpthread_p");
271 CmdArgs.push_back(
"-lpthread");
274 if (Args.hasArg(options::OPT_pg)) {
275 if (Args.hasArg(options::OPT_shared))
276 CmdArgs.push_back(
"-lc");
278 CmdArgs.push_back(
"-lc_p");
279 CmdArgs.push_back(
"-lgcc_p");
281 CmdArgs.push_back(
"-lc");
282 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");
296 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
297 if (Args.hasArg(options::OPT_shared) || IsPIE)
298 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
300 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
301 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
306 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
307 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
312 FreeBSD::FreeBSD(
const Driver &D,
const llvm::Triple &Triple,
318 if ((Triple.getArch() == llvm::Triple::x86 ||
319 Triple.getArch() == llvm::Triple::ppc) &&
327 if (
getTriple().getOSMajorVersion() >= 10)
333 const llvm::opt::ArgList &DriverArgs,
334 llvm::opt::ArgStringList &CC1Args)
const {
336 "",
"", DriverArgs, CC1Args);
340 ArgStringList &CmdArgs)
const {
342 bool Profiling = Args.hasArg(options::OPT_pg);
346 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
350 CmdArgs.push_back(Profiling ?
"-lstdc++_p" :
"-lstdc++");
364 case llvm::Triple::GNUEABIHF:
365 case llvm::Triple::GNUEABI:
366 case llvm::Triple::EABI:
380 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
381 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
382 const bool IsMIPS64 =
getTriple().getArch() == llvm::Triple::mips64 ||
383 getTriple().getArch() == llvm::Triple::mips64el;
385 Res |= SanitizerKind::Address;
386 Res |= SanitizerKind::Vptr;
387 if (IsX86_64 || IsMIPS64) {
388 Res |= SanitizerKind::Leak;
389 Res |= SanitizerKind::Thread;
391 if (IsX86 || IsX86_64) {
392 Res |= SanitizerKind::SafeStack;
The base class of the type hierarchy.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
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
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
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.
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.