13 #include "clang/Config/config.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 switch (getToolChain().getArch()) {
35 case llvm::Triple::x86:
38 CmdArgs.push_back(
"--32");
41 case llvm::Triple::ppc:
42 CmdArgs.push_back(
"-mppc");
43 CmdArgs.push_back(
"-many");
46 case llvm::Triple::sparcv9: {
47 CmdArgs.push_back(
"-64");
48 std::string CPU =
getCPUName(Args, getToolChain().getTriple());
54 case llvm::Triple::mips64:
55 case llvm::Triple::mips64el: {
60 CmdArgs.push_back(
"-mabi");
63 if (getToolChain().getTriple().isLittleEndian())
64 CmdArgs.push_back(
"-EL");
66 CmdArgs.push_back(
"-EB");
76 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
78 CmdArgs.push_back(
"-o");
81 for (
const auto &II : Inputs)
82 CmdArgs.push_back(II.getFilename());
84 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
85 C.addCommand(std::make_unique<Command>(JA, *
this,
87 Exec, CmdArgs, Inputs, Output));
94 const char *LinkingOutput)
const {
96 static_cast<const toolchains::OpenBSD &>(getToolChain());
97 const Driver &D = getToolChain().getDriver();
98 ArgStringList CmdArgs;
101 Args.ClaimAllArgs(options::OPT_g_Group);
103 Args.ClaimAllArgs(options::OPT_emit_llvm);
106 Args.ClaimAllArgs(options::OPT_w);
109 CmdArgs.push_back(
"-EB");
111 CmdArgs.push_back(
"-EL");
113 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
114 CmdArgs.push_back(
"-e");
115 CmdArgs.push_back(
"__start");
118 CmdArgs.push_back(
"--eh-frame-hdr");
119 if (Args.hasArg(options::OPT_static)) {
120 CmdArgs.push_back(
"-Bstatic");
122 if (Args.hasArg(options::OPT_rdynamic))
123 CmdArgs.push_back(
"-export-dynamic");
124 CmdArgs.push_back(
"-Bdynamic");
125 if (Args.hasArg(options::OPT_shared)) {
126 CmdArgs.push_back(
"-shared");
128 CmdArgs.push_back(
"-dynamic-linker");
129 CmdArgs.push_back(
"/usr/libexec/ld.so");
133 if (Args.hasArg(options::OPT_pie))
134 CmdArgs.push_back(
"-pie");
135 if (Args.hasArg(options::OPT_nopie) || Args.hasArg(options::OPT_pg))
136 CmdArgs.push_back(
"-nopie");
139 CmdArgs.push_back(
"-o");
142 assert(Output.
isNothing() &&
"Invalid output.");
145 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
146 const char *crt0 =
nullptr;
147 const char *crtbegin =
nullptr;
148 if (!Args.hasArg(options::OPT_shared)) {
149 if (Args.hasArg(options::OPT_pg))
151 else if (Args.hasArg(options::OPT_static) &&
152 !Args.hasArg(options::OPT_nopie))
156 crtbegin =
"crtbegin.o";
158 crtbegin =
"crtbeginS.o";
166 Args.AddAllArgs(CmdArgs, options::OPT_L);
168 Args.AddAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_e,
169 options::OPT_s, options::OPT_t,
170 options::OPT_Z_Flag, options::OPT_r});
176 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
180 if (Args.hasArg(options::OPT_pg))
181 CmdArgs.push_back(
"-lm_p");
183 CmdArgs.push_back(
"-lm");
185 if (NeedsSanitizerDeps) {
195 CmdArgs.push_back(
"-lcompiler_rt");
197 if (Args.hasArg(options::OPT_pthread)) {
198 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
199 CmdArgs.push_back(
"-lpthread_p");
201 CmdArgs.push_back(
"-lpthread");
204 if (!Args.hasArg(options::OPT_shared)) {
205 if (Args.hasArg(options::OPT_pg))
206 CmdArgs.push_back(
"-lc_p");
208 CmdArgs.push_back(
"-lc");
211 CmdArgs.push_back(
"-lcompiler_rt");
214 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
215 const char *crtend =
nullptr;
216 if (!Args.hasArg(options::OPT_shared))
219 crtend =
"crtendS.o";
225 C.addCommand(std::make_unique<Command>(JA, *
this,
227 Exec, CmdArgs, Inputs, Output));
231 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
232 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
237 if (IsX86 || IsX86_64) {
238 Res |= SanitizerKind::Vptr;
239 Res |= SanitizerKind::Fuzzer;
240 Res |= SanitizerKind::FuzzerNoLink;
248 OpenBSD::OpenBSD(
const Driver &D,
const llvm::Triple &Triple,
255 const llvm::opt::ArgList &DriverArgs,
256 llvm::opt::ArgStringList &CC1Args)
const {
259 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
262 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
264 llvm::sys::path::append(Dir,
"include");
268 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
272 StringRef CIncludeDirs(C_INCLUDE_DIRS);
273 if (CIncludeDirs !=
"") {
275 CIncludeDirs.split(dirs,
":");
276 for (StringRef dir : dirs) {
278 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
288 llvm::opt::ArgStringList &CC1Args)
const {
290 getDriver().SysRoot +
"/usr/include/c++/v1");
294 ArgStringList &CmdArgs)
const {
295 bool Profiling = Args.hasArg(options::OPT_pg);
297 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
298 CmdArgs.push_back(Profiling ?
"-lc++abi_p" :
"-lc++abi");
305 llvm::sys::path::append(Path,
"/usr/lib/libcompiler_rt.a");
306 return std::string(Path.str());
The base class of the type hierarchy.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
Dataflow Directional Tag Classes.
std::string SysRoot
sysroot, if present
Compilation - A set of tasks to perform for a single driver invocation.
static constexpr ResponseFileSupport AtFileCurCP()
std::string ResourceDir
The path to the compiler resource directory.