14 #include "llvm/Option/ArgList.h"
16 using namespace clang::driver;
17 using namespace clang::driver::toolchains;
18 using namespace clang::driver::tools;
19 using namespace clang;
20 using namespace llvm::opt;
26 const char *LinkingOutput)
const {
28 ArgStringList CmdArgs;
30 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
32 CmdArgs.push_back(
"-o");
35 for (
const auto &II : Inputs)
36 CmdArgs.push_back(II.getFilename());
38 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
39 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
46 const char *LinkingOutput)
const {
47 const Driver &D = getToolChain().getDriver();
48 ArgStringList CmdArgs;
50 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
51 CmdArgs.push_back(
"-e");
52 CmdArgs.push_back(
"__start");
55 if (Args.hasArg(options::OPT_static)) {
56 CmdArgs.push_back(
"-Bstatic");
58 if (Args.hasArg(options::OPT_rdynamic))
59 CmdArgs.push_back(
"-export-dynamic");
60 CmdArgs.push_back(
"--eh-frame-hdr");
61 CmdArgs.push_back(
"-Bdynamic");
62 if (Args.hasArg(options::OPT_shared)) {
63 CmdArgs.push_back(
"-shared");
65 CmdArgs.push_back(
"-dynamic-linker");
66 CmdArgs.push_back(
"/usr/libexec/ld.so");
71 CmdArgs.push_back(
"-o");
74 assert(Output.
isNothing() &&
"Invalid output.");
77 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
78 if (!Args.hasArg(options::OPT_shared)) {
79 if (Args.hasArg(options::OPT_pg))
81 Args.MakeArgString(getToolChain().GetFilePath(
"gcrt0.o")));
84 Args.MakeArgString(getToolChain().GetFilePath(
"crt0.o")));
86 Args.MakeArgString(getToolChain().GetFilePath(
"crtbegin.o")));
89 Args.MakeArgString(getToolChain().GetFilePath(
"crtbeginS.o")));
93 Args.AddAllArgs(CmdArgs,
94 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
98 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
100 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
101 if (Args.hasArg(options::OPT_pg))
102 CmdArgs.push_back(
"-lm_p");
104 CmdArgs.push_back(
"-lm");
107 if (Args.hasArg(options::OPT_pthread)) {
108 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
109 CmdArgs.push_back(
"-lpthread_p");
111 CmdArgs.push_back(
"-lpthread");
114 if (!Args.hasArg(options::OPT_shared)) {
115 if (Args.hasArg(options::OPT_pg))
116 CmdArgs.push_back(
"-lc_p");
118 CmdArgs.push_back(
"-lc");
122 switch (getToolChain().getArch()) {
123 case llvm::Triple::arm:
126 case llvm::Triple::x86:
129 case llvm::Triple::x86_64:
133 llvm_unreachable(
"Unsupported architecture");
135 CmdArgs.push_back(Args.MakeArgString(
"-lclang_rt." + MyArch));
138 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
139 if (!Args.hasArg(options::OPT_shared))
141 Args.MakeArgString(getToolChain().GetFilePath(
"crtend.o")));
144 Args.MakeArgString(getToolChain().GetFilePath(
"crtendS.o")));
147 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
148 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
170 llvm::opt::ArgStringList &CC1Args)
const {
172 if (StringRef(Triple).startswith(
"amd64"))
173 Triple =
"x86_64" + Triple.substr(5);
175 Triple,
"",
"",
"", DriverArgs, CC1Args);
179 ArgStringList &CmdArgs)
const {
182 CmdArgs.push_back(
"-lc++");
183 CmdArgs.push_back(
"-lc++abi");
184 CmdArgs.push_back(
"-lpthread");
187 CmdArgs.push_back(
"-lstdc++");
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)
Compilation - A set of tasks to perform for a single driver invocation.