/src/llvm-project/clang/lib/Driver/ToolChains/NetBSD.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- NetBSD.cpp - NetBSD ToolChain Implementations ----------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #include "NetBSD.h" |
10 | | #include "Arch/ARM.h" |
11 | | #include "Arch/Mips.h" |
12 | | #include "Arch/Sparc.h" |
13 | | #include "CommonArgs.h" |
14 | | #include "clang/Config/config.h" |
15 | | #include "clang/Driver/Compilation.h" |
16 | | #include "clang/Driver/Driver.h" |
17 | | #include "clang/Driver/Options.h" |
18 | | #include "clang/Driver/SanitizerArgs.h" |
19 | | #include "llvm/Option/ArgList.h" |
20 | | #include "llvm/Support/VirtualFileSystem.h" |
21 | | |
22 | | using namespace clang::driver; |
23 | | using namespace clang::driver::tools; |
24 | | using namespace clang::driver::toolchains; |
25 | | using namespace clang; |
26 | | using namespace llvm::opt; |
27 | | |
28 | | void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, |
29 | | const InputInfo &Output, |
30 | | const InputInfoList &Inputs, |
31 | | const ArgList &Args, |
32 | 0 | const char *LinkingOutput) const { |
33 | 0 | const auto &ToolChain = static_cast<const NetBSD &>(getToolChain()); |
34 | 0 | const Driver &D = ToolChain.getDriver(); |
35 | 0 | const llvm::Triple &Triple = ToolChain.getTriple(); |
36 | 0 | ArgStringList CmdArgs; |
37 | |
|
38 | 0 | claimNoWarnArgs(Args); |
39 | | |
40 | | // GNU as needs different flags for creating the correct output format |
41 | | // on architectures with different ABIs or optional feature sets. |
42 | 0 | switch (ToolChain.getArch()) { |
43 | 0 | case llvm::Triple::x86: |
44 | 0 | CmdArgs.push_back("--32"); |
45 | 0 | break; |
46 | 0 | case llvm::Triple::arm: |
47 | 0 | case llvm::Triple::armeb: |
48 | 0 | case llvm::Triple::thumb: |
49 | 0 | case llvm::Triple::thumbeb: { |
50 | 0 | StringRef MArch, MCPU; |
51 | 0 | arm::getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true); |
52 | 0 | std::string Arch = arm::getARMTargetCPU(MCPU, MArch, Triple); |
53 | 0 | CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch)); |
54 | 0 | break; |
55 | 0 | } |
56 | | |
57 | 0 | case llvm::Triple::mips: |
58 | 0 | case llvm::Triple::mipsel: |
59 | 0 | case llvm::Triple::mips64: |
60 | 0 | case llvm::Triple::mips64el: { |
61 | 0 | StringRef CPUName; |
62 | 0 | StringRef ABIName; |
63 | 0 | mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); |
64 | |
|
65 | 0 | CmdArgs.push_back("-march"); |
66 | 0 | CmdArgs.push_back(CPUName.data()); |
67 | |
|
68 | 0 | CmdArgs.push_back("-mabi"); |
69 | 0 | CmdArgs.push_back(mips::getGnuCompatibleMipsABIName(ABIName).data()); |
70 | |
|
71 | 0 | if (Triple.isLittleEndian()) |
72 | 0 | CmdArgs.push_back("-EL"); |
73 | 0 | else |
74 | 0 | CmdArgs.push_back("-EB"); |
75 | |
|
76 | 0 | AddAssemblerKPIC(ToolChain, Args, CmdArgs); |
77 | 0 | break; |
78 | 0 | } |
79 | | |
80 | 0 | case llvm::Triple::sparc: { |
81 | 0 | CmdArgs.push_back("-32"); |
82 | 0 | std::string CPU = getCPUName(D, Args, Triple); |
83 | 0 | CmdArgs.push_back(sparc::getSparcAsmModeForCPU(CPU, Triple)); |
84 | 0 | AddAssemblerKPIC(ToolChain, Args, CmdArgs); |
85 | 0 | break; |
86 | 0 | } |
87 | | |
88 | 0 | case llvm::Triple::sparcv9: { |
89 | 0 | CmdArgs.push_back("-64"); |
90 | 0 | std::string CPU = getCPUName(D, Args, Triple); |
91 | 0 | CmdArgs.push_back(sparc::getSparcAsmModeForCPU(CPU, Triple)); |
92 | 0 | AddAssemblerKPIC(ToolChain, Args, CmdArgs); |
93 | 0 | break; |
94 | 0 | } |
95 | | |
96 | 0 | default: |
97 | 0 | break; |
98 | 0 | } |
99 | | |
100 | 0 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); |
101 | |
|
102 | 0 | CmdArgs.push_back("-o"); |
103 | 0 | CmdArgs.push_back(Output.getFilename()); |
104 | |
|
105 | 0 | for (const auto &II : Inputs) |
106 | 0 | CmdArgs.push_back(II.getFilename()); |
107 | |
|
108 | 0 | const char *Exec = Args.MakeArgString((ToolChain.GetProgramPath("as"))); |
109 | 0 | C.addCommand(std::make_unique<Command>(JA, *this, |
110 | 0 | ResponseFileSupport::AtFileCurCP(), |
111 | 0 | Exec, CmdArgs, Inputs, Output)); |
112 | 0 | } |
113 | | |
114 | | void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, |
115 | | const InputInfo &Output, |
116 | | const InputInfoList &Inputs, |
117 | | const ArgList &Args, |
118 | 0 | const char *LinkingOutput) const { |
119 | 0 | const auto &ToolChain = static_cast<const NetBSD &>(getToolChain()); |
120 | 0 | const Driver &D = ToolChain.getDriver(); |
121 | 0 | const llvm::Triple &Triple = ToolChain.getTriple(); |
122 | 0 | const llvm::Triple::ArchType Arch = ToolChain.getArch(); |
123 | 0 | const bool Static = Args.hasArg(options::OPT_static); |
124 | 0 | const bool Shared = Args.hasArg(options::OPT_shared); |
125 | 0 | const bool Pie = Args.hasArg(options::OPT_pie); |
126 | 0 | ArgStringList CmdArgs; |
127 | |
|
128 | 0 | if (!D.SysRoot.empty()) |
129 | 0 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); |
130 | |
|
131 | 0 | CmdArgs.push_back("--eh-frame-hdr"); |
132 | 0 | if (Static) { |
133 | 0 | CmdArgs.push_back("-Bstatic"); |
134 | 0 | if (Pie) { |
135 | 0 | Args.AddAllArgs(CmdArgs, options::OPT_pie); |
136 | 0 | CmdArgs.push_back("--no-dynamic-linker"); |
137 | 0 | } |
138 | 0 | } else { |
139 | 0 | if (Args.hasArg(options::OPT_rdynamic)) |
140 | 0 | CmdArgs.push_back("-export-dynamic"); |
141 | 0 | if (Shared) { |
142 | 0 | CmdArgs.push_back("-shared"); |
143 | 0 | } else if (!Args.hasArg(options::OPT_r)) { |
144 | 0 | Args.AddAllArgs(CmdArgs, options::OPT_pie); |
145 | 0 | CmdArgs.push_back("-dynamic-linker"); |
146 | 0 | CmdArgs.push_back("/libexec/ld.elf_so"); |
147 | 0 | } |
148 | 0 | } |
149 | | |
150 | | // Many NetBSD architectures support more than one ABI. |
151 | | // Determine the correct emulation for ld. |
152 | 0 | switch (Arch) { |
153 | 0 | case llvm::Triple::x86: |
154 | 0 | CmdArgs.push_back("-m"); |
155 | 0 | CmdArgs.push_back("elf_i386"); |
156 | 0 | break; |
157 | 0 | case llvm::Triple::arm: |
158 | 0 | case llvm::Triple::thumb: |
159 | 0 | CmdArgs.push_back("-m"); |
160 | 0 | switch (Triple.getEnvironment()) { |
161 | 0 | case llvm::Triple::EABI: |
162 | 0 | case llvm::Triple::GNUEABI: |
163 | 0 | CmdArgs.push_back("armelf_nbsd_eabi"); |
164 | 0 | break; |
165 | 0 | case llvm::Triple::EABIHF: |
166 | 0 | case llvm::Triple::GNUEABIHF: |
167 | 0 | CmdArgs.push_back("armelf_nbsd_eabihf"); |
168 | 0 | break; |
169 | 0 | default: |
170 | 0 | CmdArgs.push_back("armelf_nbsd"); |
171 | 0 | break; |
172 | 0 | } |
173 | 0 | break; |
174 | 0 | case llvm::Triple::armeb: |
175 | 0 | case llvm::Triple::thumbeb: |
176 | 0 | arm::appendBE8LinkFlag(Args, CmdArgs, ToolChain.getEffectiveTriple()); |
177 | 0 | CmdArgs.push_back("-m"); |
178 | 0 | switch (Triple.getEnvironment()) { |
179 | 0 | case llvm::Triple::EABI: |
180 | 0 | case llvm::Triple::GNUEABI: |
181 | 0 | CmdArgs.push_back("armelfb_nbsd_eabi"); |
182 | 0 | break; |
183 | 0 | case llvm::Triple::EABIHF: |
184 | 0 | case llvm::Triple::GNUEABIHF: |
185 | 0 | CmdArgs.push_back("armelfb_nbsd_eabihf"); |
186 | 0 | break; |
187 | 0 | default: |
188 | 0 | CmdArgs.push_back("armelfb_nbsd"); |
189 | 0 | break; |
190 | 0 | } |
191 | 0 | break; |
192 | 0 | case llvm::Triple::mips64: |
193 | 0 | case llvm::Triple::mips64el: |
194 | 0 | if (mips::hasMipsAbiArg(Args, "32")) { |
195 | 0 | CmdArgs.push_back("-m"); |
196 | 0 | if (Arch == llvm::Triple::mips64) |
197 | 0 | CmdArgs.push_back("elf32btsmip"); |
198 | 0 | else |
199 | 0 | CmdArgs.push_back("elf32ltsmip"); |
200 | 0 | } else if (mips::hasMipsAbiArg(Args, "64")) { |
201 | 0 | CmdArgs.push_back("-m"); |
202 | 0 | if (Arch == llvm::Triple::mips64) |
203 | 0 | CmdArgs.push_back("elf64btsmip"); |
204 | 0 | else |
205 | 0 | CmdArgs.push_back("elf64ltsmip"); |
206 | 0 | } |
207 | 0 | break; |
208 | 0 | case llvm::Triple::ppc: |
209 | 0 | CmdArgs.push_back("-m"); |
210 | 0 | CmdArgs.push_back("elf32ppc_nbsd"); |
211 | 0 | break; |
212 | | |
213 | 0 | case llvm::Triple::ppc64: |
214 | 0 | case llvm::Triple::ppc64le: |
215 | 0 | CmdArgs.push_back("-m"); |
216 | 0 | CmdArgs.push_back("elf64ppc"); |
217 | 0 | break; |
218 | | |
219 | 0 | case llvm::Triple::riscv32: |
220 | 0 | CmdArgs.push_back("-m"); |
221 | 0 | CmdArgs.push_back("elf32lriscv"); |
222 | 0 | break; |
223 | | |
224 | 0 | case llvm::Triple::riscv64: |
225 | 0 | CmdArgs.push_back("-m"); |
226 | 0 | CmdArgs.push_back("elf64lriscv"); |
227 | 0 | break; |
228 | | |
229 | 0 | case llvm::Triple::sparc: |
230 | 0 | CmdArgs.push_back("-m"); |
231 | 0 | CmdArgs.push_back("elf32_sparc"); |
232 | 0 | break; |
233 | | |
234 | 0 | case llvm::Triple::sparcv9: |
235 | 0 | CmdArgs.push_back("-m"); |
236 | 0 | CmdArgs.push_back("elf64_sparc"); |
237 | 0 | break; |
238 | | |
239 | 0 | default: |
240 | 0 | break; |
241 | 0 | } |
242 | | |
243 | 0 | if (Triple.isRISCV()) |
244 | 0 | CmdArgs.push_back("-X"); |
245 | |
|
246 | 0 | assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); |
247 | 0 | if (Output.isFilename()) { |
248 | 0 | CmdArgs.push_back("-o"); |
249 | 0 | CmdArgs.push_back(Output.getFilename()); |
250 | 0 | } |
251 | |
|
252 | 0 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles, |
253 | 0 | options::OPT_r)) { |
254 | 0 | const char *crt0 = nullptr; |
255 | 0 | const char *crtbegin = nullptr; |
256 | 0 | if (!Shared) |
257 | 0 | crt0 = "crt0.o"; |
258 | |
|
259 | 0 | if (Shared || Pie) |
260 | 0 | crtbegin = "crtbeginS.o"; |
261 | 0 | else |
262 | 0 | crtbegin = "crtbegin.o"; |
263 | |
|
264 | 0 | if (crt0) |
265 | 0 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt0))); |
266 | 0 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); |
267 | 0 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); |
268 | 0 | } |
269 | |
|
270 | 0 | Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, |
271 | 0 | options::OPT_s, options::OPT_t, options::OPT_r}); |
272 | 0 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); |
273 | |
|
274 | 0 | bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); |
275 | 0 | bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs); |
276 | 0 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA); |
277 | |
|
278 | 0 | const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args); |
279 | 0 | if (SanArgs.needsSharedRt()) { |
280 | 0 | CmdArgs.push_back("-rpath"); |
281 | 0 | CmdArgs.push_back(Args.MakeArgString(ToolChain.getCompilerRTPath())); |
282 | 0 | } |
283 | |
|
284 | 0 | bool useLibgcc = true; |
285 | 0 | switch (ToolChain.getArch()) { |
286 | 0 | case llvm::Triple::aarch64: |
287 | 0 | case llvm::Triple::aarch64_be: |
288 | 0 | case llvm::Triple::arm: |
289 | 0 | case llvm::Triple::armeb: |
290 | 0 | case llvm::Triple::thumb: |
291 | 0 | case llvm::Triple::thumbeb: |
292 | 0 | case llvm::Triple::ppc: |
293 | 0 | case llvm::Triple::ppc64: |
294 | 0 | case llvm::Triple::ppc64le: |
295 | 0 | case llvm::Triple::riscv32: |
296 | 0 | case llvm::Triple::riscv64: |
297 | 0 | case llvm::Triple::sparc: |
298 | 0 | case llvm::Triple::sparcv9: |
299 | 0 | case llvm::Triple::x86: |
300 | 0 | case llvm::Triple::x86_64: |
301 | 0 | useLibgcc = false; |
302 | 0 | break; |
303 | 0 | default: |
304 | 0 | break; |
305 | 0 | } |
306 | | |
307 | 0 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs, |
308 | 0 | options::OPT_r)) { |
309 | | // Use the static OpenMP runtime with -static-openmp |
310 | 0 | bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && !Static; |
311 | 0 | addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP); |
312 | |
|
313 | 0 | if (D.CCCIsCXX()) { |
314 | 0 | if (ToolChain.ShouldLinkCXXStdlib(Args)) |
315 | 0 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); |
316 | 0 | CmdArgs.push_back("-lm"); |
317 | 0 | } |
318 | | |
319 | | // Silence warnings when linking C code with a C++ '-stdlib' argument. |
320 | 0 | Args.ClaimAllArgs(options::OPT_stdlib_EQ); |
321 | | |
322 | | // Additional linker set-up and flags for Fortran. This is required in order |
323 | | // to generate executables. As Fortran runtime depends on the C runtime, |
324 | | // these dependencies need to be listed before the C runtime below (i.e. |
325 | | // AddRunTimeLibs). |
326 | 0 | if (D.IsFlangMode()) { |
327 | 0 | addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs); |
328 | 0 | addFortranRuntimeLibs(ToolChain, Args, CmdArgs); |
329 | 0 | CmdArgs.push_back("-lm"); |
330 | 0 | } |
331 | |
|
332 | 0 | if (NeedsSanitizerDeps) |
333 | 0 | linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs); |
334 | 0 | if (NeedsXRayDeps) |
335 | 0 | linkXRayRuntimeDeps(ToolChain, Args, CmdArgs); |
336 | 0 | if (Args.hasArg(options::OPT_pthread)) |
337 | 0 | CmdArgs.push_back("-lpthread"); |
338 | 0 | CmdArgs.push_back("-lc"); |
339 | |
|
340 | 0 | if (useLibgcc) { |
341 | 0 | if (Static) { |
342 | | // libgcc_eh depends on libc, so resolve as much as possible, |
343 | | // pull in any new requirements from libc and then get the rest |
344 | | // of libgcc. |
345 | 0 | CmdArgs.push_back("-lgcc_eh"); |
346 | 0 | CmdArgs.push_back("-lc"); |
347 | 0 | CmdArgs.push_back("-lgcc"); |
348 | 0 | } else { |
349 | 0 | CmdArgs.push_back("-lgcc"); |
350 | 0 | CmdArgs.push_back("--as-needed"); |
351 | 0 | CmdArgs.push_back("-lgcc_s"); |
352 | 0 | CmdArgs.push_back("--no-as-needed"); |
353 | 0 | } |
354 | 0 | } |
355 | 0 | } |
356 | |
|
357 | 0 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles, |
358 | 0 | options::OPT_r)) { |
359 | 0 | const char *crtend = nullptr; |
360 | 0 | if (Shared || Pie) |
361 | 0 | crtend = "crtendS.o"; |
362 | 0 | else |
363 | 0 | crtend = "crtend.o"; |
364 | |
|
365 | 0 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); |
366 | 0 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); |
367 | 0 | } |
368 | |
|
369 | 0 | ToolChain.addProfileRTLibs(Args, CmdArgs); |
370 | |
|
371 | 0 | const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); |
372 | 0 | C.addCommand(std::make_unique<Command>(JA, *this, |
373 | 0 | ResponseFileSupport::AtFileCurCP(), |
374 | 0 | Exec, CmdArgs, Inputs, Output)); |
375 | 0 | } |
376 | | |
377 | | /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly. |
378 | | |
379 | | NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) |
380 | 0 | : Generic_ELF(D, Triple, Args) { |
381 | 0 | if (!Args.hasArg(options::OPT_nostdlib)) { |
382 | | // When targeting a 32-bit platform, try the special directory used on |
383 | | // 64-bit hosts, and only fall back to the main library directory if that |
384 | | // doesn't work. |
385 | | // FIXME: It'd be nicer to test if this directory exists, but I'm not sure |
386 | | // what all logic is needed to emulate the '=' prefix here. |
387 | 0 | switch (Triple.getArch()) { |
388 | 0 | case llvm::Triple::x86: |
389 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/i386")); |
390 | 0 | break; |
391 | 0 | case llvm::Triple::arm: |
392 | 0 | case llvm::Triple::armeb: |
393 | 0 | case llvm::Triple::thumb: |
394 | 0 | case llvm::Triple::thumbeb: |
395 | 0 | switch (Triple.getEnvironment()) { |
396 | 0 | case llvm::Triple::EABI: |
397 | 0 | case llvm::Triple::GNUEABI: |
398 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/eabi")); |
399 | 0 | break; |
400 | 0 | case llvm::Triple::EABIHF: |
401 | 0 | case llvm::Triple::GNUEABIHF: |
402 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/eabihf")); |
403 | 0 | break; |
404 | 0 | default: |
405 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/oabi")); |
406 | 0 | break; |
407 | 0 | } |
408 | 0 | break; |
409 | 0 | case llvm::Triple::mips64: |
410 | 0 | case llvm::Triple::mips64el: |
411 | 0 | if (tools::mips::hasMipsAbiArg(Args, "o32")) |
412 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/o32")); |
413 | 0 | else if (tools::mips::hasMipsAbiArg(Args, "64")) |
414 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/64")); |
415 | 0 | break; |
416 | 0 | case llvm::Triple::ppc: |
417 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/powerpc")); |
418 | 0 | break; |
419 | 0 | case llvm::Triple::sparc: |
420 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib/sparc")); |
421 | 0 | break; |
422 | 0 | default: |
423 | 0 | break; |
424 | 0 | } |
425 | | |
426 | 0 | getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib")); |
427 | 0 | } |
428 | 0 | } |
429 | | |
430 | 0 | Tool *NetBSD::buildAssembler() const { |
431 | 0 | return new tools::netbsd::Assembler(*this); |
432 | 0 | } |
433 | | |
434 | 0 | Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); } |
435 | | |
436 | 0 | ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const { |
437 | 0 | switch (getArch()) { |
438 | 0 | case llvm::Triple::aarch64: |
439 | 0 | case llvm::Triple::aarch64_be: |
440 | 0 | case llvm::Triple::arm: |
441 | 0 | case llvm::Triple::armeb: |
442 | 0 | case llvm::Triple::thumb: |
443 | 0 | case llvm::Triple::thumbeb: |
444 | 0 | case llvm::Triple::ppc: |
445 | 0 | case llvm::Triple::ppc64: |
446 | 0 | case llvm::Triple::ppc64le: |
447 | 0 | case llvm::Triple::riscv32: |
448 | 0 | case llvm::Triple::riscv64: |
449 | 0 | case llvm::Triple::sparc: |
450 | 0 | case llvm::Triple::sparcv9: |
451 | 0 | case llvm::Triple::x86: |
452 | 0 | case llvm::Triple::x86_64: |
453 | 0 | return ToolChain::CST_Libcxx; |
454 | 0 | default: |
455 | 0 | break; |
456 | 0 | } |
457 | 0 | return ToolChain::CST_Libstdcxx; |
458 | 0 | } |
459 | | |
460 | | void NetBSD::AddClangSystemIncludeArgs( |
461 | | const llvm::opt::ArgList &DriverArgs, |
462 | 0 | llvm::opt::ArgStringList &CC1Args) const { |
463 | 0 | const Driver &D = getDriver(); |
464 | |
|
465 | 0 | if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc)) |
466 | 0 | return; |
467 | | |
468 | 0 | if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { |
469 | 0 | SmallString<128> Dir(D.ResourceDir); |
470 | 0 | llvm::sys::path::append(Dir, "include"); |
471 | 0 | addSystemInclude(DriverArgs, CC1Args, Dir.str()); |
472 | 0 | } |
473 | |
|
474 | 0 | if (DriverArgs.hasArg(options::OPT_nostdlibinc)) |
475 | 0 | return; |
476 | | |
477 | | // Check for configure-time C include directories. |
478 | 0 | StringRef CIncludeDirs(C_INCLUDE_DIRS); |
479 | 0 | if (CIncludeDirs != "") { |
480 | 0 | SmallVector<StringRef, 5> dirs; |
481 | 0 | CIncludeDirs.split(dirs, ":"); |
482 | 0 | for (StringRef dir : dirs) { |
483 | 0 | StringRef Prefix = |
484 | 0 | llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : ""; |
485 | 0 | addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir); |
486 | 0 | } |
487 | 0 | return; |
488 | 0 | } |
489 | | |
490 | 0 | addExternCSystemInclude(DriverArgs, CC1Args, |
491 | 0 | concat(D.SysRoot, "/usr/include")); |
492 | 0 | } |
493 | | |
494 | | void NetBSD::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, |
495 | 0 | llvm::opt::ArgStringList &CC1Args) const { |
496 | 0 | const std::string Candidates[] = { |
497 | | // directory relative to build tree |
498 | 0 | concat(getDriver().Dir, "/../include/c++/v1"), |
499 | | // system install with full upstream path |
500 | 0 | concat(getDriver().SysRoot, "/usr/include/c++/v1"), |
501 | | // system install from src |
502 | 0 | concat(getDriver().SysRoot, "/usr/include/c++"), |
503 | 0 | }; |
504 | |
|
505 | 0 | for (const auto &IncludePath : Candidates) { |
506 | 0 | if (!getVFS().exists(IncludePath + "/__config")) |
507 | 0 | continue; |
508 | | |
509 | | // Use the first candidate that looks valid. |
510 | 0 | addSystemInclude(DriverArgs, CC1Args, IncludePath); |
511 | 0 | return; |
512 | 0 | } |
513 | 0 | } |
514 | | |
515 | | void NetBSD::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, |
516 | 0 | llvm::opt::ArgStringList &CC1Args) const { |
517 | 0 | addLibStdCXXIncludePaths(concat(getDriver().SysRoot, "/usr/include/g++"), "", "", |
518 | 0 | DriverArgs, CC1Args); |
519 | 0 | } |
520 | | |
521 | 0 | llvm::ExceptionHandling NetBSD::GetExceptionModel(const ArgList &Args) const { |
522 | | // NetBSD uses Dwarf exceptions on ARM. |
523 | 0 | llvm::Triple::ArchType TArch = getTriple().getArch(); |
524 | 0 | if (TArch == llvm::Triple::arm || TArch == llvm::Triple::armeb || |
525 | 0 | TArch == llvm::Triple::thumb || TArch == llvm::Triple::thumbeb) |
526 | 0 | return llvm::ExceptionHandling::DwarfCFI; |
527 | 0 | return llvm::ExceptionHandling::None; |
528 | 0 | } |
529 | | |
530 | 0 | SanitizerMask NetBSD::getSupportedSanitizers() const { |
531 | 0 | const bool IsX86 = getTriple().getArch() == llvm::Triple::x86; |
532 | 0 | const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64; |
533 | 0 | SanitizerMask Res = ToolChain::getSupportedSanitizers(); |
534 | 0 | if (IsX86 || IsX86_64) { |
535 | 0 | Res |= SanitizerKind::Address; |
536 | 0 | Res |= SanitizerKind::PointerCompare; |
537 | 0 | Res |= SanitizerKind::PointerSubtract; |
538 | 0 | Res |= SanitizerKind::Leak; |
539 | 0 | Res |= SanitizerKind::SafeStack; |
540 | 0 | Res |= SanitizerKind::Scudo; |
541 | 0 | Res |= SanitizerKind::Vptr; |
542 | 0 | } |
543 | 0 | if (IsX86_64) { |
544 | 0 | Res |= SanitizerKind::DataFlow; |
545 | 0 | Res |= SanitizerKind::Fuzzer; |
546 | 0 | Res |= SanitizerKind::FuzzerNoLink; |
547 | 0 | Res |= SanitizerKind::HWAddress; |
548 | 0 | Res |= SanitizerKind::KernelAddress; |
549 | 0 | Res |= SanitizerKind::KernelHWAddress; |
550 | 0 | Res |= SanitizerKind::KernelMemory; |
551 | 0 | Res |= SanitizerKind::Memory; |
552 | 0 | Res |= SanitizerKind::Thread; |
553 | 0 | } |
554 | 0 | return Res; |
555 | 0 | } |
556 | | |
557 | | void NetBSD::addClangTargetOptions(const ArgList &DriverArgs, |
558 | | ArgStringList &CC1Args, |
559 | 0 | Action::OffloadKind) const { |
560 | 0 | const SanitizerArgs &SanArgs = getSanitizerArgs(DriverArgs); |
561 | 0 | if (SanArgs.hasAnySanitizer()) |
562 | 0 | CC1Args.push_back("-D_REENTRANT"); |
563 | |
|
564 | 0 | VersionTuple OsVersion = getTriple().getOSVersion(); |
565 | 0 | bool UseInitArrayDefault = |
566 | 0 | OsVersion >= VersionTuple(9) || OsVersion.getMajor() == 0 || |
567 | 0 | getTriple().getArch() == llvm::Triple::aarch64 || |
568 | 0 | getTriple().getArch() == llvm::Triple::aarch64_be || |
569 | 0 | getTriple().getArch() == llvm::Triple::arm || |
570 | 0 | getTriple().getArch() == llvm::Triple::armeb || |
571 | 0 | getTriple().getArch() == llvm::Triple::riscv32 || |
572 | 0 | getTriple().getArch() == llvm::Triple::riscv64; |
573 | |
|
574 | 0 | if (!DriverArgs.hasFlag(options::OPT_fuse_init_array, |
575 | 0 | options::OPT_fno_use_init_array, UseInitArrayDefault)) |
576 | 0 | CC1Args.push_back("-fno-use-init-array"); |
577 | 0 | } |