14#include "llvm/Option/ArgList.h"
15#include "llvm/Support/Path.h"
31 const char *LinkingOutput)
const {
33 ArgStringList CmdArgs;
38 CmdArgs.push_back(
"--32");
40 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
42 CmdArgs.push_back(
"-o");
45 for (
const auto &II : Inputs)
46 CmdArgs.push_back(II.getFilename());
48 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
49 C.addCommand(std::make_unique<Command>(JA, *
this,
51 Exec, CmdArgs, Inputs, Output));
58 const char *LinkingOutput)
const {
59 const Driver &D = getToolChain().getDriver();
60 ArgStringList CmdArgs;
63 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
65 CmdArgs.push_back(
"--eh-frame-hdr");
66 if (Args.hasArg(options::OPT_static)) {
67 CmdArgs.push_back(
"-Bstatic");
69 if (Args.hasArg(options::OPT_rdynamic))
70 CmdArgs.push_back(
"-export-dynamic");
71 if (Args.hasArg(options::OPT_shared))
72 CmdArgs.push_back(
"-shared");
73 else if (!Args.hasArg(options::OPT_r)) {
74 CmdArgs.push_back(
"-dynamic-linker");
75 CmdArgs.push_back(
"/usr/libexec/ld-elf.so.2");
77 CmdArgs.push_back(
"--hash-style=gnu");
78 CmdArgs.push_back(
"--enable-new-dtags");
83 if (getToolChain().getArch() == llvm::Triple::x86) {
84 CmdArgs.push_back(
"-m");
85 CmdArgs.push_back(
"elf_i386");
90 CmdArgs.push_back(
"-o");
94 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
96 if (!Args.hasArg(options::OPT_shared)) {
97 if (Args.hasArg(options::OPT_pg))
99 Args.MakeArgString(getToolChain().GetFilePath(
"gcrt1.o")));
101 if (Args.hasArg(options::OPT_pie))
103 Args.MakeArgString(getToolChain().GetFilePath(
"Scrt1.o")));
106 Args.MakeArgString(getToolChain().GetFilePath(
"crt1.o")));
109 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crti.o")));
110 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
112 Args.MakeArgString(getToolChain().GetFilePath(
"crtbeginS.o")));
115 Args.MakeArgString(getToolChain().GetFilePath(
"crtbegin.o")));
118 Args.AddAllArgs(CmdArgs,
119 {options::OPT_L, options::OPT_T_Group});
123 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
126 llvm::sys::path::append(Dir,
"/usr/lib/gcc80");
127 CmdArgs.push_back(Args.MakeArgString(
"-L" + Dir));
129 if (!Args.hasArg(options::OPT_static)) {
130 CmdArgs.push_back(
"-rpath");
131 CmdArgs.push_back(
"/usr/lib/gcc80");
135 if (getToolChain().ShouldLinkCXXStdlib(Args))
136 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
137 CmdArgs.push_back(
"-lm");
140 if (Args.hasArg(options::OPT_pthread))
141 CmdArgs.push_back(
"-lpthread");
143 if (!Args.hasArg(options::OPT_nolibc)) {
144 CmdArgs.push_back(
"-lc");
147 if (Args.hasArg(options::OPT_static) ||
148 Args.hasArg(options::OPT_static_libgcc)) {
149 CmdArgs.push_back(
"-lgcc");
150 CmdArgs.push_back(
"-lgcc_eh");
152 if (Args.hasArg(options::OPT_shared_libgcc)) {
153 CmdArgs.push_back(
"-lgcc_pic");
154 if (!Args.hasArg(options::OPT_shared))
155 CmdArgs.push_back(
"-lgcc");
157 CmdArgs.push_back(
"-lgcc");
158 CmdArgs.push_back(
"--as-needed");
159 CmdArgs.push_back(
"-lgcc_pic");
160 CmdArgs.push_back(
"--no-as-needed");
165 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
167 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
169 Args.MakeArgString(getToolChain().GetFilePath(
"crtendS.o")));
172 Args.MakeArgString(getToolChain().GetFilePath(
"crtend.o")));
173 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crtn.o")));
176 getToolChain().addProfileRTLibs(Args, CmdArgs);
178 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
179 C.addCommand(std::make_unique<Command>(JA, *
this,
181 Exec, CmdArgs, Inputs, Output));
201 const llvm::opt::ArgList &DriverArgs,
202 llvm::opt::ArgStringList &CC1Args)
const {
205 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
208 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
210 llvm::sys::path::append(Dir,
"include");
214 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
222 llvm::opt::ArgStringList &CC1Args)
const {
224 DriverArgs, CC1Args);
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
std::string ResourceDir
The path to the compiler resource directory.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport AtFileCurCP()