40 #include "llvm/ADT/StringExtras.h" 41 #include "llvm/ADT/Triple.h" 43 using namespace clang;
56 assert(MacroName[0] !=
'_' &&
"Identifier should be in the user's namespace");
81 if (Opts.MicrosoftExt)
84 Builder.
defineMacro(
"__declspec(a)",
"__attribute__((a))");
86 if (!Opts.MicrosoftExt) {
90 const char *CCs[] = {
"cdecl",
"stdcall",
"fastcall",
"thiscall",
"pascal"};
91 for (
const char *CC : CCs) {
92 std::string GCCSpelling =
"__attribute__((__";
94 GCCSpelling +=
"__))";
107 llvm::Triple::OSType os = Triple.getOS();
109 switch (Triple.getArch()) {
113 case llvm::Triple::arc:
116 case llvm::Triple::xcore:
119 case llvm::Triple::hexagon:
122 case llvm::Triple::lanai:
125 case llvm::Triple::aarch64_32:
126 if (Triple.isOSDarwin())
130 case llvm::Triple::aarch64:
131 if (Triple.isOSDarwin())
135 case llvm::Triple::CloudABI:
137 case llvm::Triple::FreeBSD:
139 case llvm::Triple::Fuchsia:
141 case llvm::Triple::Linux:
143 case llvm::Triple::NetBSD:
145 case llvm::Triple::OpenBSD:
147 case llvm::Triple::Win32:
148 switch (Triple.getEnvironment()) {
149 case llvm::Triple::GNU:
151 case llvm::Triple::MSVC:
159 case llvm::Triple::aarch64_be:
161 case llvm::Triple::FreeBSD:
163 case llvm::Triple::Fuchsia:
165 case llvm::Triple::Linux:
167 case llvm::Triple::NetBSD:
173 case llvm::Triple::arm:
174 case llvm::Triple::thumb:
175 if (Triple.isOSBinFormatMachO())
179 case llvm::Triple::CloudABI:
181 case llvm::Triple::Linux:
183 case llvm::Triple::FreeBSD:
185 case llvm::Triple::NetBSD:
187 case llvm::Triple::OpenBSD:
189 case llvm::Triple::RTEMS:
191 case llvm::Triple::NaCl:
193 case llvm::Triple::Win32:
194 switch (Triple.getEnvironment()) {
195 case llvm::Triple::Cygnus:
197 case llvm::Triple::GNU:
199 case llvm::Triple::Itanium:
201 case llvm::Triple::MSVC:
209 case llvm::Triple::armeb:
210 case llvm::Triple::thumbeb:
211 if (Triple.isOSDarwin())
215 case llvm::Triple::Linux:
217 case llvm::Triple::FreeBSD:
219 case llvm::Triple::NetBSD:
221 case llvm::Triple::OpenBSD:
223 case llvm::Triple::RTEMS:
225 case llvm::Triple::NaCl:
231 case llvm::Triple::avr:
233 case llvm::Triple::bpfeb:
234 case llvm::Triple::bpfel:
237 case llvm::Triple::msp430:
240 case llvm::Triple::mips:
242 case llvm::Triple::Linux:
244 case llvm::Triple::RTEMS:
246 case llvm::Triple::FreeBSD:
248 case llvm::Triple::NetBSD:
254 case llvm::Triple::mipsel:
256 case llvm::Triple::Linux:
258 case llvm::Triple::RTEMS:
260 case llvm::Triple::FreeBSD:
262 case llvm::Triple::NetBSD:
264 case llvm::Triple::NaCl:
270 case llvm::Triple::mips64:
272 case llvm::Triple::Linux:
274 case llvm::Triple::RTEMS:
276 case llvm::Triple::FreeBSD:
278 case llvm::Triple::NetBSD:
280 case llvm::Triple::OpenBSD:
286 case llvm::Triple::mips64el:
288 case llvm::Triple::Linux:
290 case llvm::Triple::RTEMS:
292 case llvm::Triple::FreeBSD:
294 case llvm::Triple::NetBSD:
296 case llvm::Triple::OpenBSD:
302 case llvm::Triple::le32:
304 case llvm::Triple::NaCl:
310 case llvm::Triple::le64:
313 case llvm::Triple::ppc:
314 if (Triple.isOSDarwin())
317 case llvm::Triple::Linux:
319 case llvm::Triple::FreeBSD:
321 case llvm::Triple::NetBSD:
323 case llvm::Triple::OpenBSD:
325 case llvm::Triple::RTEMS:
333 case llvm::Triple::ppc64:
334 if (Triple.isOSDarwin())
337 case llvm::Triple::Linux:
339 case llvm::Triple::Lv2:
341 case llvm::Triple::FreeBSD:
343 case llvm::Triple::NetBSD:
351 case llvm::Triple::ppc64le:
353 case llvm::Triple::Linux:
355 case llvm::Triple::NetBSD:
361 case llvm::Triple::nvptx:
363 case llvm::Triple::nvptx64:
366 case llvm::Triple::amdgcn:
367 case llvm::Triple::r600:
370 case llvm::Triple::riscv32:
373 case llvm::Triple::FreeBSD:
375 case llvm::Triple::Linux:
381 case llvm::Triple::riscv64:
384 case llvm::Triple::FreeBSD:
386 case llvm::Triple::Fuchsia:
388 case llvm::Triple::Linux:
394 case llvm::Triple::sparc:
396 case llvm::Triple::Linux:
398 case llvm::Triple::Solaris:
400 case llvm::Triple::NetBSD:
402 case llvm::Triple::OpenBSD:
404 case llvm::Triple::RTEMS:
411 case llvm::Triple::sparcel:
413 case llvm::Triple::Linux:
415 case llvm::Triple::NetBSD:
417 case llvm::Triple::OpenBSD:
419 case llvm::Triple::RTEMS:
425 case llvm::Triple::sparcv9:
427 case llvm::Triple::Linux:
429 case llvm::Triple::Solaris:
431 case llvm::Triple::NetBSD:
433 case llvm::Triple::OpenBSD:
435 case llvm::Triple::FreeBSD:
441 case llvm::Triple::systemz:
443 case llvm::Triple::Linux:
449 case llvm::Triple::tce:
452 case llvm::Triple::tcele:
455 case llvm::Triple::x86:
456 if (Triple.isOSDarwin())
460 case llvm::Triple::Ananas:
462 case llvm::Triple::CloudABI:
464 case llvm::Triple::Linux: {
465 switch (Triple.getEnvironment()) {
468 case llvm::Triple::Android:
472 case llvm::Triple::DragonFly:
474 case llvm::Triple::NetBSD:
476 case llvm::Triple::OpenBSD:
478 case llvm::Triple::FreeBSD:
480 case llvm::Triple::KFreeBSD:
482 case llvm::Triple::Minix:
484 case llvm::Triple::Solaris:
486 case llvm::Triple::Win32: {
487 switch (Triple.getEnvironment()) {
488 case llvm::Triple::Cygnus:
490 case llvm::Triple::GNU:
492 case llvm::Triple::Itanium:
493 case llvm::Triple::MSVC:
498 case llvm::Triple::Haiku:
500 case llvm::Triple::RTEMS:
502 case llvm::Triple::NaCl:
504 case llvm::Triple::ELFIAMCU:
506 case llvm::Triple::Hurd:
512 case llvm::Triple::x86_64:
513 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
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::Solaris:
543 case llvm::Triple::Win32: {
544 switch (Triple.getEnvironment()) {
545 case llvm::Triple::Cygnus:
547 case llvm::Triple::GNU:
549 case llvm::Triple::MSVC:
554 case llvm::Triple::Haiku:
556 case llvm::Triple::NaCl:
558 case llvm::Triple::PS4:
564 case llvm::Triple::spir: {
565 if (Triple.getOS() != llvm::Triple::UnknownOS ||
566 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
570 case llvm::Triple::spir64: {
571 if (Triple.getOS() != llvm::Triple::UnknownOS ||
572 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
576 case llvm::Triple::wasm32:
577 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
578 Triple.getVendor() != llvm::Triple::UnknownVendor ||
579 !Triple.isOSBinFormatWasm())
581 switch (Triple.getOS()) {
582 case llvm::Triple::WASI:
584 case llvm::Triple::Emscripten:
586 case llvm::Triple::UnknownOS:
591 case llvm::Triple::wasm64:
592 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
593 Triple.getVendor() != llvm::Triple::UnknownVendor ||
594 !Triple.isOSBinFormatWasm())
596 switch (Triple.getOS()) {
597 case llvm::Triple::WASI:
599 case llvm::Triple::Emscripten:
601 case llvm::Triple::UnknownOS:
607 case llvm::Triple::renderscript32:
609 case llvm::Triple::renderscript64:
621 const std::shared_ptr<TargetOptions> &Opts) {
622 llvm::Triple Triple(Opts->Triple);
627 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
630 Target->TargetOpts = Opts;
633 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
634 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
636 Target->fillValidCPUList(ValidList);
637 if (!ValidList.empty())
638 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
643 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
644 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
649 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
650 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
656 llvm::StringMap<bool> Features;
657 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
658 Opts->FeaturesAsWritten))
662 Opts->Features.clear();
663 for (
const auto &F : Features)
664 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
667 llvm::sort(Opts->Features);
669 if (!Target->handleTargetFeatures(Opts->Features, Diags))
672 Target->setSupportedOpenCLOpts();
673 Target->setOpenCLExtensionOpts();
674 Target->setMaxAtomicWidth();
676 if (!Target->validateTarget(Diags))
679 Target->CheckFixedPointBits();
681 return Target.release();
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Options for controlling the target.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Concrete class used by the front-end to report problems and issues.
Defines the Diagnostic-related interfaces.
Exposes information about the current target.
static TargetInfo * CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr< TargetOptions > &Opts)
Construct a target for the given options.
TargetInfo * AllocateTarget(const llvm::Triple &Triple, const TargetOptions &Opts)
void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder)
Dataflow Directional Tag Classes.
clang::driver::toolchains::AIX AIX
void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning)
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".