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