clang: lib/Driver/ToolChains/OpenBSD.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
14#include "clang/Config/config.h"
18#include "llvm/Option/ArgList.h"
19#include "llvm/Support/Path.h"
20#include "llvm/Support/VirtualFileSystem.h"
21
25using namespace clang;
27
31 const ArgList &Args,
32 const char *LinkingOutput) const {
36 ArgStringList CmdArgs;
37
39
41 case llvm::Triple::x86:
42
43
44 CmdArgs.push_back("--32");
45 break;
46
47 case llvm::Triple::arm: {
48 StringRef MArch, MCPU;
51 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
52 break;
53 }
54
55 case llvm::Triple::ppc:
56 CmdArgs.push_back("-mppc");
57 CmdArgs.push_back("-many");
58 break;
59
60 case llvm::Triple::sparcv9: {
61 CmdArgs.push_back("-64");
62 std::string CPU = getCPUName(D, Args, Triple);
65 break;
66 }
67
68 case llvm::Triple::mips64:
69 case llvm::Triple::mips64el: {
70 StringRef CPUName;
71 StringRef ABIName;
73
74 CmdArgs.push_back("-march");
75 CmdArgs.push_back(CPUName.data());
76
77 CmdArgs.push_back("-mabi");
79
80 if (Triple.isLittleEndian())
81 CmdArgs.push_back("-EL");
82 else
83 CmdArgs.push_back("-EB");
84
86 break;
87 }
88
89 default:
90 break;
91 }
92
93 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
94
95 CmdArgs.push_back("-o");
97
98 for (const auto &II : Inputs)
99 CmdArgs.push_back(II.getFilename());
100
102 C.addCommand(std::make_unique(JA, *this,
104 Exec, CmdArgs, Inputs, Output));
105}
106
110 const ArgList &Args,
111 const char *LinkingOutput) const {
112 const auto &ToolChain = static_cast<const OpenBSD &>(getToolChain());
116 const bool Static = Args.hasArg(options::OPT_static);
117 const bool Shared = Args.hasArg(options::OPT_shared);
118 const bool Profiling = Args.hasArg(options::OPT_pg);
119 const bool Pie = Args.hasArg(options::OPT_pie);
120 const bool Nopie = Args.hasArg(options::OPT_no_pie, options::OPT_nopie);
121 const bool Relocatable = Args.hasArg(options::OPT_r);
122 ArgStringList CmdArgs;
123
124
125 Args.ClaimAllArgs(options::OPT_g_Group);
126
127 Args.ClaimAllArgs(options::OPT_emit_llvm);
128
129
130 Args.ClaimAllArgs(options::OPT_w);
131
132 if (.SysRoot.empty())
133 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
134
135 if (Arch == llvm::Triple::mips64)
136 CmdArgs.push_back("-EB");
137 else if (Arch == llvm::Triple::mips64el)
138 CmdArgs.push_back("-EL");
139
140 if (!Args.hasArg(options::OPT_nostdlib) && !Shared && !Relocatable) {
141 CmdArgs.push_back("-e");
142 CmdArgs.push_back("__start");
143 }
144
145 CmdArgs.push_back("--eh-frame-hdr");
147 CmdArgs.push_back("-Bstatic");
148 } else {
149 if (Args.hasArg(options::OPT_rdynamic))
150 CmdArgs.push_back("-export-dynamic");
151 if (Shared) {
152 CmdArgs.push_back("-shared");
153 } else if (!Relocatable) {
154 CmdArgs.push_back("-dynamic-linker");
155 CmdArgs.push_back("/usr/libexec/ld.so");
156 }
157 }
158
159 if (Pie)
160 CmdArgs.push_back("-pie");
161 if (Nopie || Profiling)
162 CmdArgs.push_back("-nopie");
163
164 if (Triple.isRISCV64()) {
165 CmdArgs.push_back("-X");
166 if (Args.hasArg(options::OPT_mno_relax))
167 CmdArgs.push_back("--no-relax");
168 }
169
170 assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
172 CmdArgs.push_back("-o");
174 }
175
176 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
177 options::OPT_r)) {
178 const char *crt0 = nullptr;
179 const char *crtbegin = nullptr;
180 if (!Shared) {
181 if (Profiling)
182 crt0 = "gcrt0.o";
183 else if (Static && !Nopie)
184 crt0 = "rcrt0.o";
185 else
186 crt0 = "crt0.o";
187 crtbegin = "crtbegin.o";
188 } else {
189 crtbegin = "crtbeginS.o";
190 }
191
192 if (crt0)
195 }
196
197 Args.AddAllArgs(CmdArgs, options::OPT_L);
199 Args.addAllArgs(CmdArgs,
200 {options::OPT_T_Group, options::OPT_s, options::OPT_t});
201
202 if (D.isUsingLTO()) {
203 assert(!Inputs.empty() && "Must have at least one input.");
204
205 auto Input = llvm::find_if(
207 if (Input == Inputs.end())
208
209
210 Input = Inputs.begin();
211
214 }
215
219
220 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
221 options::OPT_r)) {
222
223 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && ;
225
226 if (D.CCCIsCXX()) {
229 if (Profiling)
230 CmdArgs.push_back("-lm_p");
231 else
232 CmdArgs.push_back("-lm");
233 }
234
235
236 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
237
238
239
240
241
242 if (D.IsFlangMode() &&
243 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
246 if (Profiling)
247 CmdArgs.push_back("-lm_p");
248 else
249 CmdArgs.push_back("-lm");
250 }
251
252 if (NeedsSanitizerDeps) {
255 }
256 if (NeedsXRayDeps) {
259 }
260
261
262 CmdArgs.push_back("-lcompiler_rt");
263
264 if (Args.hasArg(options::OPT_pthread)) {
265 if (!Shared && Profiling)
266 CmdArgs.push_back("-lpthread_p");
267 else
268 CmdArgs.push_back("-lpthread");
269 }
270
271 if (!Shared) {
272 if (Profiling)
273 CmdArgs.push_back("-lc_p");
274 else
275 CmdArgs.push_back("-lc");
276 }
277
278 CmdArgs.push_back("-lcompiler_rt");
279 }
280
281 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
282 options::OPT_r)) {
283 const char *crtend = nullptr;
284 if (!Shared)
285 crtend = "crtend.o";
286 else
287 crtend = "crtendS.o";
288
290 }
291
293
295 C.addCommand(std::make_unique(JA, *this,
297 Exec, CmdArgs, Inputs, Output));
298}
299
301 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
302 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
304 if (IsX86 || IsX86_64) {
305 Res |= SanitizerKind::Vptr;
306 Res |= SanitizerKind::Fuzzer;
307 Res |= SanitizerKind::FuzzerNoLink;
308 }
309 if (IsX86_64) {
310 Res |= SanitizerKind::KernelAddress;
311 }
312 return Res;
313}
314
315
316
318 const ArgList &Args)
321}
322
324 const llvm::opt::ArgList &DriverArgs,
325 llvm::opt::ArgStringList &CC1Args) const {
327
328 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
329 return;
330
331 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
333 llvm::sys::path::append(Dir, "include");
335 }
336
337 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
338 return;
339
340
341 StringRef CIncludeDirs(C_INCLUDE_DIRS);
342 if (CIncludeDirs != "") {
344 CIncludeDirs.split(dirs, ":");
345 for (StringRef dir : dirs) {
346 StringRef Prefix =
347 llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : "";
349 }
350 return;
351 }
352
354 concat(D.SysRoot, "/usr/include"));
355}
356
358 llvm::opt::ArgStringList &CC1Args) const {
361}
362
364 ArgStringList &CmdArgs) const {
365 bool Profiling = Args.hasArg(options::OPT_pg);
366
367 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
368 if (Args.hasArg(options::OPT_fexperimental_library))
369 CmdArgs.push_back("-lc++experimental");
370 CmdArgs.push_back(Profiling ? "-lc++abi_p" : "-lc++abi");
371 CmdArgs.push_back(Profiling ? "-lpthread_p" : "-lpthread");
372}
373
376 if (Component == "builtins") {
378 llvm::sys::path::append(Path, "/usr/lib/libcompiler_rt.a");
380 return std::string(Path);
381 }
383 std::string CRTBasename =
385 llvm::sys::path::append(P, "lib", CRTBasename);
386
388 return std::string(P);
390}
391
394}
395
397
399
403 case llvm::Triple::arm:
405 default:
407 }
408}
The base class of the type hierarchy.
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...
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr ResponseFileSupport AtFileCurCP()