12 #include "clang/Config/config.h" 17 #include "llvm/Option/ArgList.h" 18 #include "llvm/Support/FileSystem.h" 19 #include "llvm/Support/Path.h" 24 using namespace clang;
31 const char *LinkingOutput)
const {
33 ArgStringList CmdArgs;
35 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
37 CmdArgs.push_back(
"-o");
40 for (
const auto &II : Inputs)
41 CmdArgs.push_back(II.getFilename());
43 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
44 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
51 const char *LinkingOutput)
const {
52 ArgStringList CmdArgs;
55 CmdArgs.push_back(
"-C");
57 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
58 CmdArgs.push_back(
"-e");
59 CmdArgs.push_back(
"_start");
62 if (Args.hasArg(options::OPT_static)) {
63 CmdArgs.push_back(
"-Bstatic");
64 CmdArgs.push_back(
"-dn");
66 CmdArgs.push_back(
"-Bdynamic");
67 if (Args.hasArg(options::OPT_shared)) {
68 CmdArgs.push_back(
"-shared");
73 Args.ClaimAllArgs(options::OPT_pthread);
74 Args.ClaimAllArgs(options::OPT_pthreads);
78 CmdArgs.push_back(
"-o");
81 assert(Output.
isNothing() &&
"Invalid output.");
84 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
85 if (!Args.hasArg(options::OPT_shared))
87 Args.MakeArgString(getToolChain().GetFilePath(
"crt1.o")));
89 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crti.o")));
91 const Arg *
Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi);
92 bool HaveAnsi =
false;
95 HaveAnsi = Std->getOption().matches(options::OPT_ansi);
100 const char *values_X =
"values-Xa.o";
102 if (HaveAnsi || (LangStd && !LangStd->
isGNUMode()))
103 values_X =
"values-Xc.o";
104 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(values_X)));
106 const char *values_xpg =
"values-xpg6.o";
109 values_xpg =
"values-xpg4.o";
111 Args.MakeArgString(getToolChain().GetFilePath(values_xpg)));
113 Args.MakeArgString(getToolChain().GetFilePath(
"crtbegin.o")));
116 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
118 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
119 options::OPT_e, options::OPT_r});
124 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
125 if (getToolChain().ShouldLinkCXXStdlib(Args))
126 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
127 if (Args.hasArg(options::OPT_fstack_protector) ||
128 Args.hasArg(options::OPT_fstack_protector_strong) ||
129 Args.hasArg(options::OPT_fstack_protector_all)) {
131 CmdArgs.push_back(
"-lssp_nonshared");
132 CmdArgs.push_back(
"-lssp");
134 CmdArgs.push_back(
"-lgcc_s");
135 CmdArgs.push_back(
"-lc");
136 if (!Args.hasArg(options::OPT_shared)) {
137 CmdArgs.push_back(
"-lgcc");
138 CmdArgs.push_back(
"-lm");
140 if (NeedsSanitizerDeps)
144 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
146 Args.MakeArgString(getToolChain().GetFilePath(
"crtend.o")));
148 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crtn.o")));
150 getToolChain().addProfileRTLibs(Args, CmdArgs);
152 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
153 C.
addCommand(std::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
157 switch (Triple.getArch()) {
158 case llvm::Triple::x86:
159 case llvm::Triple::sparc:
161 case llvm::Triple::x86_64:
163 case llvm::Triple::sparcv9:
166 llvm_unreachable(
"Unsupported architecture");
173 Solaris::Solaris(
const Driver &D,
const llvm::Triple &Triple,
200 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
201 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
205 Res |= SanitizerKind::Address;
206 Res |= SanitizerKind::PointerCompare;
207 Res |= SanitizerKind::PointerSubtract;
209 if (IsX86 || IsX86_64)
211 Res |= SanitizerKind::Vptr;
222 ArgStringList &CC1Args)
const {
225 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
228 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
231 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
233 llvm::sys::path::append(P,
"include");
237 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
241 StringRef CIncludeDirs(C_INCLUDE_DIRS);
242 if (CIncludeDirs !=
"") {
244 CIncludeDirs.split(dirs,
":");
245 for (StringRef dir : dirs) {
247 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
268 const llvm::opt::ArgList &DriverArgs,
269 llvm::opt::ArgStringList &CC1Args)
const {
LangStandard - Information about the properties of a particular language standard.
const IncludeDirsFunc & includeDirsCallback() const
constexpr XRayInstrMask Function
static StringRef getSolarisLibSuffix(const llvm::Triple &Triple)
const std::string & includeSuffix() const
Get the include directory suffix.
std::string Dir
The path the driver executable was in, as invoked from the command line.
const std::string & gccSuffix() const
Get the detected GCC installation path suffix for the multi-arch target variant.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Languages that the frontend can parse and compile.
clang::Language getLanguage() const
Get the language that this standard describes.
void addCommand(std::unique_ptr< Command > C)
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag...
static const LangStandard * getLangStandardForName(StringRef Name)
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
bool isGNUMode() const
isGNUMode - Language includes GNU extensions.
std::function< std::vector< std::string >(const Multilib &M)> IncludeDirsFunc
Compilation - A set of tasks to perform for a single driver invocation.
bool isC99() const
isC99 - Language is a superset of C99.
std::string ResourceDir
The path to the compiler resource directory.