Coverage Report

Created: 2023-09-21 18:56

/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
}