14 #include "clang/Config/config.h"
18 #include "llvm/Option/ArgList.h"
19 #include "llvm/Support/Path.h"
24 using namespace clang;
31 const char *LinkingOutput)
const {
38 ArgStringList CmdArgs;
41 case llvm::Triple::x86:
44 CmdArgs.push_back(
"--32");
47 case llvm::Triple::arm:
48 case llvm::Triple::armeb: {
49 StringRef MArch, MCPU;
52 CmdArgs.push_back(Args.MakeArgString(
"-mcpu=" + Arch));
56 case llvm::Triple::ppc:
57 CmdArgs.push_back(
"-mppc");
58 CmdArgs.push_back(
"-many");
61 case llvm::Triple::sparcv9: {
62 CmdArgs.push_back(
"-64");
69 case llvm::Triple::mips64:
70 case llvm::Triple::mips64el: {
75 CmdArgs.push_back(
"-march");
76 CmdArgs.push_back(CPUName.data());
78 CmdArgs.push_back(
"-mabi");
81 if (Triple.isLittleEndian())
82 CmdArgs.push_back(
"-EL");
84 CmdArgs.push_back(
"-EB");
94 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
96 CmdArgs.push_back(
"-o");
99 for (
const auto &II : Inputs)
100 CmdArgs.push_back(II.getFilename());
103 C.addCommand(std::make_unique<Command>(JA, *
this,
105 Exec, CmdArgs, Inputs, Output));
112 const char *LinkingOutput)
const {
116 ArgStringList CmdArgs;
119 Args.ClaimAllArgs(options::OPT_g_Group);
121 Args.ClaimAllArgs(options::OPT_emit_llvm);
124 Args.ClaimAllArgs(options::OPT_w);
127 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
130 CmdArgs.push_back(
"-EB");
132 CmdArgs.push_back(
"-EL");
134 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
135 CmdArgs.push_back(
"-e");
136 CmdArgs.push_back(
"__start");
139 CmdArgs.push_back(
"--eh-frame-hdr");
140 if (Args.hasArg(options::OPT_static)) {
141 CmdArgs.push_back(
"-Bstatic");
143 if (Args.hasArg(options::OPT_rdynamic))
144 CmdArgs.push_back(
"-export-dynamic");
145 CmdArgs.push_back(
"-Bdynamic");
146 if (Args.hasArg(options::OPT_shared)) {
147 CmdArgs.push_back(
"-shared");
149 CmdArgs.push_back(
"-dynamic-linker");
150 CmdArgs.push_back(
"/usr/libexec/ld.so");
154 if (Args.hasArg(options::OPT_pie))
155 CmdArgs.push_back(
"-pie");
156 if (Args.hasArg(options::OPT_nopie) || Args.hasArg(options::OPT_pg))
157 CmdArgs.push_back(
"-nopie");
160 CmdArgs.push_back(
"-o");
163 assert(Output.
isNothing() &&
"Invalid output.");
166 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
168 const char *crt0 =
nullptr;
169 const char *crtbegin =
nullptr;
170 if (!Args.hasArg(options::OPT_shared)) {
171 if (Args.hasArg(options::OPT_pg))
173 else if (Args.hasArg(options::OPT_static) &&
174 !Args.hasArg(options::OPT_nopie))
178 crtbegin =
"crtbegin.o";
180 crtbegin =
"crtbeginS.o";
188 Args.AddAllArgs(CmdArgs, options::OPT_L);
190 Args.AddAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_e,
191 options::OPT_s, options::OPT_t,
192 options::OPT_Z_Flag, options::OPT_r});
198 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
201 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
202 !Args.hasArg(options::OPT_static);
208 if (Args.hasArg(options::OPT_pg))
209 CmdArgs.push_back(
"-lm_p");
211 CmdArgs.push_back(
"-lm");
213 if (NeedsSanitizerDeps) {
223 CmdArgs.push_back(
"-lcompiler_rt");
225 if (Args.hasArg(options::OPT_pthread)) {
226 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
227 CmdArgs.push_back(
"-lpthread_p");
229 CmdArgs.push_back(
"-lpthread");
232 if (!Args.hasArg(options::OPT_shared)) {
233 if (Args.hasArg(options::OPT_pg))
234 CmdArgs.push_back(
"-lc_p");
236 CmdArgs.push_back(
"-lc");
239 CmdArgs.push_back(
"-lcompiler_rt");
242 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
244 const char *crtend =
nullptr;
245 if (!Args.hasArg(options::OPT_shared))
248 crtend =
"crtendS.o";
256 C.addCommand(std::make_unique<Command>(JA, *
this,
258 Exec, CmdArgs, Inputs, Output));
262 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
263 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
268 if (IsX86 || IsX86_64) {
269 Res |= SanitizerKind::Vptr;
270 Res |= SanitizerKind::Fuzzer;
271 Res |= SanitizerKind::FuzzerNoLink;
279 OpenBSD::OpenBSD(
const Driver &D,
const llvm::Triple &Triple,
286 const llvm::opt::ArgList &DriverArgs,
287 llvm::opt::ArgStringList &CC1Args)
const {
290 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
293 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
295 llvm::sys::path::append(Dir,
"include");
299 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
303 StringRef CIncludeDirs(C_INCLUDE_DIRS);
304 if (CIncludeDirs !=
"") {
306 CIncludeDirs.split(dirs,
":");
307 for (StringRef dir : dirs) {
309 llvm::sys::path::is_absolute(dir) ? StringRef(D.
SysRoot) :
"";
319 llvm::opt::ArgStringList &CC1Args)
const {
321 getDriver().SysRoot +
"/usr/include/c++/v1");
325 ArgStringList &CmdArgs)
const {
326 bool Profiling = Args.hasArg(options::OPT_pg);
328 CmdArgs.push_back(Profiling ?
"-lc++_p" :
"-lc++");
329 CmdArgs.push_back(Profiling ?
"-lc++abi_p" :
"-lc++abi");
330 CmdArgs.push_back(Profiling ?
"-lpthread_p" :
"-lpthread");
337 llvm::sys::path::append(Path,
"/usr/lib/libcompiler_rt.a");
351 case llvm::Triple::arm: