44 #include "llvm/ADT/StringExtras.h"
45 #include "llvm/ADT/Triple.h"
47 using namespace clang;
60 assert(MacroName[0] !=
'_' &&
"Identifier should be in the user's namespace");
65 Builder.defineMacro(MacroName);
68 Builder.defineMacro(
"__" + MacroName);
71 Builder.defineMacro(
"__" + MacroName +
"__");
75 Builder.defineMacro(
"__" + CPUName);
76 Builder.defineMacro(
"__" + CPUName +
"__");
78 Builder.defineMacro(
"__tune_" + CPUName +
"__");
85 if (Opts.MicrosoftExt)
86 Builder.defineMacro(
"__declspec",
"__declspec");
88 Builder.defineMacro(
"__declspec(a)",
"__attribute__((a))");
90 if (!Opts.MicrosoftExt) {
94 const char *CCs[] = {
"cdecl",
"stdcall",
"fastcall",
"thiscall",
"pascal"};
95 for (
const char *CC : CCs) {
98 GCCSpelling +=
"__))";
99 Builder.defineMacro(Twine(
"_") + CC, GCCSpelling);
100 Builder.defineMacro(Twine(
"__") + CC, GCCSpelling);
111 llvm::Triple::OSType os = Triple.getOS();
113 switch (Triple.getArch()) {
117 case llvm::Triple::arc:
120 case llvm::Triple::xcore:
123 case llvm::Triple::hexagon:
124 if (os == llvm::Triple::Linux &&
125 Triple.getEnvironment() == llvm::Triple::Musl)
129 case llvm::Triple::lanai:
132 case llvm::Triple::aarch64_32:
133 if (Triple.isOSDarwin())
137 case llvm::Triple::aarch64:
138 if (Triple.isOSDarwin())
142 case llvm::Triple::CloudABI:
144 case llvm::Triple::FreeBSD:
146 case llvm::Triple::Fuchsia:
148 case llvm::Triple::Linux:
150 case llvm::Triple::NetBSD:
152 case llvm::Triple::OpenBSD:
154 case llvm::Triple::Win32:
155 switch (Triple.getEnvironment()) {
156 case llvm::Triple::GNU:
158 case llvm::Triple::MSVC:
166 case llvm::Triple::aarch64_be:
168 case llvm::Triple::FreeBSD:
170 case llvm::Triple::Fuchsia:
172 case llvm::Triple::Linux:
174 case llvm::Triple::NetBSD:
180 case llvm::Triple::arm:
181 case llvm::Triple::thumb:
182 if (Triple.isOSBinFormatMachO())
186 case llvm::Triple::CloudABI:
188 case llvm::Triple::Linux:
190 case llvm::Triple::FreeBSD:
192 case llvm::Triple::NetBSD:
194 case llvm::Triple::OpenBSD:
196 case llvm::Triple::RTEMS:
198 case llvm::Triple::NaCl:
200 case llvm::Triple::Win32:
201 switch (Triple.getEnvironment()) {
202 case llvm::Triple::Cygnus:
204 case llvm::Triple::GNU:
206 case llvm::Triple::Itanium:
208 case llvm::Triple::MSVC:
216 case llvm::Triple::armeb:
217 case llvm::Triple::thumbeb:
218 if (Triple.isOSDarwin())
222 case llvm::Triple::Linux:
224 case llvm::Triple::FreeBSD:
226 case llvm::Triple::NetBSD:
228 case llvm::Triple::OpenBSD:
230 case llvm::Triple::RTEMS:
232 case llvm::Triple::NaCl:
238 case llvm::Triple::avr:
240 case llvm::Triple::bpfeb:
241 case llvm::Triple::bpfel:
244 case llvm::Triple::msp430:
247 case llvm::Triple::mips:
249 case llvm::Triple::Linux:
251 case llvm::Triple::RTEMS:
253 case llvm::Triple::FreeBSD:
255 case llvm::Triple::NetBSD:
261 case llvm::Triple::mipsel:
263 case llvm::Triple::Linux:
265 case llvm::Triple::RTEMS:
267 case llvm::Triple::FreeBSD:
269 case llvm::Triple::NetBSD:
271 case llvm::Triple::NaCl:
277 case llvm::Triple::mips64:
279 case llvm::Triple::Linux:
281 case llvm::Triple::RTEMS:
283 case llvm::Triple::FreeBSD:
285 case llvm::Triple::NetBSD:
287 case llvm::Triple::OpenBSD:
293 case llvm::Triple::mips64el:
295 case llvm::Triple::Linux:
297 case llvm::Triple::RTEMS:
299 case llvm::Triple::FreeBSD:
301 case llvm::Triple::NetBSD:
303 case llvm::Triple::OpenBSD:
309 case llvm::Triple::m68k:
311 case llvm::Triple::Linux:
313 case llvm::Triple::NetBSD:
319 case llvm::Triple::le32:
321 case llvm::Triple::NaCl:
327 case llvm::Triple::le64:
330 case llvm::Triple::ppc:
331 if (Triple.isOSDarwin())
334 case llvm::Triple::Linux:
336 case llvm::Triple::FreeBSD:
338 case llvm::Triple::NetBSD:
340 case llvm::Triple::OpenBSD:
342 case llvm::Triple::RTEMS:
350 case llvm::Triple::ppcle:
352 case llvm::Triple::Linux:
354 case llvm::Triple::FreeBSD:
360 case llvm::Triple::ppc64:
361 if (Triple.isOSDarwin())
364 case llvm::Triple::Linux:
366 case llvm::Triple::Lv2:
368 case llvm::Triple::FreeBSD:
370 case llvm::Triple::NetBSD:
372 case llvm::Triple::OpenBSD:
380 case llvm::Triple::ppc64le:
382 case llvm::Triple::Linux:
384 case llvm::Triple::FreeBSD:
386 case llvm::Triple::NetBSD:
388 case llvm::Triple::OpenBSD:
394 case llvm::Triple::nvptx:
396 case llvm::Triple::nvptx64:
399 case llvm::Triple::amdgcn:
400 case llvm::Triple::r600:
403 case llvm::Triple::riscv32:
406 case llvm::Triple::FreeBSD:
408 case llvm::Triple::Linux:
414 case llvm::Triple::riscv64:
417 case llvm::Triple::FreeBSD:
419 case llvm::Triple::OpenBSD:
421 case llvm::Triple::Fuchsia:
423 case llvm::Triple::Linux:
429 case llvm::Triple::sparc:
431 case llvm::Triple::Linux:
433 case llvm::Triple::Solaris:
435 case llvm::Triple::NetBSD:
437 case llvm::Triple::RTEMS:
444 case llvm::Triple::sparcel:
446 case llvm::Triple::Linux:
448 case llvm::Triple::NetBSD:
450 case llvm::Triple::RTEMS:
456 case llvm::Triple::sparcv9:
458 case llvm::Triple::Linux:
460 case llvm::Triple::Solaris:
462 case llvm::Triple::NetBSD:
464 case llvm::Triple::OpenBSD:
466 case llvm::Triple::FreeBSD:
472 case llvm::Triple::systemz:
474 case llvm::Triple::Linux:
476 case llvm::Triple::ZOS:
482 case llvm::Triple::tce:
485 case llvm::Triple::tcele:
488 case llvm::Triple::x86:
489 if (Triple.isOSDarwin())
493 case llvm::Triple::Ananas:
495 case llvm::Triple::CloudABI:
497 case llvm::Triple::Linux: {
498 switch (Triple.getEnvironment()) {
501 case llvm::Triple::Android:
505 case llvm::Triple::DragonFly:
507 case llvm::Triple::NetBSD:
509 case llvm::Triple::OpenBSD:
511 case llvm::Triple::FreeBSD:
513 case llvm::Triple::Fuchsia:
515 case llvm::Triple::KFreeBSD:
517 case llvm::Triple::Minix:
519 case llvm::Triple::Solaris:
521 case llvm::Triple::Win32: {
522 switch (Triple.getEnvironment()) {
523 case llvm::Triple::Cygnus:
525 case llvm::Triple::GNU:
527 case llvm::Triple::Itanium:
528 case llvm::Triple::MSVC:
533 case llvm::Triple::Haiku:
535 case llvm::Triple::RTEMS:
537 case llvm::Triple::NaCl:
539 case llvm::Triple::ELFIAMCU:
541 case llvm::Triple::Hurd:
547 case llvm::Triple::x86_64:
548 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
552 case llvm::Triple::Ananas:
554 case llvm::Triple::CloudABI:
556 case llvm::Triple::Linux: {
557 switch (Triple.getEnvironment()) {
560 case llvm::Triple::Android:
564 case llvm::Triple::DragonFly:
566 case llvm::Triple::NetBSD:
568 case llvm::Triple::OpenBSD:
570 case llvm::Triple::FreeBSD:
572 case llvm::Triple::Fuchsia:
574 case llvm::Triple::KFreeBSD:
576 case llvm::Triple::Solaris:
578 case llvm::Triple::Win32: {
579 switch (Triple.getEnvironment()) {
580 case llvm::Triple::Cygnus:
582 case llvm::Triple::GNU:
584 case llvm::Triple::MSVC:
589 case llvm::Triple::Haiku:
591 case llvm::Triple::NaCl:
593 case llvm::Triple::PS4:
595 case llvm::Triple::PS5:
601 case llvm::Triple::spir: {
602 if (os != llvm::Triple::UnknownOS ||
603 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
607 case llvm::Triple::spir64: {
608 if (os != llvm::Triple::UnknownOS ||
609 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
613 case llvm::Triple::spirv32: {
614 if (os != llvm::Triple::UnknownOS ||
615 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
619 case llvm::Triple::spirv64: {
620 if (os != llvm::Triple::UnknownOS ||
621 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
625 case llvm::Triple::wasm32:
626 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
627 Triple.getVendor() != llvm::Triple::UnknownVendor ||
628 !Triple.isOSBinFormatWasm())
631 case llvm::Triple::WASI:
633 case llvm::Triple::Emscripten:
635 case llvm::Triple::UnknownOS:
640 case llvm::Triple::wasm64:
641 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
642 Triple.getVendor() != llvm::Triple::UnknownVendor ||
643 !Triple.isOSBinFormatWasm())
646 case llvm::Triple::WASI:
648 case llvm::Triple::Emscripten:
650 case llvm::Triple::UnknownOS:
656 case llvm::Triple::dxil:
658 case llvm::Triple::renderscript32:
660 case llvm::Triple::renderscript64:
663 case llvm::Triple::ve:
666 case llvm::Triple::csky:
668 case llvm::Triple::Linux:
683 const std::shared_ptr<TargetOptions> &Opts) {
684 llvm::Triple Triple(Opts->Triple);
689 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
692 Target->TargetOpts = Opts;
695 if (!Opts->CPU.empty() && !
Target->setCPU(Opts->CPU)) {
696 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
698 Target->fillValidCPUList(ValidList);
699 if (!ValidList.empty())
700 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
705 if (!Opts->TuneCPU.empty() &&
706 !
Target->isValidTuneCPUName(Opts->TuneCPU)) {
707 Diags.
Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;
709 Target->fillValidTuneCPUList(ValidList);
710 if (!ValidList.empty())
711 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
716 if (!Opts->ABI.empty() && !
Target->setABI(Opts->ABI)) {
717 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
722 if (!Opts->FPMath.empty() && !
Target->setFPMath(Opts->FPMath)) {
723 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
729 if (!
Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,
730 Opts->FeaturesAsWritten))
734 Opts->Features.clear();
735 for (
const auto &F : Opts->FeatureMap)
736 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
739 llvm::sort(Opts->Features);
741 if (!
Target->handleTargetFeatures(Opts->Features, Diags))
744 Target->setSupportedOpenCLOpts();
745 Target->setCommandLineOpenCLOpts();
746 Target->setMaxAtomicWidth();
748 if (!Opts->DarwinTargetVariantTriple.empty())
749 Target->DarwinTargetVariantTriple =
750 llvm::Triple(Opts->DarwinTargetVariantTriple);
752 if (!
Target->validateTarget(Diags))
755 Target->CheckFixedPointBits();
763 const llvm::StringMap<bool> &OpenCLFeaturesMap = getSupportedOpenCLOpts();
765 auto diagnoseNotSupportedCore = [&](llvm::StringRef Name,
auto... OptArgs) {
767 !hasFeatureEnabled(OpenCLFeaturesMap, Name))
768 Diags.
Report(diag::warn_opencl_unsupported_core_feature)
769 << Name << Opts.OpenCLCPlusPlus
772 #define OPENCL_GENERIC_EXTENSION(Ext, ...) \
773 diagnoseNotSupportedCore(#Ext, __VA_ARGS__);
774 #include "clang/Basic/OpenCLExtensions.def"