12#include "clang/Config/config.h"
19#include "llvm/Option/ArgList.h"
20#include "llvm/Support/FileSystem.h"
21#include "llvm/Support/Path.h"
33 const char *LinkingOutput)
const {
35 ArgStringList CmdArgs;
37 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
39 CmdArgs.push_back(
"-o");
42 for (
const auto &II : Inputs)
43 CmdArgs.push_back(II.getFilename());
45 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
47 Exec, CmdArgs, Inputs, Output));
54 const char *LinkingOutput)
const {
55 ArgStringList CmdArgs;
58 CmdArgs.push_back(
"-C");
60 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
61 CmdArgs.push_back(
"-e");
62 CmdArgs.push_back(
"_start");
65 if (Args.hasArg(options::OPT_static)) {
66 CmdArgs.push_back(
"-Bstatic");
67 CmdArgs.push_back(
"-dn");
69 CmdArgs.push_back(
"-Bdynamic");
70 if (Args.hasArg(options::OPT_shared)) {
71 CmdArgs.push_back(
"-shared");
76 Args.ClaimAllArgs(options::OPT_pthread);
77 Args.ClaimAllArgs(options::OPT_pthreads);
81 CmdArgs.push_back(
"-o");
84 assert(Output.
isNothing() &&
"Invalid output.");
87 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
89 if (!Args.hasArg(options::OPT_shared))
91 Args.MakeArgString(getToolChain().GetFilePath(
"crt1.o")));
93 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crti.o")));
95 const Arg *
Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi);
96 bool HaveAnsi =
false;
99 HaveAnsi =
Std->getOption().matches(options::OPT_ansi);
104 const char *values_X =
"values-Xa.o";
106 if (HaveAnsi || (LangStd && !LangStd->
isGNUMode()))
107 values_X =
"values-Xc.o";
108 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(values_X)));
110 const char *values_xpg =
"values-xpg6.o";
113 values_xpg =
"values-xpg4.o";
115 Args.MakeArgString(getToolChain().GetFilePath(values_xpg)));
117 Args.MakeArgString(getToolChain().GetFilePath(
"crtbegin.o")));
119 getToolChain().addFastMathRuntimeIfAvailable(Args, CmdArgs);
122 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
124 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
125 options::OPT_e, options::OPT_r});
130 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
132 if (getToolChain().ShouldLinkCXXStdlib(Args))
133 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
134 if (Args.hasArg(options::OPT_fstack_protector) ||
135 Args.hasArg(options::OPT_fstack_protector_strong) ||
136 Args.hasArg(options::OPT_fstack_protector_all)) {
138 CmdArgs.push_back(
"-lssp_nonshared");
139 CmdArgs.push_back(
"-lssp");
143 if (getToolChain().getTriple().getArch() == llvm::Triple::sparc) {
145 CmdArgs.push_back(
"-latomic");
148 CmdArgs.push_back(
"-lgcc_s");
149 CmdArgs.push_back(
"-lc");
150 if (!Args.hasArg(options::OPT_shared)) {
151 CmdArgs.push_back(
"-lgcc");
152 CmdArgs.push_back(
"-lm");
154 if (NeedsSanitizerDeps) {
160 const SanitizerArgs &SA = getToolChain().getSanitizerArgs(Args);
161 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 &&
164 CmdArgs.push_back(
"-zrelax=transtls");
168 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
171 Args.MakeArgString(getToolChain().GetFilePath(
"crtend.o")));
173 Args.MakeArgString(getToolChain().GetFilePath(
"crtn.o")));
176 getToolChain().addProfileRTLibs(Args, CmdArgs);
178 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
180 Exec, CmdArgs, Inputs, Output));
184 switch (Triple.getArch()) {
185 case llvm::Triple::x86:
186 case llvm::Triple::sparc:
188 case llvm::Triple::x86_64:
190 case llvm::Triple::sparcv9:
193 llvm_unreachable(
"Unsupported architecture");
227 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
228 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
232 Res |= SanitizerKind::Address;
233 Res |= SanitizerKind::PointerCompare;
234 Res |= SanitizerKind::PointerSubtract;
236 if (IsX86 || IsX86_64)
237 Res |= SanitizerKind::Function;
238 Res |= SanitizerKind::Vptr;
249 ArgStringList &CC1Args)
const {
252 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
255 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
258 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
260 llvm::sys::path::append(
P,
"include");
264 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
268 StringRef CIncludeDirs(C_INCLUDE_DIRS);
269 if (CIncludeDirs !=
"") {
271 CIncludeDirs.split(dirs,
":");
272 for (StringRef dir : dirs) {
274 llvm::sys::path::is_absolute(dir) ?
"" : StringRef(D.
SysRoot);
295 const llvm::opt::ArgList &DriverArgs,
296 llvm::opt::ArgStringList &CC1Args)
const {
static StringRef getSolarisLibSuffix(const llvm::Triple &Triple)
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.
std::string Dir
The path the driver executable was in, as invoked from the command line.
const IncludeDirsFunc & includeDirsCallback() const
std::function< std::vector< std::string >(const Multilib &M)> IncludeDirsFunc
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
const std::string & gccSuffix() const
Get the detected GCC installation path suffix for the multi-arch target variant.
const std::string & includeSuffix() const
Get the include directory suffix.
bool needsStatsRt() const
bool needsUbsanRt() const
bool requiresMinimalRuntime() const
@ C
Languages that the frontend can parse and compile.
LangStandard - Information about the properties of a particular language standard.
static const LangStandard * getLangStandardForName(StringRef Name)
clang::Language getLanguage() const
Get the language that this standard describes.
bool isGNUMode() const
isGNUMode - Language includes GNU extensions.
bool isC99() const
isC99 - Language is a superset of C99.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.