11 #include "clang/Config/config.h" 16 #include "llvm/Option/ArgList.h" 17 #include "llvm/Support/FileSystem.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 {
51 ArgStringList CmdArgs;
54 CmdArgs.push_back(
"-C");
56 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
57 CmdArgs.push_back(
"-e");
58 CmdArgs.push_back(
"_start");
61 if (Args.hasArg(options::OPT_static)) {
62 CmdArgs.push_back(
"-Bstatic");
63 CmdArgs.push_back(
"-dn");
65 CmdArgs.push_back(
"-Bdynamic");
66 if (Args.hasArg(options::OPT_shared)) {
67 CmdArgs.push_back(
"-shared");
72 Args.ClaimAllArgs(options::OPT_pthread);
73 Args.ClaimAllArgs(options::OPT_pthreads);
77 CmdArgs.push_back(
"-o");
80 assert(Output.
isNothing() &&
"Invalid output.");
83 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
84 if (!Args.hasArg(options::OPT_shared))
86 Args.MakeArgString(getToolChain().GetFilePath(
"crt1.o")));
88 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crti.o")));
90 Args.MakeArgString(getToolChain().GetFilePath(
"values-Xa.o")));
92 Args.MakeArgString(getToolChain().GetFilePath(
"crtbegin.o")));
95 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
97 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
98 options::OPT_e, options::OPT_r});
103 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
104 if (getToolChain().ShouldLinkCXXStdlib(Args))
105 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
106 if (Args.hasArg(options::OPT_fstack_protector) ||
107 Args.hasArg(options::OPT_fstack_protector_strong) ||
108 Args.hasArg(options::OPT_fstack_protector_all)) {
110 CmdArgs.push_back(
"-lssp_nonshared");
111 CmdArgs.push_back(
"-lssp");
113 CmdArgs.push_back(
"-lgcc_s");
114 CmdArgs.push_back(
"-lc");
115 if (!Args.hasArg(options::OPT_shared)) {
116 CmdArgs.push_back(
"-lgcc");
117 CmdArgs.push_back(
"-lm");
119 if (NeedsSanitizerDeps)
123 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
125 Args.MakeArgString(getToolChain().GetFilePath(
"crtend.o")));
127 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
"crtn.o")));
129 getToolChain().addProfileRTLibs(Args, CmdArgs);
131 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
132 C.
addCommand(llvm::make_unique<Command>(JA, *
this, Exec, CmdArgs, Inputs));
136 switch (Triple.getArch()) {
137 case llvm::Triple::x86:
138 case llvm::Triple::sparc:
140 case llvm::Triple::x86_64:
142 case llvm::Triple::sparcv9:
145 llvm_unreachable(
"Unsupported architecture");
152 Solaris::Solaris(
const Driver &D,
const llvm::Triple &Triple,
179 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
183 Res |= SanitizerKind::Address;
184 Res |= SanitizerKind::PointerCompare;
185 Res |= SanitizerKind::PointerSubtract;
187 Res |= SanitizerKind::Vptr;
198 ArgStringList &CC1Args)
const {
201 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
204 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
207 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
209 llvm::sys::path::append(P,
"include");
213 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
217 StringRef CIncludeDirs(C_INCLUDE_DIRS);
218 if (CIncludeDirs !=
"") {
220 CIncludeDirs.split(dirs,
":");
221 for (StringRef dir : dirs) {
223 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
244 const llvm::opt::ArgList &DriverArgs,
245 llvm::opt::ArgStringList &CC1Args)
const {
const IncludeDirsFunc & includeDirsCallback() const
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...
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...
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
std::function< std::vector< std::string >(const Multilib &M)> IncludeDirsFunc
Compilation - A set of tasks to perform for a single driver invocation.
std::string ResourceDir
The path to the compiler resource directory.