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:
122 case llvm::Triple::xcore:
125 case llvm::Triple::hexagon:
126 if (os == llvm::Triple::Linux &&
127 Triple.getEnvironment() == llvm::Triple::Musl)
131 case llvm::Triple::lanai:
134 case llvm::Triple::aarch64_32:
135 if (Triple.isOSDarwin())
139 case llvm::Triple::aarch64:
140 if (Triple.isOSDarwin())
144 case llvm::Triple::CloudABI:
146 case llvm::Triple::FreeBSD:
148 case llvm::Triple::Fuchsia:
150 case llvm::Triple::Linux:
151 switch (Triple.getEnvironment()) {
154 case llvm::Triple::OpenHOS:
157 case llvm::Triple::NetBSD:
159 case llvm::Triple::OpenBSD:
161 case llvm::Triple::Win32:
162 switch (Triple.getEnvironment()) {
163 case llvm::Triple::GNU:
165 case llvm::Triple::MSVC:
173 case llvm::Triple::aarch64_be:
175 case llvm::Triple::FreeBSD:
177 case llvm::Triple::Fuchsia:
179 case llvm::Triple::Linux:
181 case llvm::Triple::NetBSD:
187 case llvm::Triple::arm:
188 case llvm::Triple::thumb:
189 if (Triple.isOSBinFormatMachO())
193 case llvm::Triple::CloudABI:
195 case llvm::Triple::Linux:
196 switch (Triple.getEnvironment()) {
199 case llvm::Triple::OpenHOS:
202 case llvm::Triple::LiteOS:
204 case llvm::Triple::FreeBSD:
206 case llvm::Triple::NetBSD:
208 case llvm::Triple::OpenBSD:
210 case llvm::Triple::RTEMS:
212 case llvm::Triple::NaCl:
214 case llvm::Triple::Win32:
215 switch (Triple.getEnvironment()) {
216 case llvm::Triple::Cygnus:
218 case llvm::Triple::GNU:
220 case llvm::Triple::Itanium:
222 case llvm::Triple::MSVC:
230 case llvm::Triple::armeb:
231 case llvm::Triple::thumbeb:
232 if (Triple.isOSDarwin())
236 case llvm::Triple::Linux:
238 case llvm::Triple::FreeBSD:
240 case llvm::Triple::NetBSD:
242 case llvm::Triple::OpenBSD:
244 case llvm::Triple::RTEMS:
246 case llvm::Triple::NaCl:
252 case llvm::Triple::avr:
254 case llvm::Triple::bpfeb:
255 case llvm::Triple::bpfel:
258 case llvm::Triple::msp430:
261 case llvm::Triple::mips:
263 case llvm::Triple::Linux:
265 case llvm::Triple::RTEMS:
267 case llvm::Triple::FreeBSD:
269 case llvm::Triple::NetBSD:
275 case llvm::Triple::mipsel:
277 case llvm::Triple::Linux:
278 switch (Triple.getEnvironment()) {
281 case llvm::Triple::OpenHOS:
284 case llvm::Triple::RTEMS:
286 case llvm::Triple::FreeBSD:
288 case llvm::Triple::NetBSD:
290 case llvm::Triple::NaCl:
296 case llvm::Triple::mips64:
298 case llvm::Triple::Linux:
300 case llvm::Triple::RTEMS:
302 case llvm::Triple::FreeBSD:
304 case llvm::Triple::NetBSD:
306 case llvm::Triple::OpenBSD:
312 case llvm::Triple::mips64el:
314 case llvm::Triple::Linux:
316 case llvm::Triple::RTEMS:
318 case llvm::Triple::FreeBSD:
320 case llvm::Triple::NetBSD:
322 case llvm::Triple::OpenBSD:
328 case llvm::Triple::m68k:
330 case llvm::Triple::Linux:
332 case llvm::Triple::NetBSD:
338 case llvm::Triple::le32:
340 case llvm::Triple::NaCl:
346 case llvm::Triple::le64:
349 case llvm::Triple::ppc:
350 if (Triple.isOSDarwin())
353 case llvm::Triple::Linux:
355 case llvm::Triple::FreeBSD:
357 case llvm::Triple::NetBSD:
359 case llvm::Triple::OpenBSD:
361 case llvm::Triple::RTEMS:
363 case llvm::Triple::AIX:
369 case llvm::Triple::ppcle:
371 case llvm::Triple::Linux:
373 case llvm::Triple::FreeBSD:
379 case llvm::Triple::ppc64:
380 if (Triple.isOSDarwin())
383 case llvm::Triple::Linux:
385 case llvm::Triple::Lv2:
387 case llvm::Triple::FreeBSD:
389 case llvm::Triple::NetBSD:
391 case llvm::Triple::OpenBSD:
393 case llvm::Triple::AIX:
399 case llvm::Triple::ppc64le:
401 case llvm::Triple::Linux:
403 case llvm::Triple::FreeBSD:
405 case llvm::Triple::NetBSD:
407 case llvm::Triple::OpenBSD:
413 case llvm::Triple::nvptx:
415 case llvm::Triple::nvptx64:
418 case llvm::Triple::amdgcn:
419 case llvm::Triple::r600:
422 case llvm::Triple::riscv32:
425 case llvm::Triple::FreeBSD:
427 case llvm::Triple::Linux:
433 case llvm::Triple::riscv64:
436 case llvm::Triple::FreeBSD:
438 case llvm::Triple::OpenBSD:
440 case llvm::Triple::Fuchsia:
442 case llvm::Triple::Linux:
443 switch (Triple.getEnvironment()) {
446 case llvm::Triple::OpenHOS:
453 case llvm::Triple::sparc:
455 case llvm::Triple::Linux:
457 case llvm::Triple::Solaris:
459 case llvm::Triple::NetBSD:
461 case llvm::Triple::RTEMS:
468 case llvm::Triple::sparcel:
470 case llvm::Triple::Linux:
472 case llvm::Triple::NetBSD:
474 case llvm::Triple::RTEMS:
480 case llvm::Triple::sparcv9:
482 case llvm::Triple::Linux:
484 case llvm::Triple::Solaris:
486 case llvm::Triple::NetBSD:
488 case llvm::Triple::OpenBSD:
490 case llvm::Triple::FreeBSD:
496 case llvm::Triple::systemz:
498 case llvm::Triple::Linux:
500 case llvm::Triple::ZOS:
506 case llvm::Triple::tce:
509 case llvm::Triple::tcele:
512 case llvm::Triple::x86:
513 if (Triple.isOSDarwin())
517 case llvm::Triple::Ananas:
519 case llvm::Triple::CloudABI:
521 case llvm::Triple::Linux: {
522 switch (Triple.getEnvironment()) {
525 case llvm::Triple::Android:
529 case llvm::Triple::DragonFly:
531 case llvm::Triple::NetBSD:
533 case llvm::Triple::OpenBSD:
535 case llvm::Triple::FreeBSD:
537 case llvm::Triple::Fuchsia:
539 case llvm::Triple::KFreeBSD:
541 case llvm::Triple::Minix:
543 case llvm::Triple::Solaris:
545 case llvm::Triple::Win32: {
546 switch (Triple.getEnvironment()) {
547 case llvm::Triple::Cygnus:
549 case llvm::Triple::GNU:
551 case llvm::Triple::Itanium:
552 case llvm::Triple::MSVC:
557 case llvm::Triple::Haiku:
559 case llvm::Triple::RTEMS:
561 case llvm::Triple::NaCl:
563 case llvm::Triple::ELFIAMCU:
565 case llvm::Triple::Hurd:
571 case llvm::Triple::x86_64:
572 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
576 case llvm::Triple::Ananas:
578 case llvm::Triple::CloudABI:
580 case llvm::Triple::Linux: {
581 switch (Triple.getEnvironment()) {
584 case llvm::Triple::Android:
586 case llvm::Triple::OpenHOS:
590 case llvm::Triple::DragonFly:
592 case llvm::Triple::NetBSD:
594 case llvm::Triple::OpenBSD:
596 case llvm::Triple::FreeBSD:
598 case llvm::Triple::Fuchsia:
600 case llvm::Triple::KFreeBSD:
602 case llvm::Triple::Solaris:
604 case llvm::Triple::Win32: {
605 switch (Triple.getEnvironment()) {
606 case llvm::Triple::Cygnus:
608 case llvm::Triple::GNU:
610 case llvm::Triple::MSVC:
615 case llvm::Triple::Haiku:
617 case llvm::Triple::NaCl:
619 case llvm::Triple::PS4:
621 case llvm::Triple::PS5:
627 case llvm::Triple::spir: {
628 if (os != llvm::Triple::UnknownOS ||
629 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
633 case llvm::Triple::spir64: {
634 if (os != llvm::Triple::UnknownOS ||
635 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
639 case llvm::Triple::spirv32: {
640 if (os != llvm::Triple::UnknownOS ||
641 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
645 case llvm::Triple::spirv64: {
646 if (os != llvm::Triple::UnknownOS ||
647 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
651 case llvm::Triple::wasm32:
652 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
653 Triple.getVendor() != llvm::Triple::UnknownVendor ||
654 !Triple.isOSBinFormatWasm())
657 case llvm::Triple::WASI:
659 case llvm::Triple::Emscripten:
661 case llvm::Triple::UnknownOS:
666 case llvm::Triple::wasm64:
667 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
668 Triple.getVendor() != llvm::Triple::UnknownVendor ||
669 !Triple.isOSBinFormatWasm())
672 case llvm::Triple::WASI:
674 case llvm::Triple::Emscripten:
676 case llvm::Triple::UnknownOS:
682 case llvm::Triple::dxil:
684 case llvm::Triple::renderscript32:
686 case llvm::Triple::renderscript64:
689 case llvm::Triple::ve:
692 case llvm::Triple::csky:
694 case llvm::Triple::Linux:
699 case llvm::Triple::loongarch32:
701 case llvm::Triple::Linux:
706 case llvm::Triple::loongarch64:
708 case llvm::Triple::Linux:
723 const std::shared_ptr<TargetOptions> &Opts) {
724 llvm::Triple Triple(Opts->Triple);
729 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
732 Target->TargetOpts = Opts;
735 if (!Opts->CPU.empty() && !
Target->setCPU(Opts->CPU)) {
736 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
738 Target->fillValidCPUList(ValidList);
739 if (!ValidList.empty())
740 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
745 if (!Opts->TuneCPU.empty() &&
746 !
Target->isValidTuneCPUName(Opts->TuneCPU)) {
747 Diags.
Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;
749 Target->fillValidTuneCPUList(ValidList);
750 if (!ValidList.empty())
751 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
756 if (!Opts->ABI.empty() && !
Target->setABI(Opts->ABI)) {
757 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
762 if (!Opts->FPMath.empty() && !
Target->setFPMath(Opts->FPMath)) {
763 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
769 if (!
Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,
770 Opts->FeaturesAsWritten))
774 Opts->Features.clear();
775 for (
const auto &F : Opts->FeatureMap)
776 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
779 llvm::sort(Opts->Features);
781 if (!
Target->handleTargetFeatures(Opts->Features, Diags))
784 Target->setSupportedOpenCLOpts();
785 Target->setCommandLineOpenCLOpts();
786 Target->setMaxAtomicWidth();
788 if (!Opts->DarwinTargetVariantTriple.empty())
789 Target->DarwinTargetVariantTriple =
790 llvm::Triple(Opts->DarwinTargetVariantTriple);
792 if (!
Target->validateTarget(Diags))
795 Target->CheckFixedPointBits();
805 auto diagnoseNotSupportedCore = [&](llvm::StringRef Name,
auto... OptArgs) {
808 Diags.
Report(diag::warn_opencl_unsupported_core_feature)
809 << Name << Opts.OpenCLCPlusPlus
812#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
813 diagnoseNotSupportedCore(#Ext, __VA_ARGS__);
814#include "clang/Basic/OpenCLExtensions.def"
Defines the Diagnostic-related interfaces.
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.
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.
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
Options for controlling the target.
void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning)
TargetInfo * AllocateTarget(const llvm::Triple &Triple, const TargetOptions &Opts)
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder)