12#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/Support/FileSystem.h"
22#include "llvm/Support/Path.h"
34 const char *LinkingOutput)
const {
41 const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ);
43 return UseLinker ==
"bfd" || UseLinker ==
"gld";
47 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static) ||
48 Args.hasArg(options::OPT_r))
51 return Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
58 if (
const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
59 StringRef UseLinker = A->getValue();
60 if (!UseLinker.empty()) {
61 if (llvm::sys::path::is_absolute(UseLinker) &&
62 llvm::sys::fs::can_execute(UseLinker))
63 return std::string(UseLinker);
66 if (UseLinker ==
"bfd" || UseLinker ==
"gld")
68 return "/usr/gnu/bin/ld";
71 if (UseLinker !=
"ld")
73 << A->getAsString(Args);
85 const char *LinkingOutput)
const {
91 ArgStringList CmdArgs;
95 CmdArgs.push_back(
"-C");
97 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared,
99 CmdArgs.push_back(
"-e");
100 CmdArgs.push_back(
"_start");
105 CmdArgs.push_back(
"-pie");
107 CmdArgs.push_back(
"-z");
108 CmdArgs.push_back(
"type=pie");
112 if (Args.hasArg(options::OPT_static)) {
113 CmdArgs.push_back(
"-Bstatic");
114 CmdArgs.push_back(
"-dn");
116 if (!Args.hasArg(options::OPT_r) && Args.hasArg(options::OPT_shared))
117 CmdArgs.push_back(
"-shared");
121 Args.ClaimAllArgs(options::OPT_pthread);
122 Args.ClaimAllArgs(options::OPT_pthreads);
128 case llvm::Triple::x86:
129 CmdArgs.push_back(
"-m");
130 CmdArgs.push_back(
"elf_i386_sol2");
132 case llvm::Triple::x86_64:
133 CmdArgs.push_back(
"-m");
134 CmdArgs.push_back(
"elf_x86_64_sol2");
136 case llvm::Triple::sparc:
137 CmdArgs.push_back(
"-m");
138 CmdArgs.push_back(
"elf32_sparc_sol2");
140 case llvm::Triple::sparcv9:
141 CmdArgs.push_back(
"-m");
142 CmdArgs.push_back(
"elf64_sparc_sol2");
148 if (Args.hasArg(options::OPT_rdynamic))
149 CmdArgs.push_back(
"-export-dynamic");
151 CmdArgs.push_back(
"--eh-frame-hdr");
154 Args.ClaimAllArgs(options::OPT_rdynamic);
159 CmdArgs.push_back(
"-o");
163 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
165 if (!Args.hasArg(options::OPT_shared))
170 const Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi);
171 bool HaveAnsi =
false;
174 HaveAnsi = Std->getOption().matches(options::OPT_ansi);
179 const char *values_X =
"values-Xa.o";
181 if (HaveAnsi || (LangStd && !LangStd->
isGNUMode()))
182 values_X =
"values-Xc.o";
185 const char *values_xpg =
"values-xpg6.o";
188 values_xpg =
"values-xpg4.o";
191 const char *crtbegin =
nullptr;
192 if (Args.hasArg(options::OPT_shared) || IsPIE)
193 crtbegin =
"crtbeginS.o";
195 crtbegin =
"crtbegin.o";
203 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group});
208 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
211 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
212 !Args.hasArg(options::OPT_static);
218 CmdArgs.push_back(
"-lm");
221 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
226 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
229 CmdArgs.push_back(
"-lm");
231 if (Args.hasArg(options::OPT_fstack_protector) ||
232 Args.hasArg(options::OPT_fstack_protector_strong) ||
233 Args.hasArg(options::OPT_fstack_protector_all)) {
235 CmdArgs.push_back(
"-lssp_nonshared");
236 CmdArgs.push_back(
"-lssp");
240 if (
Arch == llvm::Triple::sparc) {
242 CmdArgs.push_back(
"-latomic");
247 CmdArgs.push_back(
"-lc");
250 if (NeedsSanitizerDeps) {
256 if (
Arch == llvm::Triple::x86_64 &&
260 CmdArgs.push_back(
"-z");
261 CmdArgs.push_back(
"relax=transtls");
266 CmdArgs.push_back(
"-z");
267 CmdArgs.push_back(
"now");
271 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
273 const char *crtend =
nullptr;
274 if (Args.hasArg(options::OPT_shared) || IsPIE)
275 crtend =
"crtendS.o";
286 Exec, CmdArgs, Inputs, Output));
290 switch (Triple.getArch()) {
291 case llvm::Triple::x86:
292 case llvm::Triple::sparc:
295 case llvm::Triple::x86_64:
297 case llvm::Triple::sparcv9:
325 if (StringRef(D.Dir).starts_with(D.SysRoot))
332 const bool IsSparc =
getTriple().getArch() == llvm::Triple::sparc;
333 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
336 if (IsSparc || IsX86) {
337 Res |= SanitizerKind::Address;
338 Res |= SanitizerKind::PointerCompare;
339 Res |= SanitizerKind::PointerSubtract;
341 Res |= SanitizerKind::SafeStack;
342 Res |= SanitizerKind::Vptr;
348 return llvm::StringSwitch<const char *>(
getDriver().getPreferredLinker())
349 .Cases(
"bfd",
"gld",
"/usr/gnu/bin/ld")
350 .Default(
"/usr/bin/ld");
360 ArgStringList &CC1Args)
const {
363 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
366 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
369 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
371 llvm::sys::path::append(P,
"include");
375 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
379 StringRef CIncludeDirs(C_INCLUDE_DIRS);
380 if (CIncludeDirs !=
"") {
382 CIncludeDirs.split(dirs,
":");
383 for (StringRef dir : dirs) {
385 llvm::sys::path::is_absolute(dir) ?
"" : StringRef(D.SysRoot);
406 const llvm::opt::ArgList &DriverArgs,
407 llvm::opt::ArgStringList &CC1Args)
const {
static StringRef getSolarisLibSuffix(const llvm::Triple &Triple)
static bool getPIE(const ArgList &Args, const ToolChain &TC)
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...
DiagnosticBuilder Diag(unsigned DiagID) const
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
StringRef getPreferredLinker() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
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 & includeSuffix() const
Get the include directory suffix.
bool needsStatsRt() const
bool needsUbsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
SmallVector< InputInfo, 4 > InputInfoList
The JSON file list parser is used to communicate input to InstallAPI.
@ 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.