Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/clang/lib/Basic/Targets.cpp
Line
Count
Source (jump to first uncovered line)
1
//===--- Targets.cpp - Implement target feature support -------------------===//
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
// This file implements construction of a TargetInfo object from a
10
// target triple.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#include "Targets.h"
15
16
#include "Targets/AArch64.h"
17
#include "Targets/AMDGPU.h"
18
#include "Targets/ARC.h"
19
#include "Targets/ARM.h"
20
#include "Targets/AVR.h"
21
#include "Targets/BPF.h"
22
#include "Targets/CSKY.h"
23
#include "Targets/DirectX.h"
24
#include "Targets/Hexagon.h"
25
#include "Targets/Lanai.h"
26
#include "Targets/Le64.h"
27
#include "Targets/LoongArch.h"
28
#include "Targets/M68k.h"
29
#include "Targets/MSP430.h"
30
#include "Targets/Mips.h"
31
#include "Targets/NVPTX.h"
32
#include "Targets/OSTargets.h"
33
#include "Targets/PNaCl.h"
34
#include "Targets/PPC.h"
35
#include "Targets/RISCV.h"
36
#include "Targets/SPIR.h"
37
#include "Targets/Sparc.h"
38
#include "Targets/SystemZ.h"
39
#include "Targets/TCE.h"
40
#include "Targets/VE.h"
41
#include "Targets/WebAssembly.h"
42
#include "Targets/X86.h"
43
#include "Targets/XCore.h"
44
#include "clang/Basic/Diagnostic.h"
45
#include "clang/Basic/DiagnosticFrontend.h"
46
#include "llvm/ADT/StringExtras.h"
47
#include "llvm/TargetParser/Triple.h"
48
49
using namespace clang;
50
51
namespace clang {
52
namespace targets {
53
//===----------------------------------------------------------------------===//
54
//  Common code shared among targets.
55
//===----------------------------------------------------------------------===//
56
57
/// DefineStd - Define a macro name and standard variants.  For example if
58
/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
59
/// when in GNU mode.
60
void DefineStd(MacroBuilder &Builder, StringRef MacroName,
61
92
               const LangOptions &Opts) {
62
92
  assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
63
64
  // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
65
  // in the user's namespace.
66
92
  if (Opts.GNUMode)
67
92
    Builder.defineMacro(MacroName);
68
69
  // Define __unix.
70
92
  Builder.defineMacro("__" + MacroName);
71
72
  // Define __unix__.
73
92
  Builder.defineMacro("__" + MacroName + "__");
74
92
}
75
76
0
void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning) {
77
0
  Builder.defineMacro("__" + CPUName);
78
0
  Builder.defineMacro("__" + CPUName + "__");
79
0
  if (Tuning)
80
0
    Builder.defineMacro("__tune_" + CPUName + "__");
81
0
}
82
83
0
void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
84
  // Mingw and cygwin define __declspec(a) to __attribute__((a)).  Clang
85
  // supports __declspec natively under -fdeclspec (also enabled with
86
  // -fms-extensions), but we define a no-op __declspec macro anyway for
87
  // pre-processor compatibility.
88
0
  if (Opts.DeclSpecKeyword)
89
0
    Builder.defineMacro("__declspec", "__declspec");
90
0
  else
91
0
    Builder.defineMacro("__declspec(a)", "__attribute__((a))");
92
93
0
  if (!Opts.MicrosoftExt) {
94
    // Provide macros for all the calling convention keywords.  Provide both
95
    // single and double underscore prefixed variants.  These are available on
96
    // x64 as well as x86, even though they have no effect.
97
0
    const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
98
0
    for (const char *CC : CCs) {
99
0
      std::string GCCSpelling = "__attribute__((__";
100
0
      GCCSpelling += CC;
101
0
      GCCSpelling += "__))";
102
0
      Builder.defineMacro(Twine("_") + CC, GCCSpelling);
103
0
      Builder.defineMacro(Twine("__") + CC, GCCSpelling);
104
0
    }
105
0
  }
106
0
}
107
108
//===----------------------------------------------------------------------===//
109
// Driver code
110
//===----------------------------------------------------------------------===//
111
112
std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
113
46
                                           const TargetOptions &Opts) {
114
46
  llvm::Triple::OSType os = Triple.getOS();
115
116
46
  switch (Triple.getArch()) {
117
0
  default:
118
0
    return nullptr;
119
120
0
  case llvm::Triple::arc:
121
0
    return std::make_unique<ARCTargetInfo>(Triple, Opts);
122
123
0
  case llvm::Triple::xcore:
124
0
    return std::make_unique<XCoreTargetInfo>(Triple, Opts);
125
126
0
  case llvm::Triple::hexagon:
127
0
    if (os == llvm::Triple::Linux &&
128
0
        Triple.getEnvironment() == llvm::Triple::Musl)
129
0
      return std::make_unique<LinuxTargetInfo<HexagonTargetInfo>>(Triple, Opts);
130
0
    return std::make_unique<HexagonTargetInfo>(Triple, Opts);
131
132
0
  case llvm::Triple::lanai:
133
0
    return std::make_unique<LanaiTargetInfo>(Triple, Opts);
134
135
0
  case llvm::Triple::aarch64_32:
136
0
    if (Triple.isOSDarwin())
137
0
      return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
138
139
0
    return nullptr;
140
0
  case llvm::Triple::aarch64:
141
0
    if (Triple.isOSDarwin())
142
0
      return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
143
144
0
    switch (os) {
145
0
    case llvm::Triple::FreeBSD:
146
0
      return std::make_unique<FreeBSDTargetInfo<AArch64leTargetInfo>>(Triple,
147
0
                                                                      Opts);
148
0
    case llvm::Triple::Fuchsia:
149
0
      return std::make_unique<FuchsiaTargetInfo<AArch64leTargetInfo>>(Triple,
150
0
                                                                      Opts);
151
0
    case llvm::Triple::Haiku:
152
0
      return std::make_unique<HaikuTargetInfo<AArch64leTargetInfo>>(Triple,
153
0
                                                                    Opts);
154
0
    case llvm::Triple::Linux:
155
0
      switch (Triple.getEnvironment()) {
156
0
      default:
157
0
        return std::make_unique<LinuxTargetInfo<AArch64leTargetInfo>>(Triple,
158
0
                                                                      Opts);
159
0
      case llvm::Triple::OpenHOS:
160
0
        return std::make_unique<OHOSTargetInfo<AArch64leTargetInfo>>(Triple,
161
0
                                                                     Opts);
162
0
      }
163
0
    case llvm::Triple::NetBSD:
164
0
      return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple,
165
0
                                                                     Opts);
166
0
    case llvm::Triple::OpenBSD:
167
0
      return std::make_unique<OpenBSDTargetInfo<AArch64leTargetInfo>>(Triple,
168
0
                                                                      Opts);
169
0
    case llvm::Triple::Win32:
170
0
      switch (Triple.getEnvironment()) {
171
0
      case llvm::Triple::GNU:
172
0
        return std::make_unique<MinGWARM64TargetInfo>(Triple, Opts);
173
0
      case llvm::Triple::MSVC:
174
0
      default: // Assume MSVC for unknown environments
175
0
        return std::make_unique<MicrosoftARM64TargetInfo>(Triple, Opts);
176
0
      }
177
0
    default:
178
0
      return std::make_unique<AArch64leTargetInfo>(Triple, Opts);
179
0
    }
180
181
0
  case llvm::Triple::aarch64_be:
182
0
    switch (os) {
183
0
    case llvm::Triple::FreeBSD:
184
0
      return std::make_unique<FreeBSDTargetInfo<AArch64beTargetInfo>>(Triple,
185
0
                                                                      Opts);
186
0
    case llvm::Triple::Fuchsia:
187
0
      return std::make_unique<FuchsiaTargetInfo<AArch64beTargetInfo>>(Triple,
188
0
                                                                      Opts);
189
0
    case llvm::Triple::Linux:
190
0
      return std::make_unique<LinuxTargetInfo<AArch64beTargetInfo>>(Triple,
191
0
                                                                    Opts);
192
0
    case llvm::Triple::NetBSD:
193
0
      return std::make_unique<NetBSDTargetInfo<AArch64beTargetInfo>>(Triple,
194
0
                                                                     Opts);
195
0
    default:
196
0
      return std::make_unique<AArch64beTargetInfo>(Triple, Opts);
197
0
    }
198
199
0
  case llvm::Triple::arm:
200
0
  case llvm::Triple::thumb:
201
0
    if (Triple.isOSBinFormatMachO())
202
0
      return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
203
204
0
    switch (os) {
205
0
    case llvm::Triple::Linux:
206
0
      switch (Triple.getEnvironment()) {
207
0
      default:
208
0
        return std::make_unique<LinuxTargetInfo<ARMleTargetInfo>>(Triple, Opts);
209
0
      case llvm::Triple::OpenHOS:
210
0
        return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
211
0
      }
212
0
    case llvm::Triple::LiteOS:
213
0
      return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
214
0
    case llvm::Triple::FreeBSD:
215
0
      return std::make_unique<FreeBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
216
0
    case llvm::Triple::NetBSD:
217
0
      return std::make_unique<NetBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
218
0
    case llvm::Triple::OpenBSD:
219
0
      return std::make_unique<OpenBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
220
0
    case llvm::Triple::RTEMS:
221
0
      return std::make_unique<RTEMSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
222
0
    case llvm::Triple::Haiku:
223
0
      return std::make_unique<HaikuTargetInfo<ARMleTargetInfo>>(Triple, Opts);
224
0
    case llvm::Triple::NaCl:
225
0
      return std::make_unique<NaClTargetInfo<ARMleTargetInfo>>(Triple, Opts);
226
0
    case llvm::Triple::Win32:
227
0
      switch (Triple.getEnvironment()) {
228
0
      case llvm::Triple::Cygnus:
229
0
        return std::make_unique<CygwinARMTargetInfo>(Triple, Opts);
230
0
      case llvm::Triple::GNU:
231
0
        return std::make_unique<MinGWARMTargetInfo>(Triple, Opts);
232
0
      case llvm::Triple::Itanium:
233
0
        return std::make_unique<ItaniumWindowsARMleTargetInfo>(Triple, Opts);
234
0
      case llvm::Triple::MSVC:
235
0
      default: // Assume MSVC for unknown environments
236
0
        return std::make_unique<MicrosoftARMleTargetInfo>(Triple, Opts);
237
0
      }
238
0
    default:
239
0
      return std::make_unique<ARMleTargetInfo>(Triple, Opts);
240
0
    }
241
242
0
  case llvm::Triple::armeb:
243
0
  case llvm::Triple::thumbeb:
244
0
    if (Triple.isOSDarwin())
245
0
      return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
246
247
0
    switch (os) {
248
0
    case llvm::Triple::Linux:
249
0
      return std::make_unique<LinuxTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
250
0
    case llvm::Triple::NetBSD:
251
0
      return std::make_unique<NetBSDTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
252
0
    case llvm::Triple::RTEMS:
253
0
      return std::make_unique<RTEMSTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
254
0
    case llvm::Triple::NaCl:
255
0
      return std::make_unique<NaClTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
256
0
    default:
257
0
      return std::make_unique<ARMbeTargetInfo>(Triple, Opts);
258
0
    }
259
260
0
  case llvm::Triple::avr:
261
0
    return std::make_unique<AVRTargetInfo>(Triple, Opts);
262
0
  case llvm::Triple::bpfeb:
263
0
  case llvm::Triple::bpfel:
264
0
    return std::make_unique<BPFTargetInfo>(Triple, Opts);
265
266
0
  case llvm::Triple::msp430:
267
0
    return std::make_unique<MSP430TargetInfo>(Triple, Opts);
268
269
0
  case llvm::Triple::mips:
270
0
    switch (os) {
271
0
    case llvm::Triple::Linux:
272
0
      return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
273
0
    case llvm::Triple::RTEMS:
274
0
      return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
275
0
    case llvm::Triple::FreeBSD:
276
0
      return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
277
0
    case llvm::Triple::NetBSD:
278
0
      return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
279
0
    default:
280
0
      return std::make_unique<MipsTargetInfo>(Triple, Opts);
281
0
    }
282
283
0
  case llvm::Triple::mipsel:
284
0
    switch (os) {
285
0
    case llvm::Triple::Linux:
286
0
      switch (Triple.getEnvironment()) {
287
0
      default:
288
0
        return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
289
0
      case llvm::Triple::OpenHOS:
290
0
        return std::make_unique<OHOSTargetInfo<MipsTargetInfo>>(Triple, Opts);
291
0
      }
292
0
    case llvm::Triple::RTEMS:
293
0
      return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
294
0
    case llvm::Triple::FreeBSD:
295
0
      return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
296
0
    case llvm::Triple::NetBSD:
297
0
      return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
298
0
    case llvm::Triple::NaCl:
299
0
      return std::make_unique<NaClTargetInfo<NaClMips32TargetInfo>>(Triple,
300
0
                                                                    Opts);
301
0
    default:
302
0
      return std::make_unique<MipsTargetInfo>(Triple, Opts);
303
0
    }
304
305
0
  case llvm::Triple::mips64:
306
0
    switch (os) {
307
0
    case llvm::Triple::Linux:
308
0
      return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
309
0
    case llvm::Triple::RTEMS:
310
0
      return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
311
0
    case llvm::Triple::FreeBSD:
312
0
      return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
313
0
    case llvm::Triple::NetBSD:
314
0
      return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
315
0
    case llvm::Triple::OpenBSD:
316
0
      return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
317
0
    default:
318
0
      return std::make_unique<MipsTargetInfo>(Triple, Opts);
319
0
    }
320
321
0
  case llvm::Triple::mips64el:
322
0
    switch (os) {
323
0
    case llvm::Triple::Linux:
324
0
      return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
325
0
    case llvm::Triple::RTEMS:
326
0
      return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
327
0
    case llvm::Triple::FreeBSD:
328
0
      return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
329
0
    case llvm::Triple::NetBSD:
330
0
      return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
331
0
    case llvm::Triple::OpenBSD:
332
0
      return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
333
0
    default:
334
0
      return std::make_unique<MipsTargetInfo>(Triple, Opts);
335
0
    }
336
337
0
  case llvm::Triple::m68k:
338
0
    switch (os) {
339
0
    case llvm::Triple::Linux:
340
0
      return std::make_unique<LinuxTargetInfo<M68kTargetInfo>>(Triple, Opts);
341
0
    case llvm::Triple::NetBSD:
342
0
      return std::make_unique<NetBSDTargetInfo<M68kTargetInfo>>(Triple, Opts);
343
0
    default:
344
0
      return std::make_unique<M68kTargetInfo>(Triple, Opts);
345
0
    }
346
347
0
  case llvm::Triple::le32:
348
0
    switch (os) {
349
0
    case llvm::Triple::NaCl:
350
0
      return std::make_unique<NaClTargetInfo<PNaClTargetInfo>>(Triple, Opts);
351
0
    default:
352
0
      return nullptr;
353
0
    }
354
355
0
  case llvm::Triple::le64:
356
0
    return std::make_unique<Le64TargetInfo>(Triple, Opts);
357
358
0
  case llvm::Triple::ppc:
359
0
    switch (os) {
360
0
    case llvm::Triple::Linux:
361
0
      return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
362
0
    case llvm::Triple::FreeBSD:
363
0
      return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
364
0
    case llvm::Triple::NetBSD:
365
0
      return std::make_unique<NetBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
366
0
    case llvm::Triple::OpenBSD:
367
0
      return std::make_unique<OpenBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
368
0
    case llvm::Triple::RTEMS:
369
0
      return std::make_unique<RTEMSTargetInfo<PPC32TargetInfo>>(Triple, Opts);
370
0
    case llvm::Triple::AIX:
371
0
      return std::make_unique<AIXPPC32TargetInfo>(Triple, Opts);
372
0
    default:
373
0
      return std::make_unique<PPC32TargetInfo>(Triple, Opts);
374
0
    }
375
376
0
  case llvm::Triple::ppcle:
377
0
    switch (os) {
378
0
    case llvm::Triple::Linux:
379
0
      return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
380
0
    case llvm::Triple::FreeBSD:
381
0
      return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
382
0
    default:
383
0
      return std::make_unique<PPC32TargetInfo>(Triple, Opts);
384
0
    }
385
386
0
  case llvm::Triple::ppc64:
387
0
    switch (os) {
388
0
    case llvm::Triple::Linux:
389
0
      return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
390
0
    case llvm::Triple::Lv2:
391
0
      return std::make_unique<PS3PPUTargetInfo<PPC64TargetInfo>>(Triple, Opts);
392
0
    case llvm::Triple::FreeBSD:
393
0
      return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
394
0
    case llvm::Triple::NetBSD:
395
0
      return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
396
0
    case llvm::Triple::OpenBSD:
397
0
      return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
398
0
    case llvm::Triple::AIX:
399
0
      return std::make_unique<AIXPPC64TargetInfo>(Triple, Opts);
400
0
    default:
401
0
      return std::make_unique<PPC64TargetInfo>(Triple, Opts);
402
0
    }
403
404
0
  case llvm::Triple::ppc64le:
405
0
    switch (os) {
406
0
    case llvm::Triple::Linux:
407
0
      return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
408
0
    case llvm::Triple::FreeBSD:
409
0
      return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
410
0
    case llvm::Triple::NetBSD:
411
0
      return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
412
0
    case llvm::Triple::OpenBSD:
413
0
      return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
414
0
    default:
415
0
      return std::make_unique<PPC64TargetInfo>(Triple, Opts);
416
0
    }
417
418
0
  case llvm::Triple::nvptx:
419
0
    return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
420
0
                                             /*TargetPointerWidth=*/32);
421
0
  case llvm::Triple::nvptx64:
422
0
    return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
423
0
                                             /*TargetPointerWidth=*/64);
424
425
0
  case llvm::Triple::amdgcn:
426
0
  case llvm::Triple::r600:
427
0
    return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);
428
429
0
  case llvm::Triple::riscv32:
430
0
    switch (os) {
431
0
    case llvm::Triple::NetBSD:
432
0
      return std::make_unique<NetBSDTargetInfo<RISCV32TargetInfo>>(Triple,
433
0
                                                                   Opts);
434
0
    case llvm::Triple::Linux:
435
0
      return std::make_unique<LinuxTargetInfo<RISCV32TargetInfo>>(Triple, Opts);
436
0
    default:
437
0
      return std::make_unique<RISCV32TargetInfo>(Triple, Opts);
438
0
    }
439
440
0
  case llvm::Triple::riscv64:
441
0
    switch (os) {
442
0
    case llvm::Triple::FreeBSD:
443
0
      return std::make_unique<FreeBSDTargetInfo<RISCV64TargetInfo>>(Triple,
444
0
                                                                    Opts);
445
0
    case llvm::Triple::NetBSD:
446
0
      return std::make_unique<NetBSDTargetInfo<RISCV64TargetInfo>>(Triple,
447
0
                                                                   Opts);
448
0
    case llvm::Triple::OpenBSD:
449
0
      return std::make_unique<OpenBSDTargetInfo<RISCV64TargetInfo>>(Triple,
450
0
                                                                    Opts);
451
0
    case llvm::Triple::Fuchsia:
452
0
      return std::make_unique<FuchsiaTargetInfo<RISCV64TargetInfo>>(Triple,
453
0
                                                                    Opts);
454
0
    case llvm::Triple::Haiku:
455
0
      return std::make_unique<HaikuTargetInfo<RISCV64TargetInfo>>(Triple,
456
0
                                                                  Opts);
457
0
    case llvm::Triple::Linux:
458
0
      switch (Triple.getEnvironment()) {
459
0
      default:
460
0
        return std::make_unique<LinuxTargetInfo<RISCV64TargetInfo>>(Triple,
461
0
                                                                    Opts);
462
0
      case llvm::Triple::OpenHOS:
463
0
        return std::make_unique<OHOSTargetInfo<RISCV64TargetInfo>>(Triple,
464
0
                                                                   Opts);
465
0
      }
466
0
    default:
467
0
      return std::make_unique<RISCV64TargetInfo>(Triple, Opts);
468
0
    }
469
470
0
  case llvm::Triple::sparc:
471
0
    switch (os) {
472
0
    case llvm::Triple::Linux:
473
0
      return std::make_unique<LinuxTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
474
0
    case llvm::Triple::Solaris:
475
0
      return std::make_unique<SolarisTargetInfo<SparcV8TargetInfo>>(Triple,
476
0
                                                                    Opts);
477
0
    case llvm::Triple::NetBSD:
478
0
      return std::make_unique<NetBSDTargetInfo<SparcV8TargetInfo>>(Triple,
479
0
                                                                   Opts);
480
0
    case llvm::Triple::RTEMS:
481
0
      return std::make_unique<RTEMSTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
482
0
    default:
483
0
      return std::make_unique<SparcV8TargetInfo>(Triple, Opts);
484
0
    }
485
486
0
  case llvm::Triple::sparcel:
487
0
    switch (os) {
488
0
    case llvm::Triple::Linux:
489
0
      return std::make_unique<LinuxTargetInfo<SparcV8elTargetInfo>>(Triple,
490
0
                                                                    Opts);
491
0
    case llvm::Triple::RTEMS:
492
0
      return std::make_unique<RTEMSTargetInfo<SparcV8elTargetInfo>>(Triple,
493
0
                                                                    Opts);
494
0
    default:
495
0
      return std::make_unique<SparcV8elTargetInfo>(Triple, Opts);
496
0
    }
497
498
0
  case llvm::Triple::sparcv9:
499
0
    switch (os) {
500
0
    case llvm::Triple::Linux:
501
0
      return std::make_unique<LinuxTargetInfo<SparcV9TargetInfo>>(Triple, Opts);
502
0
    case llvm::Triple::Solaris:
503
0
      return std::make_unique<SolarisTargetInfo<SparcV9TargetInfo>>(Triple,
504
0
                                                                    Opts);
505
0
    case llvm::Triple::NetBSD:
506
0
      return std::make_unique<NetBSDTargetInfo<SparcV9TargetInfo>>(Triple,
507
0
                                                                   Opts);
508
0
    case llvm::Triple::OpenBSD:
509
0
      return std::make_unique<OpenBSDTargetInfo<SparcV9TargetInfo>>(Triple,
510
0
                                                                    Opts);
511
0
    case llvm::Triple::FreeBSD:
512
0
      return std::make_unique<FreeBSDTargetInfo<SparcV9TargetInfo>>(Triple,
513
0
                                                                    Opts);
514
0
    default:
515
0
      return std::make_unique<SparcV9TargetInfo>(Triple, Opts);
516
0
    }
517
518
0
  case llvm::Triple::systemz:
519
0
    switch (os) {
520
0
    case llvm::Triple::Linux:
521
0
      return std::make_unique<LinuxTargetInfo<SystemZTargetInfo>>(Triple, Opts);
522
0
    case llvm::Triple::ZOS:
523
0
      return std::make_unique<ZOSTargetInfo<SystemZTargetInfo>>(Triple, Opts);
524
0
    default:
525
0
      return std::make_unique<SystemZTargetInfo>(Triple, Opts);
526
0
    }
527
528
0
  case llvm::Triple::tce:
529
0
    return std::make_unique<TCETargetInfo>(Triple, Opts);
530
531
0
  case llvm::Triple::tcele:
532
0
    return std::make_unique<TCELETargetInfo>(Triple, Opts);
533
534
0
  case llvm::Triple::x86:
535
0
    if (Triple.isOSDarwin())
536
0
      return std::make_unique<DarwinI386TargetInfo>(Triple, Opts);
537
538
0
    switch (os) {
539
0
    case llvm::Triple::Linux: {
540
0
      switch (Triple.getEnvironment()) {
541
0
      default:
542
0
        return std::make_unique<LinuxTargetInfo<X86_32TargetInfo>>(Triple,
543
0
                                                                   Opts);
544
0
      case llvm::Triple::Android:
545
0
        return std::make_unique<AndroidX86_32TargetInfo>(Triple, Opts);
546
0
      }
547
0
    }
548
0
    case llvm::Triple::DragonFly:
549
0
      return std::make_unique<DragonFlyBSDTargetInfo<X86_32TargetInfo>>(Triple,
550
0
                                                                        Opts);
551
0
    case llvm::Triple::NetBSD:
552
0
      return std::make_unique<NetBSDI386TargetInfo>(Triple, Opts);
553
0
    case llvm::Triple::OpenBSD:
554
0
      return std::make_unique<OpenBSDI386TargetInfo>(Triple, Opts);
555
0
    case llvm::Triple::FreeBSD:
556
0
      return std::make_unique<FreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
557
0
                                                                   Opts);
558
0
    case llvm::Triple::Fuchsia:
559
0
      return std::make_unique<FuchsiaTargetInfo<X86_32TargetInfo>>(Triple,
560
0
                                                                   Opts);
561
0
    case llvm::Triple::KFreeBSD:
562
0
      return std::make_unique<KFreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
563
0
                                                                    Opts);
564
0
    case llvm::Triple::Solaris:
565
0
      return std::make_unique<SolarisTargetInfo<X86_32TargetInfo>>(Triple,
566
0
                                                                   Opts);
567
0
    case llvm::Triple::Win32: {
568
0
      switch (Triple.getEnvironment()) {
569
0
      case llvm::Triple::Cygnus:
570
0
        return std::make_unique<CygwinX86_32TargetInfo>(Triple, Opts);
571
0
      case llvm::Triple::GNU:
572
0
        return std::make_unique<MinGWX86_32TargetInfo>(Triple, Opts);
573
0
      case llvm::Triple::Itanium:
574
0
      case llvm::Triple::MSVC:
575
0
      default: // Assume MSVC for unknown environments
576
0
        return std::make_unique<MicrosoftX86_32TargetInfo>(Triple, Opts);
577
0
      }
578
0
    }
579
0
    case llvm::Triple::Haiku:
580
0
      return std::make_unique<HaikuX86_32TargetInfo>(Triple, Opts);
581
0
    case llvm::Triple::RTEMS:
582
0
      return std::make_unique<RTEMSX86_32TargetInfo>(Triple, Opts);
583
0
    case llvm::Triple::NaCl:
584
0
      return std::make_unique<NaClTargetInfo<X86_32TargetInfo>>(Triple, Opts);
585
0
    case llvm::Triple::ELFIAMCU:
586
0
      return std::make_unique<MCUX86_32TargetInfo>(Triple, Opts);
587
0
    case llvm::Triple::Hurd:
588
0
      return std::make_unique<HurdTargetInfo<X86_32TargetInfo>>(Triple, Opts);
589
0
    default:
590
0
      return std::make_unique<X86_32TargetInfo>(Triple, Opts);
591
0
    }
592
593
46
  case llvm::Triple::x86_64:
594
46
    if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
595
0
      return std::make_unique<DarwinX86_64TargetInfo>(Triple, Opts);
596
597
46
    switch (os) {
598
46
    case llvm::Triple::Linux: {
599
46
      switch (Triple.getEnvironment()) {
600
46
      default:
601
46
        return std::make_unique<LinuxTargetInfo<X86_64TargetInfo>>(Triple,
602
46
                                                                   Opts);
603
0
      case llvm::Triple::Android:
604
0
        return std::make_unique<AndroidX86_64TargetInfo>(Triple, Opts);
605
0
      case llvm::Triple::OpenHOS:
606
0
        return std::make_unique<OHOSX86_64TargetInfo>(Triple, Opts);
607
46
      }
608
46
    }
609
0
    case llvm::Triple::DragonFly:
610
0
      return std::make_unique<DragonFlyBSDTargetInfo<X86_64TargetInfo>>(Triple,
611
0
                                                                        Opts);
612
0
    case llvm::Triple::NetBSD:
613
0
      return std::make_unique<NetBSDTargetInfo<X86_64TargetInfo>>(Triple, Opts);
614
0
    case llvm::Triple::OpenBSD:
615
0
      return std::make_unique<OpenBSDX86_64TargetInfo>(Triple, Opts);
616
0
    case llvm::Triple::FreeBSD:
617
0
      return std::make_unique<FreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
618
0
                                                                   Opts);
619
0
    case llvm::Triple::Fuchsia:
620
0
      return std::make_unique<FuchsiaTargetInfo<X86_64TargetInfo>>(Triple,
621
0
                                                                   Opts);
622
0
    case llvm::Triple::KFreeBSD:
623
0
      return std::make_unique<KFreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
624
0
                                                                    Opts);
625
0
    case llvm::Triple::Solaris:
626
0
      return std::make_unique<SolarisTargetInfo<X86_64TargetInfo>>(Triple,
627
0
                                                                   Opts);
628
0
    case llvm::Triple::Win32: {
629
0
      switch (Triple.getEnvironment()) {
630
0
      case llvm::Triple::Cygnus:
631
0
        return std::make_unique<CygwinX86_64TargetInfo>(Triple, Opts);
632
0
      case llvm::Triple::GNU:
633
0
        return std::make_unique<MinGWX86_64TargetInfo>(Triple, Opts);
634
0
      case llvm::Triple::MSVC:
635
0
      default: // Assume MSVC for unknown environments
636
0
        return std::make_unique<MicrosoftX86_64TargetInfo>(Triple, Opts);
637
0
      }
638
0
    }
639
0
    case llvm::Triple::Haiku:
640
0
      return std::make_unique<HaikuTargetInfo<X86_64TargetInfo>>(Triple, Opts);
641
0
    case llvm::Triple::NaCl:
642
0
      return std::make_unique<NaClTargetInfo<X86_64TargetInfo>>(Triple, Opts);
643
0
    case llvm::Triple::PS4:
644
0
      return std::make_unique<PS4OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
645
0
    case llvm::Triple::PS5:
646
0
      return std::make_unique<PS5OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
647
0
    default:
648
0
      return std::make_unique<X86_64TargetInfo>(Triple, Opts);
649
46
    }
650
651
0
  case llvm::Triple::spir: {
652
0
    if (os != llvm::Triple::UnknownOS ||
653
0
        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
654
0
      return nullptr;
655
0
    return std::make_unique<SPIR32TargetInfo>(Triple, Opts);
656
0
  }
657
0
  case llvm::Triple::spir64: {
658
0
    if (os != llvm::Triple::UnknownOS ||
659
0
        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
660
0
      return nullptr;
661
0
    return std::make_unique<SPIR64TargetInfo>(Triple, Opts);
662
0
  }
663
0
  case llvm::Triple::spirv: {
664
0
    return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
665
0
  }
666
0
  case llvm::Triple::spirv32: {
667
0
    if (os != llvm::Triple::UnknownOS ||
668
0
        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
669
0
      return nullptr;
670
0
    return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);
671
0
  }
672
0
  case llvm::Triple::spirv64: {
673
0
    if (os != llvm::Triple::UnknownOS ||
674
0
        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
675
0
      return nullptr;
676
0
    return std::make_unique<SPIRV64TargetInfo>(Triple, Opts);
677
0
  }
678
0
  case llvm::Triple::wasm32:
679
0
    if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
680
0
        Triple.getVendor() != llvm::Triple::UnknownVendor ||
681
0
        !Triple.isOSBinFormatWasm())
682
0
      return nullptr;
683
0
    switch (os) {
684
0
      case llvm::Triple::WASI:
685
0
      return std::make_unique<WASITargetInfo<WebAssembly32TargetInfo>>(Triple,
686
0
                                                                       Opts);
687
0
      case llvm::Triple::Emscripten:
688
0
      return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>(
689
0
          Triple, Opts);
690
0
      case llvm::Triple::UnknownOS:
691
0
      return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>>(
692
0
          Triple, Opts);
693
0
      default:
694
0
        return nullptr;
695
0
    }
696
0
  case llvm::Triple::wasm64:
697
0
    if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
698
0
        Triple.getVendor() != llvm::Triple::UnknownVendor ||
699
0
        !Triple.isOSBinFormatWasm())
700
0
      return nullptr;
701
0
    switch (os) {
702
0
      case llvm::Triple::WASI:
703
0
      return std::make_unique<WASITargetInfo<WebAssembly64TargetInfo>>(Triple,
704
0
                                                                       Opts);
705
0
      case llvm::Triple::Emscripten:
706
0
      return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>(
707
0
          Triple, Opts);
708
0
      case llvm::Triple::UnknownOS:
709
0
      return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>>(
710
0
          Triple, Opts);
711
0
      default:
712
0
        return nullptr;
713
0
    }
714
715
0
  case llvm::Triple::dxil:
716
0
    return std::make_unique<DirectXTargetInfo>(Triple, Opts);
717
0
  case llvm::Triple::renderscript32:
718
0
    return std::make_unique<LinuxTargetInfo<RenderScript32TargetInfo>>(Triple,
719
0
                                                                       Opts);
720
0
  case llvm::Triple::renderscript64:
721
0
    return std::make_unique<LinuxTargetInfo<RenderScript64TargetInfo>>(Triple,
722
0
                                                                       Opts);
723
724
0
  case llvm::Triple::ve:
725
0
    return std::make_unique<LinuxTargetInfo<VETargetInfo>>(Triple, Opts);
726
727
0
  case llvm::Triple::csky:
728
0
    switch (os) {
729
0
    case llvm::Triple::Linux:
730
0
        return std::make_unique<LinuxTargetInfo<CSKYTargetInfo>>(Triple, Opts);
731
0
    default:
732
0
        return std::make_unique<CSKYTargetInfo>(Triple, Opts);
733
0
    }
734
0
  case llvm::Triple::loongarch32:
735
0
    switch (os) {
736
0
    case llvm::Triple::Linux:
737
0
        return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
738
0
                                                                        Opts);
739
0
    default:
740
0
        return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);
741
0
    }
742
0
  case llvm::Triple::loongarch64:
743
0
    switch (os) {
744
0
    case llvm::Triple::Linux:
745
0
        return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
746
0
                                                                        Opts);
747
0
    default:
748
0
        return std::make_unique<LoongArch64TargetInfo>(Triple, Opts);
749
0
    }
750
46
  }
751
46
}
752
} // namespace targets
753
} // namespace clang
754
755
using namespace clang::targets;
756
/// CreateTargetInfo - Return the target info object for the specified target
757
/// options.
758
TargetInfo *
759
TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
760
46
                             const std::shared_ptr<TargetOptions> &Opts) {
761
46
  llvm::Triple Triple(Opts->Triple);
762
763
  // Construct the target
764
46
  std::unique_ptr<TargetInfo> Target = AllocateTarget(Triple, *Opts);
765
46
  if (!Target) {
766
0
    Diags.Report(diag::err_target_unknown_triple) << Triple.str();
767
0
    return nullptr;
768
0
  }
769
46
  Target->TargetOpts = Opts;
770
771
  // Set the target CPU if specified.
772
46
  if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
773
0
    Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
774
0
    SmallVector<StringRef, 32> ValidList;
775
0
    Target->fillValidCPUList(ValidList);
776
0
    if (!ValidList.empty())
777
0
      Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");
778
0
    return nullptr;
779
0
  }
780
781
  // Check the TuneCPU name if specified.
782
46
  if (!Opts->TuneCPU.empty() &&
783
46
      !Target->isValidTuneCPUName(Opts->TuneCPU)) {
784
0
    Diags.Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;
785
0
    SmallVector<StringRef, 32> ValidList;
786
0
    Target->fillValidTuneCPUList(ValidList);
787
0
    if (!ValidList.empty())
788
0
      Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");
789
0
    return nullptr;
790
0
  }
791
792
  // Set the target ABI if specified.
793
46
  if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
794
0
    Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
795
0
    return nullptr;
796
0
  }
797
798
  // Set the fp math unit.
799
46
  if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
800
0
    Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
801
0
    return nullptr;
802
0
  }
803
804
  // Compute the default target features, we need the target to handle this
805
  // because features may have dependencies on one another.
806
46
  llvm::erase_if(Opts->FeaturesAsWritten, [&](StringRef Name) {
807
0
    if (Target->isReadOnlyFeature(Name.substr(1))) {
808
0
      Diags.Report(diag::warn_fe_backend_readonly_feature_flag) << Name;
809
0
      return true;
810
0
    }
811
0
    return false;
812
0
  });
813
46
  if (!Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,
814
46
                              Opts->FeaturesAsWritten))
815
0
    return nullptr;
816
817
  // Add the features to the compile options.
818
46
  Opts->Features.clear();
819
46
  for (const auto &F : Opts->FeatureMap)
820
230
    Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
821
  // Sort here, so we handle the features in a predictable order. (This matters
822
  // when we're dealing with features that overlap.)
823
46
  llvm::sort(Opts->Features);
824
825
46
  if (!Target->handleTargetFeatures(Opts->Features, Diags))
826
0
    return nullptr;
827
828
46
  Target->setSupportedOpenCLOpts();
829
46
  Target->setCommandLineOpenCLOpts();
830
46
  Target->setMaxAtomicWidth();
831
832
46
  if (!Opts->DarwinTargetVariantTriple.empty())
833
0
    Target->DarwinTargetVariantTriple =
834
0
        llvm::Triple(Opts->DarwinTargetVariantTriple);
835
836
46
  if (!Target->validateTarget(Diags))
837
0
    return nullptr;
838
839
46
  Target->CheckFixedPointBits();
840
841
46
  return Target.release();
842
46
}
843
/// validateOpenCLTarget  - Check that OpenCL target has valid
844
/// options setting based on OpenCL version.
845
bool TargetInfo::validateOpenCLTarget(const LangOptions &Opts,
846
0
                                      DiagnosticsEngine &Diags) const {
847
0
  const llvm::StringMap<bool> &OpenCLFeaturesMap = getSupportedOpenCLOpts();
848
849
0
  auto diagnoseNotSupportedCore = [&](llvm::StringRef Name, auto... OptArgs) {
850
0
    if (OpenCLOptions::isOpenCLOptionCoreIn(Opts, OptArgs...) &&
851
0
        !hasFeatureEnabled(OpenCLFeaturesMap, Name))
852
0
      Diags.Report(diag::warn_opencl_unsupported_core_feature)
853
0
          << Name << Opts.OpenCLCPlusPlus
854
0
          << Opts.getOpenCLVersionTuple().getAsString();
855
0
  };
Unexecuted instantiation: Targets.cpp:auto clang::TargetInfo::validateOpenCLTarget(clang::LangOptions const&, clang::DiagnosticsEngine&) const::$_1::operator()<bool, int, clang::(anonymous namespace)::OpenCLVersionID, unsigned int>(llvm::StringRef, bool, int, clang::(anonymous namespace)::OpenCLVersionID, unsigned int) const
Unexecuted instantiation: Targets.cpp:auto clang::TargetInfo::validateOpenCLTarget(clang::LangOptions const&, clang::DiagnosticsEngine&) const::$_1::operator()<bool, int, unsigned int, clang::(anonymous namespace)::OpenCLVersionID>(llvm::StringRef, bool, int, unsigned int, clang::(anonymous namespace)::OpenCLVersionID) const
Unexecuted instantiation: Targets.cpp:auto clang::TargetInfo::validateOpenCLTarget(clang::LangOptions const&, clang::DiagnosticsEngine&) const::$_1::operator()<bool, int, unsigned int, unsigned int>(llvm::StringRef, bool, int, unsigned int, unsigned int) const
Unexecuted instantiation: Targets.cpp:auto clang::TargetInfo::validateOpenCLTarget(clang::LangOptions const&, clang::DiagnosticsEngine&) const::$_1::operator()<bool, int, clang::(anonymous namespace)::OpenCLVersionID, clang::(anonymous namespace)::OpenCLVersionID>(llvm::StringRef, bool, int, clang::(anonymous namespace)::OpenCLVersionID, clang::(anonymous namespace)::OpenCLVersionID) const
856
0
#define OPENCL_GENERIC_EXTENSION(Ext, ...)                                     \
857
0
  diagnoseNotSupportedCore(#Ext, __VA_ARGS__);
858
0
#include "clang/Basic/OpenCLExtensions.def"
859
860
  // Validate that feature macros are set properly for OpenCL C 3.0.
861
  // In other cases assume that target is always valid.
862
0
  if (Opts.getOpenCLCompatibleVersion() < 300)
863
0
    return true;
864
865
0
  return OpenCLOptions::diagnoseUnsupportedFeatureDependencies(*this, Diags) &&
866
0
         OpenCLOptions::diagnoseFeatureExtensionDifferences(*this, Diags);
867
0
}