40 #include "llvm/ADT/Triple.h" 42 using namespace clang;
55 assert(MacroName[0] !=
'_' &&
"Identifier should be in the user's namespace");
80 if (Opts.MicrosoftExt)
83 Builder.
defineMacro(
"__declspec(a)",
"__attribute__((a))");
85 if (!Opts.MicrosoftExt) {
89 const char *CCs[] = {
"cdecl",
"stdcall",
"fastcall",
"thiscall",
"pascal"};
90 for (
const char *CC : CCs) {
91 std::string GCCSpelling =
"__attribute__((__";
93 GCCSpelling +=
"__))";
104 if (Triple.isArch64Bit()) {
119 llvm::Triple::OSType os = Triple.getOS();
121 switch (Triple.getArch()) {
125 case llvm::Triple::xcore:
128 case llvm::Triple::hexagon:
131 case llvm::Triple::lanai:
134 case llvm::Triple::aarch64:
135 if (Triple.isOSDarwin())
139 case llvm::Triple::CloudABI:
141 case llvm::Triple::FreeBSD:
143 case llvm::Triple::Fuchsia:
145 case llvm::Triple::Linux:
147 case llvm::Triple::NetBSD:
149 case llvm::Triple::OpenBSD:
151 case llvm::Triple::Win32:
152 switch (Triple.getEnvironment()) {
153 case llvm::Triple::GNU:
155 case llvm::Triple::MSVC:
163 case llvm::Triple::aarch64_be:
165 case llvm::Triple::FreeBSD:
167 case llvm::Triple::Fuchsia:
169 case llvm::Triple::Linux:
171 case llvm::Triple::NetBSD:
177 case llvm::Triple::arm:
178 case llvm::Triple::thumb:
179 if (Triple.isOSBinFormatMachO())
183 case llvm::Triple::CloudABI:
185 case llvm::Triple::Linux:
187 case llvm::Triple::FreeBSD:
189 case llvm::Triple::NetBSD:
191 case llvm::Triple::OpenBSD:
193 case llvm::Triple::RTEMS:
195 case llvm::Triple::NaCl:
197 case llvm::Triple::Win32:
198 switch (Triple.getEnvironment()) {
199 case llvm::Triple::Cygnus:
201 case llvm::Triple::GNU:
203 case llvm::Triple::Itanium:
205 case llvm::Triple::MSVC:
213 case llvm::Triple::armeb:
214 case llvm::Triple::thumbeb:
215 if (Triple.isOSDarwin())
219 case llvm::Triple::Linux:
221 case llvm::Triple::FreeBSD:
223 case llvm::Triple::NetBSD:
225 case llvm::Triple::OpenBSD:
227 case llvm::Triple::RTEMS:
229 case llvm::Triple::NaCl:
235 case llvm::Triple::avr:
237 case llvm::Triple::bpfeb:
238 case llvm::Triple::bpfel:
241 case llvm::Triple::msp430:
244 case llvm::Triple::nios2:
247 case llvm::Triple::mips:
249 case llvm::Triple::Linux:
251 case llvm::Triple::RTEMS:
253 case llvm::Triple::FreeBSD:
255 case llvm::Triple::NetBSD:
261 case llvm::Triple::mipsel:
263 case llvm::Triple::Linux:
265 case llvm::Triple::RTEMS:
267 case llvm::Triple::FreeBSD:
269 case llvm::Triple::NetBSD:
271 case llvm::Triple::NaCl:
277 case llvm::Triple::mips64:
279 case llvm::Triple::Linux:
281 case llvm::Triple::RTEMS:
283 case llvm::Triple::FreeBSD:
285 case llvm::Triple::NetBSD:
287 case llvm::Triple::OpenBSD:
293 case llvm::Triple::mips64el:
295 case llvm::Triple::Linux:
297 case llvm::Triple::RTEMS:
299 case llvm::Triple::FreeBSD:
301 case llvm::Triple::NetBSD:
303 case llvm::Triple::OpenBSD:
309 case llvm::Triple::le32:
311 case llvm::Triple::NaCl:
317 case llvm::Triple::le64:
320 case llvm::Triple::ppc:
321 if (Triple.isOSDarwin())
324 case llvm::Triple::Linux:
326 case llvm::Triple::FreeBSD:
328 case llvm::Triple::NetBSD:
330 case llvm::Triple::OpenBSD:
332 case llvm::Triple::RTEMS:
338 case llvm::Triple::ppc64:
339 if (Triple.isOSDarwin())
342 case llvm::Triple::Linux:
344 case llvm::Triple::Lv2:
346 case llvm::Triple::FreeBSD:
348 case llvm::Triple::NetBSD:
354 case llvm::Triple::ppc64le:
356 case llvm::Triple::Linux:
358 case llvm::Triple::NetBSD:
364 case llvm::Triple::nvptx:
366 case llvm::Triple::nvptx64:
369 case llvm::Triple::amdgcn:
370 case llvm::Triple::r600:
373 case llvm::Triple::sparc:
375 case llvm::Triple::Linux:
377 case llvm::Triple::Solaris:
379 case llvm::Triple::NetBSD:
381 case llvm::Triple::OpenBSD:
383 case llvm::Triple::RTEMS:
390 case llvm::Triple::sparcel:
392 case llvm::Triple::Linux:
394 case llvm::Triple::NetBSD:
396 case llvm::Triple::OpenBSD:
398 case llvm::Triple::RTEMS:
404 case llvm::Triple::sparcv9:
406 case llvm::Triple::Linux:
408 case llvm::Triple::Solaris:
410 case llvm::Triple::NetBSD:
412 case llvm::Triple::OpenBSD:
414 case llvm::Triple::FreeBSD:
420 case llvm::Triple::systemz:
422 case llvm::Triple::Linux:
428 case llvm::Triple::tce:
431 case llvm::Triple::tcele:
434 case llvm::Triple::x86:
435 if (Triple.isOSDarwin())
439 case llvm::Triple::Ananas:
441 case llvm::Triple::CloudABI:
443 case llvm::Triple::Linux: {
444 switch (Triple.getEnvironment()) {
447 case llvm::Triple::Android:
451 case llvm::Triple::DragonFly:
453 case llvm::Triple::NetBSD:
455 case llvm::Triple::OpenBSD:
457 case llvm::Triple::FreeBSD:
459 case llvm::Triple::KFreeBSD:
461 case llvm::Triple::Minix:
463 case llvm::Triple::Solaris:
465 case llvm::Triple::Win32: {
466 switch (Triple.getEnvironment()) {
467 case llvm::Triple::Cygnus:
469 case llvm::Triple::GNU:
471 case llvm::Triple::Itanium:
472 case llvm::Triple::MSVC:
477 case llvm::Triple::Haiku:
479 case llvm::Triple::RTEMS:
481 case llvm::Triple::NaCl:
483 case llvm::Triple::ELFIAMCU:
489 case llvm::Triple::x86_64:
490 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
494 case llvm::Triple::Ananas:
496 case llvm::Triple::CloudABI:
498 case llvm::Triple::Linux: {
499 switch (Triple.getEnvironment()) {
502 case llvm::Triple::Android:
506 case llvm::Triple::DragonFly:
508 case llvm::Triple::NetBSD:
510 case llvm::Triple::OpenBSD:
512 case llvm::Triple::FreeBSD:
514 case llvm::Triple::Fuchsia:
516 case llvm::Triple::KFreeBSD:
518 case llvm::Triple::Solaris:
520 case llvm::Triple::Win32: {
521 switch (Triple.getEnvironment()) {
522 case llvm::Triple::Cygnus:
524 case llvm::Triple::GNU:
526 case llvm::Triple::MSVC:
531 case llvm::Triple::Haiku:
533 case llvm::Triple::NaCl:
535 case llvm::Triple::PS4:
541 case llvm::Triple::spir: {
542 if (Triple.getOS() != llvm::Triple::UnknownOS ||
543 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
547 case llvm::Triple::spir64: {
548 if (Triple.getOS() != llvm::Triple::UnknownOS ||
549 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
553 case llvm::Triple::wasm32:
554 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
555 Triple.getVendor() != llvm::Triple::UnknownVendor ||
556 Triple.getOS() != llvm::Triple::UnknownOS ||
557 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
558 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
561 case llvm::Triple::wasm64:
562 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
563 Triple.getVendor() != llvm::Triple::UnknownVendor ||
564 Triple.getOS() != llvm::Triple::UnknownOS ||
565 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
566 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
570 case llvm::Triple::renderscript32:
572 case llvm::Triple::renderscript64:
584 const std::shared_ptr<TargetOptions> &Opts) {
585 llvm::Triple Triple(Opts->Triple);
588 std::unique_ptr<TargetInfo> Target(
AllocateTarget(Triple, *Opts));
590 Diags.
Report(diag::err_target_unknown_triple) << Triple.str();
593 Target->TargetOpts = Opts;
596 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
597 Diags.
Report(diag::err_target_unknown_cpu) << Opts->CPU;
602 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
603 Diags.
Report(diag::err_target_unknown_abi) << Opts->ABI;
608 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
609 Diags.
Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
615 llvm::StringMap<bool> Features;
616 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
617 Opts->FeaturesAsWritten))
621 Opts->Features.clear();
622 for (
const auto &F : Features)
623 Opts->Features.push_back((F.getValue() ?
"+" :
"-") + F.getKey().str());
625 if (!Target->handleTargetFeatures(Opts->Features, Diags))
628 Target->setSupportedOpenCLOpts();
629 Target->setOpenCLExtensionOpts();
630 Target->setMaxAtomicWidth();
632 if (!Target->validateTarget(Diags))
635 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".