36 #include "Targets/SPIR.h"
46 #include "llvm/ADT/StringExtras.h"
47 #include "llvm/TargetParser/Triple.h"
49 using namespace clang;
62 assert(MacroName[0] !=
'_' &&
"Identifier should be in the user's namespace");
67 Builder.defineMacro(MacroName);
70 Builder.defineMacro(
"__" + MacroName);
73 Builder.defineMacro(
"__" + MacroName +
"__");
77 Builder.defineMacro(
"__" + CPUName);
78 Builder.defineMacro(
"__" + CPUName +
"__");
80 Builder.defineMacro(
"__tune_" + CPUName +
"__");
88 if (Opts.DeclSpecKeyword)
89 Builder.defineMacro(
"__declspec",
"__declspec");
91 Builder.defineMacro(
"__declspec(a)",
"__attribute__((a))");
93 if (!Opts.MicrosoftExt) {
97 const char *CCs[] = {
"cdecl",
"stdcall",
"fastcall",
"thiscall",
"pascal"};
98 for (
const char *CC : CCs) {
99 std::string GCCSpelling =
"__attribute__((__";
101 GCCSpelling +=
"__))";
102 Builder.defineMacro(Twine(
"_") + CC, GCCSpelling);
103 Builder.defineMacro(Twine(
"__") + CC, GCCSpelling);
114 llvm::Triple::OSType os = Triple.getOS();
116 switch (Triple.getArch()) {
120 case llvm::Triple::arc:
121 return std::make_unique<ARCTargetInfo>(Triple, Opts);
123 case llvm::Triple::xcore:
124 return std::make_unique<XCoreTargetInfo>(Triple, Opts);
126 case llvm::Triple::hexagon:
127 if (os == llvm::Triple::Linux &&
128 Triple.getEnvironment() == llvm::Triple::Musl)
129 return std::make_unique<LinuxTargetInfo<HexagonTargetInfo>>(Triple, Opts);
130 return std::make_unique<HexagonTargetInfo>(Triple, Opts);
132 case llvm::Triple::lanai:
133 return std::make_unique<LanaiTargetInfo>(Triple, Opts);
135 case llvm::Triple::aarch64_32:
136 if (Triple.isOSDarwin())
137 return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
140 case llvm::Triple::aarch64:
141 if (Triple.isOSDarwin())
142 return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
145 case llvm::Triple::FreeBSD:
146 return std::make_unique<FreeBSDTargetInfo<AArch64leTargetInfo>>(Triple,
148 case llvm::Triple::Fuchsia:
149 return std::make_unique<FuchsiaTargetInfo<AArch64leTargetInfo>>(Triple,
151 case llvm::Triple::Haiku:
152 return std::make_unique<HaikuTargetInfo<AArch64leTargetInfo>>(Triple,
154 case llvm::Triple::Linux:
155 switch (Triple.getEnvironment()) {
157 return std::make_unique<LinuxTargetInfo<AArch64leTargetInfo>>(Triple,
159 case llvm::Triple::OpenHOS:
160 return std::make_unique<OHOSTargetInfo<AArch64leTargetInfo>>(Triple,
163 case llvm::Triple::NetBSD:
164 return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple,
166 case llvm::Triple::OpenBSD:
167 return std::make_unique<OpenBSDTargetInfo<AArch64leTargetInfo>>(Triple,
169 case llvm::Triple::Win32:
170 switch (Triple.getEnvironment()) {
171 case llvm::Triple::GNU:
172 return std::make_unique<MinGWARM64TargetInfo>(Triple, Opts);
173 case llvm::Triple::MSVC:
175 return std::make_unique<MicrosoftARM64TargetInfo>(Triple, Opts);
178 return std::make_unique<AArch64leTargetInfo>(Triple, Opts);
181 case llvm::Triple::aarch64_be:
183 case llvm::Triple::FreeBSD:
184 return std::make_unique<FreeBSDTargetInfo<AArch64beTargetInfo>>(Triple,
186 case llvm::Triple::Fuchsia:
187 return std::make_unique<FuchsiaTargetInfo<AArch64beTargetInfo>>(Triple,
189 case llvm::Triple::Linux:
190 return std::make_unique<LinuxTargetInfo<AArch64beTargetInfo>>(Triple,
192 case llvm::Triple::NetBSD:
193 return std::make_unique<NetBSDTargetInfo<AArch64beTargetInfo>>(Triple,
196 return std::make_unique<AArch64beTargetInfo>(Triple, Opts);
199 case llvm::Triple::arm:
200 case llvm::Triple::thumb:
201 if (Triple.isOSBinFormatMachO())
202 return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
205 case llvm::Triple::Linux:
206 switch (Triple.getEnvironment()) {
208 return std::make_unique<LinuxTargetInfo<ARMleTargetInfo>>(Triple, Opts);
209 case llvm::Triple::OpenHOS:
210 return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
212 case llvm::Triple::LiteOS:
213 return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
214 case llvm::Triple::FreeBSD:
215 return std::make_unique<FreeBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
216 case llvm::Triple::NetBSD:
217 return std::make_unique<NetBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
218 case llvm::Triple::OpenBSD:
219 return std::make_unique<OpenBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
220 case llvm::Triple::RTEMS:
221 return std::make_unique<RTEMSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
222 case llvm::Triple::Haiku:
223 return std::make_unique<HaikuTargetInfo<ARMleTargetInfo>>(Triple, Opts);
224 case llvm::Triple::NaCl:
225 return std::make_unique<NaClTargetInfo<ARMleTargetInfo>>(Triple, Opts);
226 case llvm::Triple::Win32:
227 switch (Triple.getEnvironment()) {
228 case llvm::Triple::Cygnus:
229 return std::make_unique<CygwinARMTargetInfo>(Triple, Opts);
230 case llvm::Triple::GNU:
231 return std::make_unique<MinGWARMTargetInfo>(Triple, Opts);
232 case llvm::Triple::Itanium:
233 return std::make_unique<ItaniumWindowsARMleTargetInfo>(Triple, Opts);
234 case llvm::Triple::MSVC:
236 return std::make_unique<MicrosoftARMleTargetInfo>(Triple, Opts);
239 return std::make_unique<ARMleTargetInfo>(Triple, Opts);
242 case llvm::Triple::armeb:
243 case llvm::Triple::thumbeb:
244 if (Triple.isOSDarwin())
245 return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
248 case llvm::Triple::Linux:
249 return std::make_unique<LinuxTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
250 case llvm::Triple::NetBSD:
251 return std::make_unique<NetBSDTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
252 case llvm::Triple::RTEMS:
253 return std::make_unique<RTEMSTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
254 case llvm::Triple::NaCl:
255 return std::make_unique<NaClTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
257 return std::make_unique<ARMbeTargetInfo>(Triple, Opts);
260 case llvm::Triple::avr:
261 return std::make_unique<AVRTargetInfo>(Triple, Opts);
262 case llvm::Triple::bpfeb:
263 case llvm::Triple::bpfel:
264 return std::make_unique<BPFTargetInfo>(Triple, Opts);
266 case llvm::Triple::msp430:
267 return std::make_unique<MSP430TargetInfo>(Triple, Opts);
269 case llvm::Triple::mips:
271 case llvm::Triple::Linux:
272 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
273 case llvm::Triple::RTEMS:
274 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
275 case llvm::Triple::FreeBSD:
276 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
277 case llvm::Triple::NetBSD:
278 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
280 return std::make_unique<MipsTargetInfo>(Triple, Opts);
283 case llvm::Triple::mipsel:
285 case llvm::Triple::Linux:
286 switch (Triple.getEnvironment()) {
288 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
289 case llvm::Triple::OpenHOS:
290 return std::make_unique<OHOSTargetInfo<MipsTargetInfo>>(Triple, Opts);
292 case llvm::Triple::RTEMS:
293 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
294 case llvm::Triple::FreeBSD:
295 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
296 case llvm::Triple::NetBSD:
297 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
298 case llvm::Triple::NaCl:
299 return std::make_unique<NaClTargetInfo<NaClMips32TargetInfo>>(Triple,
302 return std::make_unique<MipsTargetInfo>(Triple, Opts);
305 case llvm::Triple::mips64:
307 case llvm::Triple::Linux:
308 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
309 case llvm::Triple::RTEMS:
310 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
311 case llvm::Triple::FreeBSD:
312 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
313 case llvm::Triple::NetBSD:
314 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
315 case llvm::Triple::OpenBSD:
316 return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
318 return std::make_unique<MipsTargetInfo>(Triple, Opts);
321 case llvm::Triple::mips64el:
323 case llvm::Triple::Linux:
324 return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
325 case llvm::Triple::RTEMS:
326 return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
327 case llvm::Triple::FreeBSD:
328 return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
329 case llvm::Triple::NetBSD:
330 return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
331 case llvm::Triple::OpenBSD:
332 return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
334 return std::make_unique<MipsTargetInfo>(Triple, Opts);
337 case llvm::Triple::m68k:
339 case llvm::Triple::Linux:
340 return std::make_unique<LinuxTargetInfo<M68kTargetInfo>>(Triple, Opts);
341 case llvm::Triple::NetBSD:
342 return std::make_unique<NetBSDTargetInfo<M68kTargetInfo>>(Triple, Opts);
344 return std::make_unique<M68kTargetInfo>(Triple, Opts);
347 case llvm::Triple::le32:
349 case llvm::Triple::NaCl:
350 return std::make_unique<NaClTargetInfo<PNaClTargetInfo>>(Triple, Opts);
355 case llvm::Triple::le64:
356 return std::make_unique<Le64TargetInfo>(Triple, Opts);
358 case llvm::Triple::ppc:
360 case llvm::Triple::Linux:
361 return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
362 case llvm::Triple::FreeBSD:
363 return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
364 case llvm::Triple::NetBSD:
365 return std::make_unique<NetBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
366 case llvm::Triple::OpenBSD:
367 return std::make_unique<OpenBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
368 case llvm::Triple::RTEMS:
369 return std::make_unique<RTEMSTargetInfo<PPC32TargetInfo>>(Triple, Opts);
371 return std::make_unique<AIXPPC32TargetInfo>(Triple, Opts);
373 return std::make_unique<PPC32TargetInfo>(Triple, Opts);
376 case llvm::Triple::ppcle:
378 case llvm::Triple::Linux:
379 return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
380 case llvm::Triple::FreeBSD:
381 return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
383 return std::make_unique<PPC32TargetInfo>(Triple, Opts);
386 case llvm::Triple::ppc64:
388 case llvm::Triple::Linux:
389 return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
390 case llvm::Triple::Lv2:
391 return std::make_unique<PS3PPUTargetInfo<PPC64TargetInfo>>(Triple, Opts);
392 case llvm::Triple::FreeBSD:
393 return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
394 case llvm::Triple::NetBSD:
395 return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
396 case llvm::Triple::OpenBSD:
397 return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
399 return std::make_unique<AIXPPC64TargetInfo>(Triple, Opts);
401 return std::make_unique<PPC64TargetInfo>(Triple, Opts);
404 case llvm::Triple::ppc64le:
406 case llvm::Triple::Linux:
407 return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
408 case llvm::Triple::FreeBSD:
409 return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
410 case llvm::Triple::NetBSD:
411 return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
412 case llvm::Triple::OpenBSD:
413 return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
415 return std::make_unique<PPC64TargetInfo>(Triple, Opts);
418 case llvm::Triple::nvptx:
419 return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
421 case llvm::Triple::nvptx64:
422 return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
425 case llvm::Triple::amdgcn:
426 case llvm::Triple::r600:
427 return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);
429 case llvm::Triple::riscv32:
431 case llvm::Triple::NetBSD:
432 return std::make_unique<NetBSDTargetInfo<RISCV32TargetInfo>>(Triple,
434 case llvm::Triple::Linux:
435 return std::make_unique<LinuxTargetInfo<RISCV32TargetInfo>>(Triple, Opts);
437 return std::make_unique<RISCV32TargetInfo>(Triple, Opts);
440 case llvm::Triple::riscv64:
442 case llvm::Triple::FreeBSD:
443 return std::make_unique<FreeBSDTargetInfo<RISCV64TargetInfo>>(Triple,
445 case llvm::Triple::NetBSD:
446 return std::make_unique<NetBSDTargetInfo<RISCV64TargetInfo>>(Triple,
448 case llvm::Triple::OpenBSD:
449 return std::make_unique<OpenBSDTargetInfo<RISCV64TargetInfo>>(Triple,
451 case llvm::Triple::Fuchsia:
452 return std::make_unique<FuchsiaTargetInfo<RISCV64TargetInfo>>(Triple,
454 case llvm::Triple::Haiku:
455 return std::make_unique<HaikuTargetInfo<RISCV64TargetInfo>>(Triple,
457 case llvm::Triple::Linux:
458 switch (Triple.getEnvironment()) {
460 return std::make_unique<LinuxTargetInfo<RISCV64TargetInfo>>(Triple,
462 case llvm::Triple::OpenHOS:
463 return std::make_unique<OHOSTargetInfo<RISCV64TargetInfo>>(Triple,
467 return std::make_unique<RISCV64TargetInfo>(Triple, Opts);
470 case llvm::Triple::sparc:
472 case llvm::Triple::Linux:
473 return std::make_unique<LinuxTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
474 case llvm::Triple::Solaris:
475 return std::make_unique<SolarisTargetInfo<SparcV8TargetInfo>>(Triple,
477 case llvm::Triple::NetBSD:
478 return std::make_unique<NetBSDTargetInfo<SparcV8TargetInfo>>(Triple,
480 case llvm::Triple::RTEMS:
481 return std::make_unique<RTEMSTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
483 return std::make_unique<SparcV8TargetInfo>(Triple, Opts);
486 case llvm::Triple::sparcel:
488 case llvm::Triple::Linux:
489 return std::make_unique<LinuxTargetInfo<SparcV8elTargetInfo>>(Triple,
491 case llvm::Triple::RTEMS:
492 return std::make_unique<RTEMSTargetInfo<SparcV8elTargetInfo>>(Triple,
495 return std::make_unique<SparcV8elTargetInfo>(Triple, Opts);
498 case llvm::Triple::sparcv9:
500 case llvm::Triple::Linux:
501 return std::make_unique<LinuxTargetInfo<SparcV9TargetInfo>>(Triple, Opts);
502 case llvm::Triple::Solaris:
503 return std::make_unique<SolarisTargetInfo<SparcV9TargetInfo>>(Triple,
505 case llvm::Triple::NetBSD:
506 return std::make_unique<NetBSDTargetInfo<SparcV9TargetInfo>>(Triple,
508 case llvm::Triple::OpenBSD:
509 return std::make_unique<OpenBSDTargetInfo<SparcV9TargetInfo>>(Triple,
511 case llvm::Triple::FreeBSD:
512 return std::make_unique<FreeBSDTargetInfo<SparcV9TargetInfo>>(Triple,
515 return std::make_unique<SparcV9TargetInfo>(Triple, Opts);
518 case llvm::Triple::systemz:
520 case llvm::Triple::Linux:
521 return std::make_unique<LinuxTargetInfo<SystemZTargetInfo>>(Triple, Opts);
522 case llvm::Triple::ZOS:
523 return std::make_unique<ZOSTargetInfo<SystemZTargetInfo>>(Triple, Opts);
525 return std::make_unique<SystemZTargetInfo>(Triple, Opts);
528 case llvm::Triple::tce:
529 return std::make_unique<TCETargetInfo>(Triple, Opts);
531 case llvm::Triple::tcele:
532 return std::make_unique<TCELETargetInfo>(Triple, Opts);
534 case llvm::Triple::x86:
535 if (Triple.isOSDarwin())
536 return std::make_unique<DarwinI386TargetInfo>(Triple, Opts);
539 case llvm::Triple::Linux: {
540 switch (Triple.getEnvironment()) {
542 return std::make_unique<LinuxTargetInfo<X86_32TargetInfo>>(Triple,
544 case llvm::Triple::Android:
545 return std::make_unique<AndroidX86_32TargetInfo>(Triple, Opts);
548 case llvm::Triple::DragonFly:
549 return std::make_unique<DragonFlyBSDTargetInfo<X86_32TargetInfo>>(Triple,
551 case llvm::Triple::NetBSD:
552 return std::make_unique<NetBSDI386TargetInfo>(Triple, Opts);
553 case llvm::Triple::OpenBSD:
554 return std::make_unique<OpenBSDI386TargetInfo>(Triple, Opts);
555 case llvm::Triple::FreeBSD:
556 return std::make_unique<FreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
558 case llvm::Triple::Fuchsia:
559 return std::make_unique<FuchsiaTargetInfo<X86_32TargetInfo>>(Triple,
561 case llvm::Triple::KFreeBSD:
562 return std::make_unique<KFreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
564 case llvm::Triple::Solaris:
565 return std::make_unique<SolarisTargetInfo<X86_32TargetInfo>>(Triple,
567 case llvm::Triple::Win32: {
568 switch (Triple.getEnvironment()) {
569 case llvm::Triple::Cygnus:
570 return std::make_unique<CygwinX86_32TargetInfo>(Triple, Opts);
571 case llvm::Triple::GNU:
572 return std::make_unique<MinGWX86_32TargetInfo>(Triple, Opts);
573 case llvm::Triple::Itanium:
574 case llvm::Triple::MSVC:
576 return std::make_unique<MicrosoftX86_32TargetInfo>(Triple, Opts);
579 case llvm::Triple::Haiku:
580 return std::make_unique<HaikuX86_32TargetInfo>(Triple, Opts);
581 case llvm::Triple::RTEMS:
582 return std::make_unique<RTEMSX86_32TargetInfo>(Triple, Opts);
583 case llvm::Triple::NaCl:
584 return std::make_unique<NaClTargetInfo<X86_32TargetInfo>>(Triple, Opts);
585 case llvm::Triple::ELFIAMCU:
586 return std::make_unique<MCUX86_32TargetInfo>(Triple, Opts);
587 case llvm::Triple::Hurd:
588 return std::make_unique<HurdTargetInfo<X86_32TargetInfo>>(Triple, Opts);
590 return std::make_unique<X86_32TargetInfo>(Triple, Opts);
593 case llvm::Triple::x86_64:
594 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
595 return std::make_unique<DarwinX86_64TargetInfo>(Triple, Opts);
598 case llvm::Triple::Linux: {
599 switch (Triple.getEnvironment()) {
601 return std::make_unique<LinuxTargetInfo<X86_64TargetInfo>>(Triple,
603 case llvm::Triple::Android:
604 return std::make_unique<AndroidX86_64TargetInfo>(Triple, Opts);
605 case llvm::Triple::OpenHOS:
606 return std::make_unique<OHOSX86_64TargetInfo>(Triple, Opts);
609 case llvm::Triple::DragonFly:
610 return std::make_unique<DragonFlyBSDTargetInfo<X86_64TargetInfo>>(Triple,
612 case llvm::Triple::NetBSD:
613 return std::make_unique<NetBSDTargetInfo<X86_64TargetInfo>>(Triple, Opts);
614 case llvm::Triple::OpenBSD:
615 return std::make_unique<OpenBSDX86_64TargetInfo>(Triple, Opts);
616 case llvm::Triple::FreeBSD:
617 return std::make_unique<FreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
619 case llvm::Triple::Fuchsia:
620 return std::make_unique<FuchsiaTargetInfo<X86_64TargetInfo>>(Triple,
622 case llvm::Triple::KFreeBSD:
623 return std::make_unique<KFreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
625 case llvm::Triple::Solaris:
626 return std::make_unique<SolarisTargetInfo<X86_64TargetInfo>>(Triple,
628 case llvm::Triple::Win32: {
629 switch (Triple.getEnvironment()) {
630 case llvm::Triple::Cygnus:
631 return std::make_unique<CygwinX86_64TargetInfo>(Triple, Opts);
632 case llvm::Triple::GNU:
633 return std::make_unique<MinGWX86_64TargetInfo>(Triple, Opts);
634 case llvm::Triple::MSVC:
636 return std::make_unique<MicrosoftX86_64TargetInfo>(Triple, Opts);
639 case llvm::Triple::Haiku:
640 return std::make_unique<HaikuTargetInfo<X86_64TargetInfo>>(Triple, Opts);
641 case llvm::Triple::NaCl:
642 return std::make_unique<NaClTargetInfo<X86_64TargetInfo>>(Triple, Opts);
643 case llvm::Triple::PS4:
644 return std::make_unique<PS4OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
645 case llvm::Triple::PS5:
646 return std::make_unique<PS5OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
647 case llvm::Triple::Hurd:
648 return std::make_unique<HurdTargetInfo<X86_64TargetInfo>>(Triple, Opts);
650 return std::make_unique<X86_64TargetInfo>(Triple, Opts);
653 case llvm::Triple::spir: {
655 switch (HT.getOS()) {
656 case llvm::Triple::Win32:
657 switch (HT.getEnvironment()) {
659 case llvm::Triple::MSVC:
660 assert(HT.getArch() == llvm::Triple::x86 &&
661 "Unsupported host architecture");
662 return std::make_unique<MicrosoftX86_32SPIRTargetInfo>(Triple, Opts);
664 case llvm::Triple::Linux:
665 return std::make_unique<LinuxTargetInfo<SPIR32TargetInfo>>(Triple, Opts);
667 return std::make_unique<SPIR32TargetInfo>(Triple, Opts);
671 case llvm::Triple::spir64: {
673 bool IsFPGASubArch = Triple.getSubArch() == llvm::Triple::SPIRSubArch_fpga;
675 switch (HT.getOS()) {
676 case llvm::Triple::Win32:
677 switch (HT.getEnvironment()) {
679 case llvm::Triple::MSVC:
680 assert(HT.getArch() == llvm::Triple::x86_64 &&
681 "Unsupported host architecture");
682 return std::make_unique<MicrosoftX86_64_SPIR64TargetInfo>(Triple, Opts);
684 case llvm::Triple::Linux:
686 return std::make_unique<LinuxTargetInfo<SPIR64FPGATargetInfo>>(Triple, Opts);
687 return std::make_unique<LinuxTargetInfo<SPIR64TargetInfo>>(Triple, Opts);
690 return std::make_unique<SPIR64FPGATargetInfo>(Triple, Opts);
691 return std::make_unique<SPIR64TargetInfo>(Triple, Opts);
694 case llvm::Triple::spirv: {
695 return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
697 case llvm::Triple::spirv32: {
698 if (os != llvm::Triple::UnknownOS ||
699 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
702 switch (HT.getOS()) {
703 case llvm::Triple::Win32:
704 switch (HT.getEnvironment()) {
706 case llvm::Triple::MSVC:
707 assert(HT.getArch() == llvm::Triple::x86 &&
708 "Unsupported host architecture");
709 return std::make_unique<MicrosoftX86_32SPIRV32TargetInfo>(Triple, Opts);
712 return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);
715 case llvm::Triple::spirv64: {
716 if (os != llvm::Triple::UnknownOS ||
717 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
720 switch (HT.getOS()) {
721 case llvm::Triple::Win32:
722 switch (HT.getEnvironment()) {
724 case llvm::Triple::MSVC:
725 assert(HT.getArch() == llvm::Triple::x86_64 &&
726 "Unsupported host architecture");
727 return std::make_unique<MicrosoftX86_64_SPIRV64TargetInfo>(Triple,
731 return std::make_unique<SPIRV64TargetInfo>(Triple, Opts);
734 case llvm::Triple::wasm32:
735 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
736 Triple.getVendor() != llvm::Triple::UnknownVendor ||
737 !Triple.isOSBinFormatWasm())
740 case llvm::Triple::WASI:
741 return std::make_unique<WASITargetInfo<WebAssembly32TargetInfo>>(Triple,
743 case llvm::Triple::Emscripten:
744 return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>(
746 case llvm::Triple::UnknownOS:
747 return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>>(
752 case llvm::Triple::wasm64:
753 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
754 Triple.getVendor() != llvm::Triple::UnknownVendor ||
755 !Triple.isOSBinFormatWasm())
758 case llvm::Triple::WASI:
759 return std::make_unique<WASITargetInfo<WebAssembly64TargetInfo>>(Triple,
761 case llvm::Triple::Emscripten:
762 return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>(
764 case llvm::Triple::UnknownOS:
765 return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>>(
771 case llvm::Triple::dxil:
772 return std::make_unique<DirectXTargetInfo>(Triple, Opts);
773 case llvm::Triple::renderscript32:
774 return std::make_unique<LinuxTargetInfo<RenderScript32TargetInfo>>(Triple,
776 case llvm::Triple::renderscript64:
777 return std::make_unique<LinuxTargetInfo<RenderScript64TargetInfo>>(Triple,
780 case llvm::Triple::ve:
781 return std::make_unique<LinuxTargetInfo<VETargetInfo>>(Triple, Opts);
783 case llvm::Triple::csky:
785 case llvm::Triple::Linux:
786 return std::make_unique<LinuxTargetInfo<CSKYTargetInfo>>(Triple, Opts);
788 return std::make_unique<CSKYTargetInfo>(Triple, Opts);
790 case llvm::Triple::loongarch32:
792 case llvm::Triple::Linux:
793 return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
796 return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);
798 case llvm::Triple::loongarch64:
800 case llvm::Triple::Linux:
801 return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
804 return std::make_unique<LoongArch64TargetInfo>(Triple, Opts);
816 const std::shared_ptr<TargetOptions> &Opts) {
822 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
825 Target->TargetOpts = Opts;
828 if (!Opts->CPU.empty() && !
Target->setCPU(Opts->CPU)) {
829 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
831 Target->fillValidCPUList(ValidList);
832 if (!ValidList.empty())
833 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
838 if (!Opts->TuneCPU.empty() &&
839 !
Target->isValidTuneCPUName(Opts->TuneCPU)) {
840 Diags.
Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;
842 Target->fillValidTuneCPUList(ValidList);
843 if (!ValidList.empty())
844 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
849 if (!Opts->ABI.empty() && !
Target->setABI(Opts->ABI)) {
850 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
855 if (!Opts->FPMath.empty() && !
Target->setFPMath(Opts->FPMath)) {
856 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
862 llvm::erase_if(Opts->FeaturesAsWritten, [&](StringRef Name) {
863 if (Target->isReadOnlyFeature(Name.substr(1))) {
864 Diags.Report(diag::warn_fe_backend_readonly_feature_flag) << Name;
869 if (!
Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,
870 Opts->FeaturesAsWritten))
874 Opts->Features.clear();
875 for (
const auto &F : Opts->FeatureMap)
876 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
879 llvm::sort(Opts->Features);
881 if (!
Target->handleTargetFeatures(Opts->Features, Diags))
884 Target->setSupportedOpenCLOpts();
885 Target->setCommandLineOpenCLOpts();
886 Target->setMaxAtomicWidth();
888 if (!Opts->DarwinTargetVariantTriple.empty())
889 Target->DarwinTargetVariantTriple =
890 llvm::Triple(Opts->DarwinTargetVariantTriple);
892 if (!
Target->validateTarget(Diags))
895 Target->CheckFixedPointBits();
905 auto diagnoseNotSupportedCore = [&](llvm::StringRef Name,
auto... OptArgs) {
908 Diags.
Report(diag::warn_opencl_unsupported_core_feature)
909 << Name << Opts.OpenCLCPlusPlus
912 #define OPENCL_GENERIC_EXTENSION(Ext, ...) \
913 diagnoseNotSupportedCore(#Ext, __VA_ARGS__);
914 #include "clang/Basic/OpenCLExtensions.def"
clang::driver::toolchains::AIX AIX
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.
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
static TargetInfo * CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr< TargetOptions > &Opts)
Construct a target for the given options.
virtual bool validateOpenCLTarget(const LangOptions &Opts, DiagnosticsEngine &Diags) const
Check that OpenCL target has valid options setting based on OpenCL version.
Options for controlling the target.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning)
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
std::unique_ptr< TargetInfo > AllocateTarget(const llvm::Triple &Triple, const TargetOptions &Opts)
void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder)
The JSON file list parser is used to communicate input to InstallAPI.
float __ovld __cnfn normalize(float)
Returns a vector in the same direction as p but with a length of 1.