45#include "llvm/ADT/StringExtras.h"
46#include "llvm/TargetParser/Triple.h"
61 assert(MacroName[0] !=
'_' &&
"Identifier should be in the user's namespace");
66 Builder.defineMacro(MacroName);
69 Builder.defineMacro(
"__" + MacroName);
72 Builder.defineMacro(
"__" + MacroName +
"__");
76 Builder.defineMacro(
"__" + CPUName);
77 Builder.defineMacro(
"__" + CPUName +
"__");
79 Builder.defineMacro(
"__tune_" + CPUName +
"__");
87 if (Opts.DeclSpecKeyword)
88 Builder.defineMacro(
"__declspec",
"__declspec");
90 Builder.defineMacro(
"__declspec(a)",
"__attribute__((a))");
92 if (!Opts.MicrosoftExt) {
96 const char *CCs[] = {
"cdecl",
"stdcall",
"fastcall",
"thiscall",
"pascal"};
97 for (
const char *CC : CCs) {
98 std::string GCCSpelling =
"__attribute__((__";
100 GCCSpelling +=
"__))";
101 Builder.defineMacro(Twine(
"_") + CC, GCCSpelling);
102 Builder.defineMacro(Twine(
"__") + CC, GCCSpelling);
113 llvm::Triple::OSType os = Triple.getOS();
115 switch (Triple.getArch()) {
119 case llvm::Triple::arc:
120 return std::make_unique<ARCTargetInfo>(Triple, Opts);
122 case llvm::Triple::xcore:
123 return std::make_unique<XCoreTargetInfo>(Triple, Opts);
125 case llvm::Triple::hexagon:
126 if (os == llvm::Triple::Linux &&
127 Triple.getEnvironment() == llvm::Triple::Musl)
128 return std::make_unique<LinuxTargetInfo<HexagonTargetInfo>>(Triple, Opts);
129 return std::make_unique<HexagonTargetInfo>(Triple, Opts);
131 case llvm::Triple::lanai:
132 return std::make_unique<LanaiTargetInfo>(Triple, Opts);
134 case llvm::Triple::aarch64_32:
135 if (Triple.isOSDarwin())
136 return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
137 else if (Triple.isAppleMachO())
138 return std::make_unique<AppleMachOAArch64TargetInfo>(Triple, Opts);
141 case llvm::Triple::aarch64:
142 if (Triple.isOSDarwin())
143 return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
144 else if (Triple.isAppleMachO())
145 return std::make_unique<AppleMachOAArch64TargetInfo>(Triple, Opts);
148 case llvm::Triple::FreeBSD:
149 return std::make_unique<FreeBSDTargetInfo<AArch64leTargetInfo>>(Triple,
151 case llvm::Triple::Fuchsia:
152 return std::make_unique<FuchsiaTargetInfo<AArch64leTargetInfo>>(Triple,
154 case llvm::Triple::Haiku:
155 return std::make_unique<HaikuTargetInfo<AArch64leTargetInfo>>(Triple,
157 case llvm::Triple::Linux:
158 switch (Triple.getEnvironment()) {
160 return std::make_unique<LinuxTargetInfo<AArch64leTargetInfo>>(Triple,
162 case llvm::Triple::OpenHOS:
163 return std::make_unique<OHOSTargetInfo<AArch64leTargetInfo>>(Triple,
166 case llvm::Triple::Managarm:
167 return std::make_unique<ManagarmTargetInfo<AArch64leTargetInfo>>(Triple,
169 case llvm::Triple::NetBSD:
170 return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple,
172 case llvm::Triple::OpenBSD:
173 return std::make_unique<OpenBSDTargetInfo<AArch64leTargetInfo>>(Triple,
175 case llvm::Triple::Win32:
176 switch (Triple.getEnvironment()) {
177 case llvm::Triple::GNU:
178 return std::make_unique<MinGWARM64TargetInfo>(Triple, Opts);
179 case llvm::Triple::MSVC:
181 return std::make_unique<MicrosoftARM64TargetInfo>(Triple, Opts);
184 return std::make_unique<AArch64leTargetInfo>(Triple, Opts);
187 case llvm::Triple::aarch64_be:
189 case llvm::Triple::FreeBSD:
190 return std::make_unique<FreeBSDTargetInfo<AArch64beTargetInfo>>(Triple,
192 case llvm::Triple::Fuchsia:
193 return std::make_unique<FuchsiaTargetInfo<AArch64beTargetInfo>>(Triple,
195 case llvm::Triple::Linux:
196 return std::make_unique<LinuxTargetInfo<AArch64beTargetInfo>>(Triple,
198 case llvm::Triple::NetBSD:
199 return std::make_unique<NetBSDTargetInfo<AArch64beTargetInfo>>(Triple,
202 return std::make_unique<AArch64beTargetInfo>(Triple, Opts);
205 case llvm::Triple::arm:
206 case llvm::Triple::thumb:
207 if (Triple.isOSBinFormatMachO())
208 return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
211 case llvm::Triple::Linux:
212 switch (Triple.getEnvironment()) {
214 return std::make_unique<LinuxTargetInfo<ARMleTargetInfo>>(Triple, Opts);
215 case llvm::Triple::OpenHOS:
216 return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
218 case llvm::Triple::LiteOS:
219 return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
220 case llvm::Triple::FreeBSD:
221 return std::make_unique<FreeBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
222 case llvm::Triple::NetBSD:
223 return std::make_unique<NetBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
224 case llvm::Triple::OpenBSD:
225 return std::make_unique<OpenBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
226 case llvm::Triple::RTEMS:
227 return std::make_unique<RTEMSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
228 case llvm::Triple::Haiku:
229 return std::make_unique<HaikuTargetInfo<ARMleTargetInfo>>(Triple, Opts);
230 case llvm::Triple::Win32:
231 switch (Triple.getEnvironment()) {
232 case llvm::Triple::Cygnus:
233 return std::make_unique<CygwinARMTargetInfo>(Triple, Opts);
234 case llvm::Triple::GNU:
235 return std::make_unique<MinGWARMTargetInfo>(Triple, Opts);
236 case llvm::Triple::Itanium:
237 return std::make_unique<ItaniumWindowsARMleTargetInfo>(Triple, Opts);
238 case llvm::Triple::MSVC:
240 return std::make_unique<MicrosoftARMleTargetInfo>(Triple, Opts);
243 return std::make_unique<ARMleTargetInfo>(Triple, Opts);
246 case llvm::Triple::armeb:
247 case llvm::Triple::thumbeb:
248 if (Triple.isOSDarwin())
249 return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
250 else if (Triple.isAppleMachO())
251 return std::make_unique<AppleMachOARMTargetInfo>(Triple, Opts);
254 case llvm::Triple::Linux:
255 return std::make_unique<LinuxTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
256 case llvm::Triple::NetBSD:
257 return std::make_unique<NetBSDTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
258 case llvm::Triple::RTEMS:
259 return std::make_unique<RTEMSTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
261 return std::make_unique<ARMbeTargetInfo>(Triple, Opts);
264 case llvm::Triple::avr:
265 return std::make_unique<AVRTargetInfo>(Triple, Opts);
266 case llvm::Triple::bpfeb:
267 case llvm::Triple::bpfel:
268 return std::make_unique<BPFTargetInfo>(Triple, Opts);
270 case llvm::Triple::msp430:
271 return std::make_unique<MSP430TargetInfo>(Triple, Opts);
273 case llvm::Triple::mips:
275 case llvm::Triple::Linux:
276 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
277 case llvm::Triple::RTEMS:
278 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
279 case llvm::Triple::FreeBSD:
280 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
281 case llvm::Triple::NetBSD:
282 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
284 return std::make_unique<MipsTargetInfo>(Triple, Opts);
287 case llvm::Triple::mipsel:
289 case llvm::Triple::Linux:
290 switch (Triple.getEnvironment()) {
292 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
293 case llvm::Triple::OpenHOS:
294 return std::make_unique<OHOSTargetInfo<MipsTargetInfo>>(Triple, Opts);
296 case llvm::Triple::RTEMS:
297 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
298 case llvm::Triple::FreeBSD:
299 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
300 case llvm::Triple::NetBSD:
301 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
302 case llvm::Triple::Win32:
303 switch (Triple.getEnvironment()) {
304 case llvm::Triple::GNU:
305 return std::make_unique<MinGWMipsTargetInfo>(Triple, Opts);
306 case llvm::Triple::MSVC:
308 return std::make_unique<MicrosoftMipsTargetInfo>(Triple, Opts);
311 return std::make_unique<MipsTargetInfo>(Triple, Opts);
314 case llvm::Triple::mips64:
316 case llvm::Triple::Linux:
317 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
318 case llvm::Triple::RTEMS:
319 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
320 case llvm::Triple::FreeBSD:
321 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
322 case llvm::Triple::NetBSD:
323 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
324 case llvm::Triple::OpenBSD:
325 return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
327 return std::make_unique<MipsTargetInfo>(Triple, Opts);
330 case llvm::Triple::mips64el:
332 case llvm::Triple::Linux:
333 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
334 case llvm::Triple::RTEMS:
335 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
336 case llvm::Triple::FreeBSD:
337 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
338 case llvm::Triple::NetBSD:
339 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
340 case llvm::Triple::OpenBSD:
341 return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
343 return std::make_unique<MipsTargetInfo>(Triple, Opts);
346 case llvm::Triple::m68k:
348 case llvm::Triple::Linux:
349 return std::make_unique<LinuxTargetInfo<M68kTargetInfo>>(Triple, Opts);
350 case llvm::Triple::NetBSD:
351 return std::make_unique<NetBSDTargetInfo<M68kTargetInfo>>(Triple, Opts);
353 return std::make_unique<M68kTargetInfo>(Triple, Opts);
356 case llvm::Triple::ppc:
358 case llvm::Triple::Linux:
359 return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
360 case llvm::Triple::FreeBSD:
361 return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
362 case llvm::Triple::NetBSD:
363 return std::make_unique<NetBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
364 case llvm::Triple::OpenBSD:
365 return std::make_unique<OpenBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
366 case llvm::Triple::RTEMS:
367 return std::make_unique<RTEMSTargetInfo<PPC32TargetInfo>>(Triple, Opts);
368 case llvm::Triple::AIX:
369 return std::make_unique<AIXPPC32TargetInfo>(Triple, Opts);
371 return std::make_unique<PPC32TargetInfo>(Triple, Opts);
374 case llvm::Triple::ppcle:
376 case llvm::Triple::Linux:
377 return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
378 case llvm::Triple::FreeBSD:
379 return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
381 return std::make_unique<PPC32TargetInfo>(Triple, Opts);
384 case llvm::Triple::ppc64:
386 case llvm::Triple::Linux:
387 return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
388 case llvm::Triple::Lv2:
389 return std::make_unique<PS3PPUTargetInfo<PPC64TargetInfo>>(Triple, Opts);
390 case llvm::Triple::FreeBSD:
391 return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
392 case llvm::Triple::NetBSD:
393 return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
394 case llvm::Triple::OpenBSD:
395 return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
396 case llvm::Triple::AIX:
397 return std::make_unique<AIXPPC64TargetInfo>(Triple, Opts);
399 return std::make_unique<PPC64TargetInfo>(Triple, Opts);
402 case llvm::Triple::ppc64le:
404 case llvm::Triple::Linux:
405 return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
406 case llvm::Triple::FreeBSD:
407 return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
408 case llvm::Triple::NetBSD:
409 return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
410 case llvm::Triple::OpenBSD:
411 return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
413 return std::make_unique<PPC64TargetInfo>(Triple, Opts);
416 case llvm::Triple::nvptx:
417 return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
419 case llvm::Triple::nvptx64:
420 return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
423 case llvm::Triple::amdgcn:
424 case llvm::Triple::r600:
425 return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);
427 case llvm::Triple::riscv32:
429 case llvm::Triple::NetBSD:
430 return std::make_unique<NetBSDTargetInfo<RISCV32TargetInfo>>(Triple,
432 case llvm::Triple::Linux:
433 return std::make_unique<LinuxTargetInfo<RISCV32TargetInfo>>(Triple, Opts);
435 return std::make_unique<RISCV32TargetInfo>(Triple, Opts);
438 case llvm::Triple::riscv64:
440 case llvm::Triple::FreeBSD:
441 return std::make_unique<FreeBSDTargetInfo<RISCV64TargetInfo>>(Triple,
443 case llvm::Triple::NetBSD:
444 return std::make_unique<NetBSDTargetInfo<RISCV64TargetInfo>>(Triple,
446 case llvm::Triple::OpenBSD:
447 return std::make_unique<OpenBSDTargetInfo<RISCV64TargetInfo>>(Triple,
449 case llvm::Triple::Fuchsia:
450 return std::make_unique<FuchsiaTargetInfo<RISCV64TargetInfo>>(Triple,
452 case llvm::Triple::Haiku:
453 return std::make_unique<HaikuTargetInfo<RISCV64TargetInfo>>(Triple,
455 case llvm::Triple::Linux:
456 switch (Triple.getEnvironment()) {
458 return std::make_unique<LinuxTargetInfo<RISCV64TargetInfo>>(Triple,
460 case llvm::Triple::OpenHOS:
461 return std::make_unique<OHOSTargetInfo<RISCV64TargetInfo>>(Triple,
464 case llvm::Triple::Managarm:
465 return std::make_unique<ManagarmTargetInfo<RISCV64TargetInfo>>(Triple,
468 return std::make_unique<RISCV64TargetInfo>(Triple, Opts);
471 case llvm::Triple::sparc:
473 case llvm::Triple::Linux:
474 return std::make_unique<LinuxTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
475 case llvm::Triple::Solaris:
476 return std::make_unique<SolarisTargetInfo<SparcV8TargetInfo>>(Triple,
478 case llvm::Triple::NetBSD:
479 return std::make_unique<NetBSDTargetInfo<SparcV8TargetInfo>>(Triple,
481 case llvm::Triple::RTEMS:
482 return std::make_unique<RTEMSTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
484 return std::make_unique<SparcV8TargetInfo>(Triple, Opts);
487 case llvm::Triple::sparcel:
489 case llvm::Triple::Linux:
490 return std::make_unique<LinuxTargetInfo<SparcV8elTargetInfo>>(Triple,
492 case llvm::Triple::RTEMS:
493 return std::make_unique<RTEMSTargetInfo<SparcV8elTargetInfo>>(Triple,
496 return std::make_unique<SparcV8elTargetInfo>(Triple, Opts);
499 case llvm::Triple::sparcv9:
501 case llvm::Triple::Linux:
502 return std::make_unique<LinuxTargetInfo<SparcV9TargetInfo>>(Triple, Opts);
503 case llvm::Triple::Solaris:
504 return std::make_unique<SolarisTargetInfo<SparcV9TargetInfo>>(Triple,
506 case llvm::Triple::NetBSD:
507 return std::make_unique<NetBSDTargetInfo<SparcV9TargetInfo>>(Triple,
509 case llvm::Triple::OpenBSD:
510 return std::make_unique<OpenBSDTargetInfo<SparcV9TargetInfo>>(Triple,
512 case llvm::Triple::FreeBSD:
513 return std::make_unique<FreeBSDTargetInfo<SparcV9TargetInfo>>(Triple,
516 return std::make_unique<SparcV9TargetInfo>(Triple, Opts);
519 case llvm::Triple::systemz:
521 case llvm::Triple::Linux:
522 return std::make_unique<LinuxTargetInfo<SystemZTargetInfo>>(Triple, Opts);
523 case llvm::Triple::ZOS:
524 return std::make_unique<ZOSTargetInfo<SystemZTargetInfo>>(Triple, Opts);
526 return std::make_unique<SystemZTargetInfo>(Triple, Opts);
529 case llvm::Triple::tce:
530 return std::make_unique<TCETargetInfo>(Triple, Opts);
532 case llvm::Triple::tcele:
533 return std::make_unique<TCELETargetInfo>(Triple, Opts);
535 case llvm::Triple::x86:
536 if (Triple.isOSDarwin())
537 return std::make_unique<DarwinI386TargetInfo>(Triple, Opts);
538 else if (Triple.isAppleMachO())
539 return std::make_unique<AppleMachOI386TargetInfo>(Triple, Opts);
542 case llvm::Triple::Linux: {
543 switch (Triple.getEnvironment()) {
545 return std::make_unique<LinuxTargetInfo<X86_32TargetInfo>>(Triple,
547 case llvm::Triple::Android:
548 return std::make_unique<AndroidX86_32TargetInfo>(Triple, Opts);
551 case llvm::Triple::DragonFly:
552 return std::make_unique<DragonFlyBSDTargetInfo<X86_32TargetInfo>>(Triple,
554 case llvm::Triple::NetBSD:
555 return std::make_unique<NetBSDI386TargetInfo>(Triple, Opts);
556 case llvm::Triple::OpenBSD:
557 return std::make_unique<OpenBSDI386TargetInfo>(Triple, Opts);
558 case llvm::Triple::FreeBSD:
559 return std::make_unique<FreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
561 case llvm::Triple::Fuchsia:
562 return std::make_unique<FuchsiaTargetInfo<X86_32TargetInfo>>(Triple,
564 case llvm::Triple::KFreeBSD:
565 return std::make_unique<KFreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
567 case llvm::Triple::Solaris:
568 return std::make_unique<SolarisTargetInfo<X86_32TargetInfo>>(Triple,
570 case llvm::Triple::Win32: {
571 switch (Triple.getEnvironment()) {
572 case llvm::Triple::Cygnus:
573 return std::make_unique<CygwinX86_32TargetInfo>(Triple, Opts);
574 case llvm::Triple::GNU:
575 return std::make_unique<MinGWX86_32TargetInfo>(Triple, Opts);
576 case llvm::Triple::Itanium:
577 case llvm::Triple::MSVC:
579 return std::make_unique<MicrosoftX86_32TargetInfo>(Triple, Opts);
582 case llvm::Triple::Haiku:
583 return std::make_unique<HaikuX86_32TargetInfo>(Triple, Opts);
584 case llvm::Triple::RTEMS:
585 return std::make_unique<RTEMSX86_32TargetInfo>(Triple, Opts);
586 case llvm::Triple::ELFIAMCU:
587 return std::make_unique<MCUX86_32TargetInfo>(Triple, Opts);
588 case llvm::Triple::Hurd:
589 return std::make_unique<HurdTargetInfo<X86_32TargetInfo>>(Triple, Opts);
591 return std::make_unique<X86_32TargetInfo>(Triple, Opts);
594 case llvm::Triple::x86_64:
595 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
596 return std::make_unique<DarwinX86_64TargetInfo>(Triple, Opts);
599 case llvm::Triple::Linux: {
600 switch (Triple.getEnvironment()) {
602 return std::make_unique<LinuxTargetInfo<X86_64TargetInfo>>(Triple,
604 case llvm::Triple::Android:
605 return std::make_unique<AndroidX86_64TargetInfo>(Triple, Opts);
606 case llvm::Triple::OpenHOS:
607 return std::make_unique<OHOSX86_64TargetInfo>(Triple, Opts);
610 case llvm::Triple::DragonFly:
611 return std::make_unique<DragonFlyBSDTargetInfo<X86_64TargetInfo>>(Triple,
613 case llvm::Triple::NetBSD:
614 return std::make_unique<NetBSDTargetInfo<X86_64TargetInfo>>(Triple, Opts);
615 case llvm::Triple::OpenBSD:
616 return std::make_unique<OpenBSDX86_64TargetInfo>(Triple, Opts);
617 case llvm::Triple::FreeBSD:
618 return std::make_unique<FreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
620 case llvm::Triple::Fuchsia:
621 return std::make_unique<FuchsiaTargetInfo<X86_64TargetInfo>>(Triple,
623 case llvm::Triple::KFreeBSD:
624 return std::make_unique<KFreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
626 case llvm::Triple::Solaris:
627 return std::make_unique<SolarisTargetInfo<X86_64TargetInfo>>(Triple,
629 case llvm::Triple::UEFI:
630 return std::make_unique<UEFIX86_64TargetInfo>(Triple, Opts);
632 case llvm::Triple::Win32: {
633 switch (Triple.getEnvironment()) {
634 case llvm::Triple::Cygnus:
635 return std::make_unique<CygwinX86_64TargetInfo>(Triple, Opts);
636 case llvm::Triple::GNU:
637 return std::make_unique<MinGWX86_64TargetInfo>(Triple, Opts);
638 case llvm::Triple::MSVC:
640 return std::make_unique<MicrosoftX86_64TargetInfo>(Triple, Opts);
643 case llvm::Triple::Haiku:
644 return std::make_unique<HaikuTargetInfo<X86_64TargetInfo>>(Triple, Opts);
645 case llvm::Triple::PS4:
646 return std::make_unique<PS4OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
647 case llvm::Triple::PS5:
648 return std::make_unique<PS5OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
649 case llvm::Triple::Hurd:
650 return std::make_unique<HurdTargetInfo<X86_64TargetInfo>>(Triple, Opts);
651 case llvm::Triple::Managarm:
652 return std::make_unique<ManagarmTargetInfo<X86_64TargetInfo>>(Triple,
655 return std::make_unique<X86_64TargetInfo>(Triple, Opts);
658 case llvm::Triple::spir: {
659 if (os != llvm::Triple::UnknownOS ||
660 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
662 return std::make_unique<SPIR32TargetInfo>(Triple, Opts);
664 case llvm::Triple::spir64: {
665 if (os != llvm::Triple::UnknownOS ||
666 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
668 return std::make_unique<SPIR64TargetInfo>(Triple, Opts);
670 case llvm::Triple::spirv: {
671 return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
673 case llvm::Triple::spirv32: {
674 if (os != llvm::Triple::UnknownOS ||
675 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
677 return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);
679 case llvm::Triple::spirv64: {
680 if (os != llvm::Triple::UnknownOS ||
681 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) {
682 if (os == llvm::Triple::OSType::AMDHSA)
683 return std::make_unique<SPIRV64AMDGCNTargetInfo>(Triple, Opts);
686 return std::make_unique<SPIRV64TargetInfo>(Triple, Opts);
688 case llvm::Triple::wasm32:
689 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
690 Triple.getVendor() != llvm::Triple::UnknownVendor ||
691 !Triple.isOSBinFormatWasm())
694 case llvm::Triple::WASI:
695 return std::make_unique<WASITargetInfo<WebAssembly32TargetInfo>>(Triple,
697 case llvm::Triple::Emscripten:
698 return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>(
700 case llvm::Triple::UnknownOS:
701 return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>>(
706 case llvm::Triple::wasm64:
707 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
708 Triple.getVendor() != llvm::Triple::UnknownVendor ||
709 !Triple.isOSBinFormatWasm())
712 case llvm::Triple::WASI:
713 return std::make_unique<WASITargetInfo<WebAssembly64TargetInfo>>(Triple,
715 case llvm::Triple::Emscripten:
716 return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>(
718 case llvm::Triple::UnknownOS:
719 return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>>(
725 case llvm::Triple::dxil:
726 return std::make_unique<DirectXTargetInfo>(Triple, Opts);
728 case llvm::Triple::ve:
729 return std::make_unique<LinuxTargetInfo<VETargetInfo>>(Triple, Opts);
731 case llvm::Triple::csky:
733 case llvm::Triple::Linux:
734 return std::make_unique<LinuxTargetInfo<CSKYTargetInfo>>(Triple, Opts);
736 return std::make_unique<CSKYTargetInfo>(Triple, Opts);
738 case llvm::Triple::loongarch32:
740 case llvm::Triple::Linux:
741 return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
744 return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);
746 case llvm::Triple::loongarch64:
748 case llvm::Triple::Linux:
749 switch (Triple.getEnvironment()) {
751 return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
753 case llvm::Triple::OpenHOS:
754 return std::make_unique<OHOSTargetInfo<LoongArch64TargetInfo>>(Triple,
757 case llvm::Triple::FreeBSD:
758 return std::make_unique<FreeBSDTargetInfo<LoongArch64TargetInfo>>(Triple,
760 case llvm::Triple::OpenBSD:
761 return std::make_unique<OpenBSDTargetInfo<LoongArch64TargetInfo>>(Triple,
764 return std::make_unique<LoongArch64TargetInfo>(Triple, Opts);
767 case llvm::Triple::xtensa:
768 return std::make_unique<XtensaTargetInfo>(Triple, Opts);
781 llvm::Triple Triple(llvm::Triple::normalize(Opts->
Triple));
786 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
789 Target->TargetOpts = Opts;
793 Diags.
Report(diag::err_target_unknown_cpu) << Opts->
CPU;
795 Target->fillValidCPUList(ValidList);
796 if (!ValidList.empty())
797 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
806 Target->fillValidTuneCPUList(ValidList);
807 if (!ValidList.empty())
808 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
814 Diags.
Report(diag::err_target_unknown_abi) << Opts->
ABI;
820 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->
FPMath;
827 if (Target->isReadOnlyFeature(Name.substr(1))) {
828 Diags.Report(diag::warn_fe_backend_readonly_feature_flag) << Name;
833 if (!
Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,
834 Opts->FeaturesAsWritten))
838 Opts->Features.clear();
839 for (
const auto &F : Opts->FeatureMap)
840 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
843 llvm::sort(Opts->Features);
845 if (!
Target->handleTargetFeatures(Opts->Features, Diags))
848 Target->setSupportedOpenCLOpts();
849 Target->setCommandLineOpenCLOpts();
850 Target->setMaxAtomicWidth();
852 if (!Opts->DarwinTargetVariantTriple.empty())
853 Target->DarwinTargetVariantTriple =
854 llvm::Triple(Opts->DarwinTargetVariantTriple);
856 if (!
Target->validateTarget(Diags))
859 Target->CheckFixedPointBits();
869 auto diagnoseNotSupportedCore = [&](llvm::StringRef Name,
auto... OptArgs) {
872 Diags.
Report(diag::warn_opencl_unsupported_core_feature)
873 << Name << Opts.OpenCLCPlusPlus
876#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
877 diagnoseNotSupportedCore(#Ext, __VA_ARGS__);
878#include "clang/Basic/OpenCLExtensions.def"
Defines the Diagnostic-related interfaces.
llvm::MachO::Target Target
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
VersionTuple getOpenCLVersionTuple() const
Return the OpenCL C or C++ version as a VersionTuple.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static bool diagnoseUnsupportedFeatureDependencies(const TargetInfo &TI, DiagnosticsEngine &Diags)
static bool diagnoseFeatureExtensionDifferences(const TargetInfo &TI, DiagnosticsEngine &Diags)
static bool isOpenCLOptionCoreIn(const LangOptions &LO, Args &&... args)
Exposes information about the current target.
static TargetInfo * CreateTargetInfo(DiagnosticsEngine &Diags, TargetOptions &Opts)
Construct a target for the given options.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual bool validateOpenCLTarget(const LangOptions &Opts, DiagnosticsEngine &Diags) const
Check that OpenCL target has valid options setting based on OpenCL version.
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::string FPMath
If given, the unit to use for floating point math.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
LLVM_LIBRARY_VISIBILITY void defineCPUMacros(clang::MacroBuilder &Builder, llvm::StringRef CPUName, bool Tuning=true)
LLVM_LIBRARY_VISIBILITY void addCygMingDefines(const clang::LangOptions &Opts, clang::MacroBuilder &Builder)
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
std::unique_ptr< clang::TargetInfo > AllocateTarget(const llvm::Triple &Triple, const clang::TargetOptions &Opts)
The JSON file list parser is used to communicate input to InstallAPI.