16 #include "llvm/ADT/SmallString.h" 17 #include "llvm/Option/ArgList.h" 18 #include "llvm/Support/Path.h" 23 using namespace clang;
30 const char *LinkingOutput)
const {
32 ArgStringList CmdArgs;
34 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
36 CmdArgs.push_back(
"-o");
39 for (
const auto &II : Inputs)
40 CmdArgs.push_back(II.getFilename());
42 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
43 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
50 const char *LinkingOutput)
const {
53 ArgStringList CmdArgs;
56 Args.ClaimAllArgs(options::OPT_g_Group);
58 Args.ClaimAllArgs(options::OPT_emit_llvm);
61 Args.ClaimAllArgs(options::OPT_w);
64 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
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(
"-Bshareable");
74 Args.AddAllArgs(CmdArgs, options::OPT_pie);
75 CmdArgs.push_back(
"-dynamic-linker");
76 CmdArgs.push_back(
"/lib/ld-ananas.so");
81 CmdArgs.push_back(
"-o");
84 assert(Output.
isNothing() &&
"Invalid output.");
87 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
88 if (!Args.hasArg(options::OPT_shared)) {
89 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crt0.o")));
91 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crti.o")));
92 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
93 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtbeginS.o")));
95 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtbegin.o")));
99 Args.AddAllArgs(CmdArgs, options::OPT_L);
101 Args.AddAllArgs(CmdArgs,
102 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
103 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
106 assert(!Inputs.empty() &&
"Must have at least one input.");
115 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
116 CmdArgs.push_back(
"-lc");
118 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
119 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
120 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtendS.o")));
122 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtend.o")));
123 CmdArgs.push_back(Args.MakeArgString(ToolChain.
GetFilePath(
"crtn.o")));
126 const char *Exec = Args.MakeArgString(ToolChain.
GetLinkerPath());
127 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
132 Ananas::Ananas(
const Driver &D,
const llvm::Triple &Triple,
const ArgList &Args)
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
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)
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
Compilation - A set of tasks to perform for a single driver invocation.