41 #include "llvm/ADT/StringExtras.h" 42 #include "llvm/ADT/Triple.h" 44 using namespace clang;
57 assert(MacroName[0] !=
'_' &&
"Identifier should be in the user's namespace");
82 if (Opts.MicrosoftExt)
85 Builder.
defineMacro(
"__declspec(a)",
"__attribute__((a))");
87 if (!Opts.MicrosoftExt) {
91 const char *CCs[] = {
"cdecl",
"stdcall",
"fastcall",
"thiscall",
"pascal"};
92 for (
const char *CC : CCs) {
93 std::string GCCSpelling =
"__attribute__((__";
95 GCCSpelling +=
"__))";
106 if (Triple.isArch64Bit()) {
121 llvm::Triple::OSType os = Triple.getOS();
123 switch (Triple.getArch()) {
127 case llvm::Triple::xcore:
130 case llvm::Triple::hexagon:
133 case llvm::Triple::lanai:
136 case llvm::Triple::aarch64:
137 if (Triple.isOSDarwin())
141 case llvm::Triple::CloudABI:
143 case llvm::Triple::FreeBSD:
145 case llvm::Triple::Fuchsia:
147 case llvm::Triple::Linux:
149 case llvm::Triple::NetBSD:
151 case llvm::Triple::OpenBSD:
153 case llvm::Triple::Win32:
154 switch (Triple.getEnvironment()) {
155 case llvm::Triple::GNU:
157 case llvm::Triple::MSVC:
165 case llvm::Triple::aarch64_be:
167 case llvm::Triple::FreeBSD:
169 case llvm::Triple::Fuchsia:
171 case llvm::Triple::Linux:
173 case llvm::Triple::NetBSD:
179 case llvm::Triple::arm:
180 case llvm::Triple::thumb:
181 if (Triple.isOSBinFormatMachO())
185 case llvm::Triple::CloudABI:
187 case llvm::Triple::Linux:
189 case llvm::Triple::FreeBSD:
191 case llvm::Triple::NetBSD:
193 case llvm::Triple::OpenBSD:
195 case llvm::Triple::RTEMS:
197 case llvm::Triple::NaCl:
199 case llvm::Triple::Win32:
200 switch (Triple.getEnvironment()) {
201 case llvm::Triple::Cygnus:
203 case llvm::Triple::GNU:
205 case llvm::Triple::Itanium:
207 case llvm::Triple::MSVC:
215 case llvm::Triple::armeb:
216 case llvm::Triple::thumbeb:
217 if (Triple.isOSDarwin())
221 case llvm::Triple::Linux:
223 case llvm::Triple::FreeBSD:
225 case llvm::Triple::NetBSD:
227 case llvm::Triple::OpenBSD:
229 case llvm::Triple::RTEMS:
231 case llvm::Triple::NaCl:
237 case llvm::Triple::avr:
239 case llvm::Triple::bpfeb:
240 case llvm::Triple::bpfel:
243 case llvm::Triple::msp430:
246 case llvm::Triple::nios2:
249 case llvm::Triple::mips:
251 case llvm::Triple::Linux:
253 case llvm::Triple::RTEMS:
255 case llvm::Triple::FreeBSD:
257 case llvm::Triple::NetBSD:
263 case llvm::Triple::mipsel:
265 case llvm::Triple::Linux:
267 case llvm::Triple::RTEMS:
269 case llvm::Triple::FreeBSD:
271 case llvm::Triple::NetBSD:
273 case llvm::Triple::NaCl:
279 case llvm::Triple::mips64:
281 case llvm::Triple::Linux:
283 case llvm::Triple::RTEMS:
285 case llvm::Triple::FreeBSD:
287 case llvm::Triple::NetBSD:
289 case llvm::Triple::OpenBSD:
295 case llvm::Triple::mips64el:
297 case llvm::Triple::Linux:
299 case llvm::Triple::RTEMS:
301 case llvm::Triple::FreeBSD:
303 case llvm::Triple::NetBSD:
305 case llvm::Triple::OpenBSD:
311 case llvm::Triple::le32:
313 case llvm::Triple::NaCl:
319 case llvm::Triple::le64:
322 case llvm::Triple::ppc:
323 if (Triple.isOSDarwin())
326 case llvm::Triple::Linux:
328 case llvm::Triple::FreeBSD:
330 case llvm::Triple::NetBSD:
332 case llvm::Triple::OpenBSD:
334 case llvm::Triple::RTEMS:
340 case llvm::Triple::ppc64:
341 if (Triple.isOSDarwin())
344 case llvm::Triple::Linux:
346 case llvm::Triple::Lv2:
348 case llvm::Triple::FreeBSD:
350 case llvm::Triple::NetBSD:
356 case llvm::Triple::ppc64le:
358 case llvm::Triple::Linux:
360 case llvm::Triple::NetBSD:
366 case llvm::Triple::nvptx:
368 case llvm::Triple::nvptx64:
371 case llvm::Triple::amdgcn:
372 case llvm::Triple::r600:
375 case llvm::Triple::riscv32:
377 if (os == llvm::Triple::Linux)
380 case llvm::Triple::riscv64:
382 if (os == llvm::Triple::Linux)
386 case llvm::Triple::sparc:
388 case llvm::Triple::Linux:
390 case llvm::Triple::Solaris:
392 case llvm::Triple::NetBSD:
394 case llvm::Triple::OpenBSD:
396 case llvm::Triple::RTEMS:
403 case llvm::Triple::sparcel:
405 case llvm::Triple::Linux:
407 case llvm::Triple::NetBSD:
409 case llvm::Triple::OpenBSD:
411 case llvm::Triple::RTEMS:
417 case llvm::Triple::sparcv9:
419 case llvm::Triple::Linux:
421 case llvm::Triple::Solaris:
423 case llvm::Triple::NetBSD:
425 case llvm::Triple::OpenBSD:
427 case llvm::Triple::FreeBSD:
433 case llvm::Triple::systemz:
435 case llvm::Triple::Linux:
441 case llvm::Triple::tce:
444 case llvm::Triple::tcele:
447 case llvm::Triple::x86:
448 if (Triple.isOSDarwin())
452 case llvm::Triple::Ananas:
454 case llvm::Triple::CloudABI:
456 case llvm::Triple::Linux: {
457 switch (Triple.getEnvironment()) {
460 case llvm::Triple::Android:
464 case llvm::Triple::DragonFly:
466 case llvm::Triple::NetBSD:
468 case llvm::Triple::OpenBSD:
470 case llvm::Triple::FreeBSD:
472 case llvm::Triple::KFreeBSD:
474 case llvm::Triple::Minix:
476 case llvm::Triple::Solaris:
478 case llvm::Triple::Win32: {
479 switch (Triple.getEnvironment()) {
480 case llvm::Triple::Cygnus:
482 case llvm::Triple::GNU:
484 case llvm::Triple::Itanium:
485 case llvm::Triple::MSVC:
490 case llvm::Triple::Haiku:
492 case llvm::Triple::RTEMS:
494 case llvm::Triple::NaCl:
496 case llvm::Triple::ELFIAMCU:
502 case llvm::Triple::x86_64:
503 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
507 case llvm::Triple::Ananas:
509 case llvm::Triple::CloudABI:
511 case llvm::Triple::Linux: {
512 switch (Triple.getEnvironment()) {
515 case llvm::Triple::Android:
519 case llvm::Triple::DragonFly:
521 case llvm::Triple::NetBSD:
523 case llvm::Triple::OpenBSD:
525 case llvm::Triple::FreeBSD:
527 case llvm::Triple::Fuchsia:
529 case llvm::Triple::KFreeBSD:
531 case llvm::Triple::Solaris:
533 case llvm::Triple::Win32: {
534 switch (Triple.getEnvironment()) {
535 case llvm::Triple::Cygnus:
537 case llvm::Triple::GNU:
539 case llvm::Triple::MSVC:
544 case llvm::Triple::Haiku:
546 case llvm::Triple::NaCl:
548 case llvm::Triple::PS4:
554 case llvm::Triple::spir: {
555 if (Triple.getOS() != llvm::Triple::UnknownOS ||
556 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
560 case llvm::Triple::spir64: {
561 if (Triple.getOS() != llvm::Triple::UnknownOS ||
562 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
566 case llvm::Triple::wasm32:
567 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
568 Triple.getVendor() != llvm::Triple::UnknownVendor ||
569 Triple.getOS() != llvm::Triple::UnknownOS ||
570 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
571 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
574 case llvm::Triple::wasm64:
575 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
576 Triple.getVendor() != llvm::Triple::UnknownVendor ||
577 Triple.getOS() != llvm::Triple::UnknownOS ||
578 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
579 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
583 case llvm::Triple::renderscript32:
585 case llvm::Triple::renderscript64:
597 const std::shared_ptr<TargetOptions> &Opts) {
598 llvm::Triple Triple(Opts->Triple);
603 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
606 Target->TargetOpts = Opts;
609 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
610 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
612 Target->fillValidCPUList(ValidList);
613 if (!ValidList.empty())
614 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
619 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
620 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
625 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
626 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
632 llvm::StringMap<bool> Features;
633 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
634 Opts->FeaturesAsWritten))
638 Opts->Features.clear();
639 for (
const auto &F : Features)
640 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
643 llvm::sort(Opts->Features.begin(), Opts->Features.end());
645 if (!Target->handleTargetFeatures(Opts->Features, Diags))
648 Target->setSupportedOpenCLOpts();
649 Target->setOpenCLExtensionOpts();
650 Target->setMaxAtomicWidth();
652 if (!Target->validateTarget(Diags))
655 Target->CheckFixedPointBits();
657 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.
void addMinGWDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder)
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.
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".