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().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)) {
245 if (Args.hasArg(options::OPT_pg))
246 CmdArgs.push_back(
"-lm_p");
248 CmdArgs.push_back(
"-lm");
250 if (NeedsSanitizerDeps)
254 if (Args.hasArg(options::OPT_pg))
255 CmdArgs.push_back(
"-lgcc_p");
257 CmdArgs.push_back(
"-lgcc");
258 if (Args.hasArg(options::OPT_static)) {
259 CmdArgs.push_back(
"-lgcc_eh");
260 }
else if (Args.hasArg(options::OPT_pg)) {
261 CmdArgs.push_back(
"-lgcc_eh_p");
263 CmdArgs.push_back(
"--as-needed");
264 CmdArgs.push_back(
"-lgcc_s");
265 CmdArgs.push_back(
"--no-as-needed");
268 if (Args.hasArg(options::OPT_pthread)) {
269 if (Args.hasArg(options::OPT_pg))
270 CmdArgs.push_back(
"-lpthread_p");
272 CmdArgs.push_back(
"-lpthread");
275 if (Args.hasArg(options::OPT_pg)) {
276 if (Args.hasArg(options::OPT_shared))
277 CmdArgs.push_back(
"-lc");
279 CmdArgs.push_back(
"-lc_p");
280 CmdArgs.push_back(
"-lgcc_p");
282 CmdArgs.push_back(
"-lc");
283 CmdArgs.push_back(
"-lgcc");
286 if (Args.hasArg(options::OPT_static)) {
287 CmdArgs.push_back(
"-lgcc_eh");
288 }
else if (Args.hasArg(options::OPT_pg)) {
289 CmdArgs.push_back(
"-lgcc_eh_p");
291 CmdArgs.push_back(
"--as-needed");
292 CmdArgs.push_back(
"-lgcc_s");
293 CmdArgs.push_back(
"--no-as-needed");
297 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
298 if (Args.hasArg(options::OPT_shared) || IsPIE)
299 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
301 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
302 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
307 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
308 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
313 FreeBSD::FreeBSD(
const Driver &D,
const llvm::Triple &Triple,
319 if ((Triple.getArch() == llvm::Triple::x86 ||
320 Triple.getArch() == llvm::Triple::ppc) &&
328 if (
getTriple().getOSMajorVersion() >= 10)
334 const llvm::opt::ArgList &DriverArgs,
335 llvm::opt::ArgStringList &CC1Args)
const {
337 "",
"", DriverArgs, CC1Args);
341 ArgStringList &CmdArgs)
const {
343 bool Profiling = Args.hasArg(options::OPT_pg);
347 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
351 CmdArgs.push_back(Profiling ?
"-lstdc++_p" :
"-lstdc++");
365 case llvm::Triple::GNUEABIHF:
366 case llvm::Triple::GNUEABI:
367 case llvm::Triple::EABI:
372 return llvm::ExceptionHandling::SjLj;
382 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
383 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
384 const bool IsMIPS64 =
getTriple().getArch() == llvm::Triple::mips64 ||
385 getTriple().getArch() == llvm::Triple::mips64el;
387 Res |= SanitizerKind::Address;
388 Res |= SanitizerKind::Vptr;
389 if (IsX86_64 || IsMIPS64) {
390 Res |= SanitizerKind::Leak;
391 Res |= SanitizerKind::Thread;
393 if (IsX86 || IsX86_64) {
394 Res |= SanitizerKind::SafeStack;
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.