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:
126 if (Triple.isOSDarwin())
130 case llvm::Triple::CloudABI:
132 case llvm::Triple::FreeBSD:
134 case llvm::Triple::Fuchsia:
136 case llvm::Triple::Linux:
138 case llvm::Triple::NetBSD:
140 case llvm::Triple::OpenBSD:
142 case llvm::Triple::Win32:
143 switch (Triple.getEnvironment()) {
144 case llvm::Triple::GNU:
146 case llvm::Triple::MSVC:
154 case llvm::Triple::aarch64_be:
156 case llvm::Triple::FreeBSD:
158 case llvm::Triple::Fuchsia:
160 case llvm::Triple::Linux:
162 case llvm::Triple::NetBSD:
168 case llvm::Triple::arm:
169 case llvm::Triple::thumb:
170 if (Triple.isOSBinFormatMachO())
174 case llvm::Triple::CloudABI:
176 case llvm::Triple::Linux:
178 case llvm::Triple::FreeBSD:
180 case llvm::Triple::NetBSD:
182 case llvm::Triple::OpenBSD:
184 case llvm::Triple::RTEMS:
186 case llvm::Triple::NaCl:
188 case llvm::Triple::Win32:
189 switch (Triple.getEnvironment()) {
190 case llvm::Triple::Cygnus:
192 case llvm::Triple::GNU:
194 case llvm::Triple::Itanium:
196 case llvm::Triple::MSVC:
204 case llvm::Triple::armeb:
205 case llvm::Triple::thumbeb:
206 if (Triple.isOSDarwin())
210 case llvm::Triple::Linux:
212 case llvm::Triple::FreeBSD:
214 case llvm::Triple::NetBSD:
216 case llvm::Triple::OpenBSD:
218 case llvm::Triple::RTEMS:
220 case llvm::Triple::NaCl:
226 case llvm::Triple::avr:
228 case llvm::Triple::bpfeb:
229 case llvm::Triple::bpfel:
232 case llvm::Triple::msp430:
235 case llvm::Triple::mips:
237 case llvm::Triple::Linux:
239 case llvm::Triple::RTEMS:
241 case llvm::Triple::FreeBSD:
243 case llvm::Triple::NetBSD:
249 case llvm::Triple::mipsel:
251 case llvm::Triple::Linux:
253 case llvm::Triple::RTEMS:
255 case llvm::Triple::FreeBSD:
257 case llvm::Triple::NetBSD:
259 case llvm::Triple::NaCl:
265 case llvm::Triple::mips64:
267 case llvm::Triple::Linux:
269 case llvm::Triple::RTEMS:
271 case llvm::Triple::FreeBSD:
273 case llvm::Triple::NetBSD:
275 case llvm::Triple::OpenBSD:
281 case llvm::Triple::mips64el:
283 case llvm::Triple::Linux:
285 case llvm::Triple::RTEMS:
287 case llvm::Triple::FreeBSD:
289 case llvm::Triple::NetBSD:
291 case llvm::Triple::OpenBSD:
297 case llvm::Triple::le32:
299 case llvm::Triple::NaCl:
305 case llvm::Triple::le64:
308 case llvm::Triple::ppc:
309 if (Triple.isOSDarwin())
312 case llvm::Triple::Linux:
314 case llvm::Triple::FreeBSD:
316 case llvm::Triple::NetBSD:
318 case llvm::Triple::OpenBSD:
320 case llvm::Triple::RTEMS:
322 case llvm::Triple::AIX:
328 case llvm::Triple::ppc64:
329 if (Triple.isOSDarwin())
332 case llvm::Triple::Linux:
334 case llvm::Triple::Lv2:
336 case llvm::Triple::FreeBSD:
338 case llvm::Triple::NetBSD:
340 case llvm::Triple::AIX:
346 case llvm::Triple::ppc64le:
348 case llvm::Triple::Linux:
350 case llvm::Triple::NetBSD:
356 case llvm::Triple::nvptx:
358 case llvm::Triple::nvptx64:
361 case llvm::Triple::amdgcn:
362 case llvm::Triple::r600:
365 case llvm::Triple::riscv32:
367 if (os == llvm::Triple::Linux)
370 case llvm::Triple::riscv64:
372 if (os == llvm::Triple::Linux)
376 case llvm::Triple::sparc:
378 case llvm::Triple::Linux:
380 case llvm::Triple::Solaris:
382 case llvm::Triple::NetBSD:
384 case llvm::Triple::OpenBSD:
386 case llvm::Triple::RTEMS:
393 case llvm::Triple::sparcel:
395 case llvm::Triple::Linux:
397 case llvm::Triple::NetBSD:
399 case llvm::Triple::OpenBSD:
401 case llvm::Triple::RTEMS:
407 case llvm::Triple::sparcv9:
409 case llvm::Triple::Linux:
411 case llvm::Triple::Solaris:
413 case llvm::Triple::NetBSD:
415 case llvm::Triple::OpenBSD:
417 case llvm::Triple::FreeBSD:
423 case llvm::Triple::systemz:
425 case llvm::Triple::Linux:
431 case llvm::Triple::tce:
434 case llvm::Triple::tcele:
437 case llvm::Triple::x86:
438 if (Triple.isOSDarwin())
442 case llvm::Triple::Ananas:
444 case llvm::Triple::CloudABI:
446 case llvm::Triple::Linux: {
447 switch (Triple.getEnvironment()) {
450 case llvm::Triple::Android:
454 case llvm::Triple::DragonFly:
456 case llvm::Triple::NetBSD:
458 case llvm::Triple::OpenBSD:
460 case llvm::Triple::FreeBSD:
462 case llvm::Triple::KFreeBSD:
464 case llvm::Triple::Minix:
466 case llvm::Triple::Solaris:
468 case llvm::Triple::Win32: {
469 switch (Triple.getEnvironment()) {
470 case llvm::Triple::Cygnus:
472 case llvm::Triple::GNU:
474 case llvm::Triple::Itanium:
475 case llvm::Triple::MSVC:
480 case llvm::Triple::Haiku:
482 case llvm::Triple::RTEMS:
484 case llvm::Triple::NaCl:
486 case llvm::Triple::ELFIAMCU:
488 case llvm::Triple::Hurd:
494 case llvm::Triple::x86_64:
495 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
499 case llvm::Triple::Ananas:
501 case llvm::Triple::CloudABI:
503 case llvm::Triple::Linux: {
504 switch (Triple.getEnvironment()) {
507 case llvm::Triple::Android:
511 case llvm::Triple::DragonFly:
513 case llvm::Triple::NetBSD:
515 case llvm::Triple::OpenBSD:
517 case llvm::Triple::FreeBSD:
519 case llvm::Triple::Fuchsia:
521 case llvm::Triple::KFreeBSD:
523 case llvm::Triple::Solaris:
525 case llvm::Triple::Win32: {
526 switch (Triple.getEnvironment()) {
527 case llvm::Triple::Cygnus:
529 case llvm::Triple::GNU:
531 case llvm::Triple::MSVC:
536 case llvm::Triple::Haiku:
538 case llvm::Triple::NaCl:
540 case llvm::Triple::PS4:
546 case llvm::Triple::spir: {
547 if (Triple.getOS() != llvm::Triple::UnknownOS ||
548 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
552 case llvm::Triple::spir64: {
553 if (Triple.getOS() != llvm::Triple::UnknownOS ||
554 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
558 case llvm::Triple::wasm32:
559 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
560 Triple.getVendor() != llvm::Triple::UnknownVendor ||
561 !Triple.isOSBinFormatWasm())
563 switch (Triple.getOS()) {
564 case llvm::Triple::WASI:
566 case llvm::Triple::Emscripten:
568 case llvm::Triple::UnknownOS:
573 case llvm::Triple::wasm64:
574 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
575 Triple.getVendor() != llvm::Triple::UnknownVendor ||
576 !Triple.isOSBinFormatWasm())
578 switch (Triple.getOS()) {
579 case llvm::Triple::WASI:
581 case llvm::Triple::Emscripten:
583 case llvm::Triple::UnknownOS:
589 case llvm::Triple::renderscript32:
591 case llvm::Triple::renderscript64:
603 const std::shared_ptr<TargetOptions> &Opts) {
604 llvm::Triple Triple(Opts->Triple);
609 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
612 Target->TargetOpts = Opts;
615 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
616 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
618 Target->fillValidCPUList(ValidList);
619 if (!ValidList.empty())
620 Diags.
Report(diag::note_valid_options) << llvm::join(ValidList,
", ");
625 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
626 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
631 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
632 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
638 llvm::StringMap<bool> Features;
639 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
640 Opts->FeaturesAsWritten))
644 Opts->Features.clear();
645 for (
const auto &F : Features)
646 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
649 llvm::sort(Opts->Features);
651 if (!Target->handleTargetFeatures(Opts->Features, Diags))
654 Target->setSupportedOpenCLOpts();
655 Target->setOpenCLExtensionOpts();
656 Target->setMaxAtomicWidth();
658 if (!Target->validateTarget(Diags))
661 Target->CheckFixedPointBits();
663 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.
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".