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::arc:
130 case llvm::Triple::xcore:
133 case llvm::Triple::hexagon:
136 case llvm::Triple::lanai:
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:
152 case llvm::Triple::NetBSD:
154 case llvm::Triple::OpenBSD:
156 case llvm::Triple::Win32:
157 switch (Triple.getEnvironment()) {
158 case llvm::Triple::GNU:
160 case llvm::Triple::MSVC:
168 case llvm::Triple::aarch64_be:
170 case llvm::Triple::FreeBSD:
172 case llvm::Triple::Fuchsia:
174 case llvm::Triple::Linux:
176 case llvm::Triple::NetBSD:
182 case llvm::Triple::arm:
183 case llvm::Triple::thumb:
184 if (Triple.isOSBinFormatMachO())
188 case llvm::Triple::CloudABI:
190 case llvm::Triple::Linux:
192 case llvm::Triple::FreeBSD:
194 case llvm::Triple::NetBSD:
196 case llvm::Triple::OpenBSD:
198 case llvm::Triple::RTEMS:
200 case llvm::Triple::NaCl:
202 case llvm::Triple::Win32:
203 switch (Triple.getEnvironment()) {
204 case llvm::Triple::Cygnus:
206 case llvm::Triple::GNU:
208 case llvm::Triple::Itanium:
210 case llvm::Triple::MSVC:
218 case llvm::Triple::armeb:
219 case llvm::Triple::thumbeb:
220 if (Triple.isOSDarwin())
224 case llvm::Triple::Linux:
226 case llvm::Triple::FreeBSD:
228 case llvm::Triple::NetBSD:
230 case llvm::Triple::OpenBSD:
232 case llvm::Triple::RTEMS:
234 case llvm::Triple::NaCl:
240 case llvm::Triple::avr:
242 case llvm::Triple::bpfeb:
243 case llvm::Triple::bpfel:
246 case llvm::Triple::msp430:
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:
498 case llvm::Triple::Hurd:
504 case llvm::Triple::x86_64:
505 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
509 case llvm::Triple::Ananas:
511 case llvm::Triple::CloudABI:
513 case llvm::Triple::Linux: {
514 switch (Triple.getEnvironment()) {
517 case llvm::Triple::Android:
521 case llvm::Triple::DragonFly:
523 case llvm::Triple::NetBSD:
525 case llvm::Triple::OpenBSD:
527 case llvm::Triple::FreeBSD:
529 case llvm::Triple::Fuchsia:
531 case llvm::Triple::KFreeBSD:
533 case llvm::Triple::Solaris:
535 case llvm::Triple::Win32: {
536 switch (Triple.getEnvironment()) {
537 case llvm::Triple::Cygnus:
539 case llvm::Triple::GNU:
541 case llvm::Triple::MSVC:
546 case llvm::Triple::Haiku:
548 case llvm::Triple::NaCl:
550 case llvm::Triple::PS4:
556 case llvm::Triple::spir: {
557 if (Triple.getOS() != llvm::Triple::UnknownOS ||
558 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
562 case llvm::Triple::spir64: {
563 if (Triple.getOS() != llvm::Triple::UnknownOS ||
564 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
568 case llvm::Triple::wasm32:
569 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
570 Triple.getVendor() != llvm::Triple::UnknownVendor ||
571 !Triple.isOSBinFormatWasm())
573 switch (Triple.getOS()) {
574 case llvm::Triple::WASI:
576 case llvm::Triple::UnknownOS:
581 case llvm::Triple::wasm64:
582 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
583 Triple.getVendor() != llvm::Triple::UnknownVendor ||
584 !Triple.isOSBinFormatWasm())
586 switch (Triple.getOS()) {
587 case llvm::Triple::WASI:
589 case llvm::Triple::UnknownOS:
595 case llvm::Triple::renderscript32:
597 case llvm::Triple::renderscript64:
609 const std::shared_ptr<TargetOptions> &Opts) {
610 llvm::Triple Triple(Opts->Triple);
615 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
618 Target->TargetOpts = Opts;
621 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
622 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
624 Target->fillValidCPUList(ValidList);
625 if (!ValidList.empty())
626 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
631 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
632 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
637 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
638 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
644 llvm::StringMap<bool> Features;
645 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
646 Opts->FeaturesAsWritten))
650 Opts->Features.clear();
651 for (
const auto &F : Features)
652 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
655 llvm::sort(Opts->Features);
657 if (!Target->handleTargetFeatures(Opts->Features, Diags))
660 Target->setSupportedOpenCLOpts();
661 Target->setOpenCLExtensionOpts();
662 Target->setMaxAtomicWidth();
664 if (!Target->validateTarget(Diags))
667 Target->CheckFixedPointBits();
669 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".