10b57cec5SDimitry Andric //===--- Targets.cpp - Implement target feature support -------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements construction of a TargetInfo object from a
100b57cec5SDimitry Andric // target triple.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "Targets.h"
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "Targets/AArch64.h"
170b57cec5SDimitry Andric #include "Targets/AMDGPU.h"
180b57cec5SDimitry Andric #include "Targets/ARC.h"
190b57cec5SDimitry Andric #include "Targets/ARM.h"
200b57cec5SDimitry Andric #include "Targets/AVR.h"
210b57cec5SDimitry Andric #include "Targets/BPF.h"
2281ad6265SDimitry Andric #include "Targets/CSKY.h"
2381ad6265SDimitry Andric #include "Targets/DirectX.h"
240b57cec5SDimitry Andric #include "Targets/Hexagon.h"
250b57cec5SDimitry Andric #include "Targets/Lanai.h"
260b57cec5SDimitry Andric #include "Targets/Le64.h"
27bdd1243dSDimitry Andric #include "Targets/LoongArch.h"
28fe6060f1SDimitry Andric #include "Targets/M68k.h"
290b57cec5SDimitry Andric #include "Targets/MSP430.h"
300b57cec5SDimitry Andric #include "Targets/Mips.h"
310b57cec5SDimitry Andric #include "Targets/NVPTX.h"
320b57cec5SDimitry Andric #include "Targets/OSTargets.h"
330b57cec5SDimitry Andric #include "Targets/PNaCl.h"
340b57cec5SDimitry Andric #include "Targets/PPC.h"
350b57cec5SDimitry Andric #include "Targets/RISCV.h"
360b57cec5SDimitry Andric #include "Targets/SPIR.h"
370b57cec5SDimitry Andric #include "Targets/Sparc.h"
380b57cec5SDimitry Andric #include "Targets/SystemZ.h"
390b57cec5SDimitry Andric #include "Targets/TCE.h"
405ffd83dbSDimitry Andric #include "Targets/VE.h"
410b57cec5SDimitry Andric #include "Targets/WebAssembly.h"
420b57cec5SDimitry Andric #include "Targets/X86.h"
430b57cec5SDimitry Andric #include "Targets/XCore.h"
440b57cec5SDimitry Andric #include "clang/Basic/Diagnostic.h"
4506c3fb27SDimitry Andric #include "clang/Basic/DiagnosticFrontend.h"
460b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h"
4706c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric using namespace clang;
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric namespace clang {
520b57cec5SDimitry Andric namespace targets {
530b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
540b57cec5SDimitry Andric //  Common code shared among targets.
550b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric /// DefineStd - Define a macro name and standard variants.  For example if
580b57cec5SDimitry Andric /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
590b57cec5SDimitry Andric /// when in GNU mode.
DefineStd(MacroBuilder & Builder,StringRef MacroName,const LangOptions & Opts)600b57cec5SDimitry Andric void DefineStd(MacroBuilder &Builder, StringRef MacroName,
610b57cec5SDimitry Andric                const LangOptions &Opts) {
620b57cec5SDimitry Andric   assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
630b57cec5SDimitry Andric 
640b57cec5SDimitry Andric   // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
650b57cec5SDimitry Andric   // in the user's namespace.
660b57cec5SDimitry Andric   if (Opts.GNUMode)
670b57cec5SDimitry Andric     Builder.defineMacro(MacroName);
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric   // Define __unix.
700b57cec5SDimitry Andric   Builder.defineMacro("__" + MacroName);
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric   // Define __unix__.
730b57cec5SDimitry Andric   Builder.defineMacro("__" + MacroName + "__");
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric 
defineCPUMacros(MacroBuilder & Builder,StringRef CPUName,bool Tuning)760b57cec5SDimitry Andric void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning) {
770b57cec5SDimitry Andric   Builder.defineMacro("__" + CPUName);
780b57cec5SDimitry Andric   Builder.defineMacro("__" + CPUName + "__");
790b57cec5SDimitry Andric   if (Tuning)
800b57cec5SDimitry Andric     Builder.defineMacro("__tune_" + CPUName + "__");
810b57cec5SDimitry Andric }
820b57cec5SDimitry Andric 
addCygMingDefines(const LangOptions & Opts,MacroBuilder & Builder)830b57cec5SDimitry Andric void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
840b57cec5SDimitry Andric   // Mingw and cygwin define __declspec(a) to __attribute__((a)).  Clang
85bdd1243dSDimitry Andric   // supports __declspec natively under -fdeclspec (also enabled with
86bdd1243dSDimitry Andric   // -fms-extensions), but we define a no-op __declspec macro anyway for
87bdd1243dSDimitry Andric   // pre-processor compatibility.
88bdd1243dSDimitry Andric   if (Opts.DeclSpecKeyword)
890b57cec5SDimitry Andric     Builder.defineMacro("__declspec", "__declspec");
900b57cec5SDimitry Andric   else
910b57cec5SDimitry Andric     Builder.defineMacro("__declspec(a)", "__attribute__((a))");
920b57cec5SDimitry Andric 
930b57cec5SDimitry Andric   if (!Opts.MicrosoftExt) {
940b57cec5SDimitry Andric     // Provide macros for all the calling convention keywords.  Provide both
950b57cec5SDimitry Andric     // single and double underscore prefixed variants.  These are available on
960b57cec5SDimitry Andric     // x64 as well as x86, even though they have no effect.
970b57cec5SDimitry Andric     const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
980b57cec5SDimitry Andric     for (const char *CC : CCs) {
990b57cec5SDimitry Andric       std::string GCCSpelling = "__attribute__((__";
1000b57cec5SDimitry Andric       GCCSpelling += CC;
1010b57cec5SDimitry Andric       GCCSpelling += "__))";
1020b57cec5SDimitry Andric       Builder.defineMacro(Twine("_") + CC, GCCSpelling);
1030b57cec5SDimitry Andric       Builder.defineMacro(Twine("__") + CC, GCCSpelling);
1040b57cec5SDimitry Andric     }
1050b57cec5SDimitry Andric   }
1060b57cec5SDimitry Andric }
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
1090b57cec5SDimitry Andric // Driver code
1100b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
1110b57cec5SDimitry Andric 
AllocateTarget(const llvm::Triple & Triple,const TargetOptions & Opts)11206c3fb27SDimitry Andric std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
1130b57cec5SDimitry Andric                                            const TargetOptions &Opts) {
1140b57cec5SDimitry Andric   llvm::Triple::OSType os = Triple.getOS();
1150b57cec5SDimitry Andric 
1160b57cec5SDimitry Andric   switch (Triple.getArch()) {
1170b57cec5SDimitry Andric   default:
1180b57cec5SDimitry Andric     return nullptr;
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric   case llvm::Triple::arc:
12106c3fb27SDimitry Andric     return std::make_unique<ARCTargetInfo>(Triple, Opts);
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric   case llvm::Triple::xcore:
12406c3fb27SDimitry Andric     return std::make_unique<XCoreTargetInfo>(Triple, Opts);
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric   case llvm::Triple::hexagon:
1275ffd83dbSDimitry Andric     if (os == llvm::Triple::Linux &&
1285ffd83dbSDimitry Andric         Triple.getEnvironment() == llvm::Triple::Musl)
12906c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<HexagonTargetInfo>>(Triple, Opts);
13006c3fb27SDimitry Andric     return std::make_unique<HexagonTargetInfo>(Triple, Opts);
1310b57cec5SDimitry Andric 
1320b57cec5SDimitry Andric   case llvm::Triple::lanai:
13306c3fb27SDimitry Andric     return std::make_unique<LanaiTargetInfo>(Triple, Opts);
1340b57cec5SDimitry Andric 
135480093f4SDimitry Andric   case llvm::Triple::aarch64_32:
136480093f4SDimitry Andric     if (Triple.isOSDarwin())
13706c3fb27SDimitry Andric       return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
138480093f4SDimitry Andric 
139480093f4SDimitry Andric     return nullptr;
1400b57cec5SDimitry Andric   case llvm::Triple::aarch64:
1410b57cec5SDimitry Andric     if (Triple.isOSDarwin())
14206c3fb27SDimitry Andric       return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric     switch (os) {
1450b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
14606c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<AArch64leTargetInfo>>(Triple,
14706c3fb27SDimitry Andric                                                                       Opts);
1480b57cec5SDimitry Andric     case llvm::Triple::Fuchsia:
14906c3fb27SDimitry Andric       return std::make_unique<FuchsiaTargetInfo<AArch64leTargetInfo>>(Triple,
15006c3fb27SDimitry Andric                                                                       Opts);
1515f757f3fSDimitry Andric     case llvm::Triple::Haiku:
1525f757f3fSDimitry Andric       return std::make_unique<HaikuTargetInfo<AArch64leTargetInfo>>(Triple,
1535f757f3fSDimitry Andric                                                                     Opts);
1540b57cec5SDimitry Andric     case llvm::Triple::Linux:
15506c3fb27SDimitry Andric       switch (Triple.getEnvironment()) {
15606c3fb27SDimitry Andric       default:
15706c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<AArch64leTargetInfo>>(Triple,
15806c3fb27SDimitry Andric                                                                       Opts);
15906c3fb27SDimitry Andric       case llvm::Triple::OpenHOS:
16006c3fb27SDimitry Andric         return std::make_unique<OHOSTargetInfo<AArch64leTargetInfo>>(Triple,
16106c3fb27SDimitry Andric                                                                      Opts);
16206c3fb27SDimitry Andric       }
1630b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
16406c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple,
16506c3fb27SDimitry Andric                                                                      Opts);
1660b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
16706c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<AArch64leTargetInfo>>(Triple,
16806c3fb27SDimitry Andric                                                                       Opts);
1690b57cec5SDimitry Andric     case llvm::Triple::Win32:
1700b57cec5SDimitry Andric       switch (Triple.getEnvironment()) {
1710b57cec5SDimitry Andric       case llvm::Triple::GNU:
17206c3fb27SDimitry Andric         return std::make_unique<MinGWARM64TargetInfo>(Triple, Opts);
1730b57cec5SDimitry Andric       case llvm::Triple::MSVC:
1740b57cec5SDimitry Andric       default: // Assume MSVC for unknown environments
17506c3fb27SDimitry Andric         return std::make_unique<MicrosoftARM64TargetInfo>(Triple, Opts);
1760b57cec5SDimitry Andric       }
1770b57cec5SDimitry Andric     default:
17806c3fb27SDimitry Andric       return std::make_unique<AArch64leTargetInfo>(Triple, Opts);
1790b57cec5SDimitry Andric     }
1800b57cec5SDimitry Andric 
1810b57cec5SDimitry Andric   case llvm::Triple::aarch64_be:
1820b57cec5SDimitry Andric     switch (os) {
1830b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
18406c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<AArch64beTargetInfo>>(Triple,
18506c3fb27SDimitry Andric                                                                       Opts);
1860b57cec5SDimitry Andric     case llvm::Triple::Fuchsia:
18706c3fb27SDimitry Andric       return std::make_unique<FuchsiaTargetInfo<AArch64beTargetInfo>>(Triple,
18806c3fb27SDimitry Andric                                                                       Opts);
1890b57cec5SDimitry Andric     case llvm::Triple::Linux:
19006c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<AArch64beTargetInfo>>(Triple,
19106c3fb27SDimitry Andric                                                                     Opts);
1920b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
19306c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<AArch64beTargetInfo>>(Triple,
19406c3fb27SDimitry Andric                                                                      Opts);
1950b57cec5SDimitry Andric     default:
19606c3fb27SDimitry Andric       return std::make_unique<AArch64beTargetInfo>(Triple, Opts);
1970b57cec5SDimitry Andric     }
1980b57cec5SDimitry Andric 
1990b57cec5SDimitry Andric   case llvm::Triple::arm:
2000b57cec5SDimitry Andric   case llvm::Triple::thumb:
2010b57cec5SDimitry Andric     if (Triple.isOSBinFormatMachO())
20206c3fb27SDimitry Andric       return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
2030b57cec5SDimitry Andric 
2040b57cec5SDimitry Andric     switch (os) {
2050b57cec5SDimitry Andric     case llvm::Triple::Linux:
20606c3fb27SDimitry Andric       switch (Triple.getEnvironment()) {
20706c3fb27SDimitry Andric       default:
20806c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<ARMleTargetInfo>>(Triple, Opts);
20906c3fb27SDimitry Andric       case llvm::Triple::OpenHOS:
21006c3fb27SDimitry Andric         return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
21106c3fb27SDimitry Andric       }
21206c3fb27SDimitry Andric     case llvm::Triple::LiteOS:
21306c3fb27SDimitry Andric       return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2140b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
21506c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2160b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
21706c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2180b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
21906c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2200b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
22106c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2225f757f3fSDimitry Andric     case llvm::Triple::Haiku:
2235f757f3fSDimitry Andric       return std::make_unique<HaikuTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2240b57cec5SDimitry Andric     case llvm::Triple::NaCl:
22506c3fb27SDimitry Andric       return std::make_unique<NaClTargetInfo<ARMleTargetInfo>>(Triple, Opts);
2260b57cec5SDimitry Andric     case llvm::Triple::Win32:
2270b57cec5SDimitry Andric       switch (Triple.getEnvironment()) {
2280b57cec5SDimitry Andric       case llvm::Triple::Cygnus:
22906c3fb27SDimitry Andric         return std::make_unique<CygwinARMTargetInfo>(Triple, Opts);
2300b57cec5SDimitry Andric       case llvm::Triple::GNU:
23106c3fb27SDimitry Andric         return std::make_unique<MinGWARMTargetInfo>(Triple, Opts);
2320b57cec5SDimitry Andric       case llvm::Triple::Itanium:
23306c3fb27SDimitry Andric         return std::make_unique<ItaniumWindowsARMleTargetInfo>(Triple, Opts);
2340b57cec5SDimitry Andric       case llvm::Triple::MSVC:
2350b57cec5SDimitry Andric       default: // Assume MSVC for unknown environments
23606c3fb27SDimitry Andric         return std::make_unique<MicrosoftARMleTargetInfo>(Triple, Opts);
2370b57cec5SDimitry Andric       }
2380b57cec5SDimitry Andric     default:
23906c3fb27SDimitry Andric       return std::make_unique<ARMleTargetInfo>(Triple, Opts);
2400b57cec5SDimitry Andric     }
2410b57cec5SDimitry Andric 
2420b57cec5SDimitry Andric   case llvm::Triple::armeb:
2430b57cec5SDimitry Andric   case llvm::Triple::thumbeb:
2440b57cec5SDimitry Andric     if (Triple.isOSDarwin())
24506c3fb27SDimitry Andric       return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
2460b57cec5SDimitry Andric 
2470b57cec5SDimitry Andric     switch (os) {
2480b57cec5SDimitry Andric     case llvm::Triple::Linux:
24906c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
2500b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
25106c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
2520b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
25306c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
2540b57cec5SDimitry Andric     case llvm::Triple::NaCl:
25506c3fb27SDimitry Andric       return std::make_unique<NaClTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
2560b57cec5SDimitry Andric     default:
25706c3fb27SDimitry Andric       return std::make_unique<ARMbeTargetInfo>(Triple, Opts);
2580b57cec5SDimitry Andric     }
2590b57cec5SDimitry Andric 
2600b57cec5SDimitry Andric   case llvm::Triple::avr:
26106c3fb27SDimitry Andric     return std::make_unique<AVRTargetInfo>(Triple, Opts);
2620b57cec5SDimitry Andric   case llvm::Triple::bpfeb:
2630b57cec5SDimitry Andric   case llvm::Triple::bpfel:
26406c3fb27SDimitry Andric     return std::make_unique<BPFTargetInfo>(Triple, Opts);
2650b57cec5SDimitry Andric 
2660b57cec5SDimitry Andric   case llvm::Triple::msp430:
26706c3fb27SDimitry Andric     return std::make_unique<MSP430TargetInfo>(Triple, Opts);
2680b57cec5SDimitry Andric 
2690b57cec5SDimitry Andric   case llvm::Triple::mips:
2700b57cec5SDimitry Andric     switch (os) {
2710b57cec5SDimitry Andric     case llvm::Triple::Linux:
27206c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
2730b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
27406c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
2750b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
27606c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
2770b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
27806c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
2790b57cec5SDimitry Andric     default:
28006c3fb27SDimitry Andric       return std::make_unique<MipsTargetInfo>(Triple, Opts);
2810b57cec5SDimitry Andric     }
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric   case llvm::Triple::mipsel:
2840b57cec5SDimitry Andric     switch (os) {
2850b57cec5SDimitry Andric     case llvm::Triple::Linux:
28606c3fb27SDimitry Andric       switch (Triple.getEnvironment()) {
2870b57cec5SDimitry Andric       default:
28806c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
28906c3fb27SDimitry Andric       case llvm::Triple::OpenHOS:
29006c3fb27SDimitry Andric         return std::make_unique<OHOSTargetInfo<MipsTargetInfo>>(Triple, Opts);
29106c3fb27SDimitry Andric       }
29206c3fb27SDimitry Andric     case llvm::Triple::RTEMS:
29306c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
29406c3fb27SDimitry Andric     case llvm::Triple::FreeBSD:
29506c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
29606c3fb27SDimitry Andric     case llvm::Triple::NetBSD:
29706c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
29806c3fb27SDimitry Andric     case llvm::Triple::NaCl:
29906c3fb27SDimitry Andric       return std::make_unique<NaClTargetInfo<NaClMips32TargetInfo>>(Triple,
30006c3fb27SDimitry Andric                                                                     Opts);
30106c3fb27SDimitry Andric     default:
30206c3fb27SDimitry Andric       return std::make_unique<MipsTargetInfo>(Triple, Opts);
3030b57cec5SDimitry Andric     }
3040b57cec5SDimitry Andric 
3050b57cec5SDimitry Andric   case llvm::Triple::mips64:
3060b57cec5SDimitry Andric     switch (os) {
3070b57cec5SDimitry Andric     case llvm::Triple::Linux:
30806c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
3090b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
31006c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
3110b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
31206c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
3130b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
31406c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
3150b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
31606c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
3170b57cec5SDimitry Andric     default:
31806c3fb27SDimitry Andric       return std::make_unique<MipsTargetInfo>(Triple, Opts);
3190b57cec5SDimitry Andric     }
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric   case llvm::Triple::mips64el:
3220b57cec5SDimitry Andric     switch (os) {
3230b57cec5SDimitry Andric     case llvm::Triple::Linux:
32406c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);
3250b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
32606c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);
3270b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
32806c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
3290b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
33006c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
3310b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
33206c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);
3330b57cec5SDimitry Andric     default:
33406c3fb27SDimitry Andric       return std::make_unique<MipsTargetInfo>(Triple, Opts);
3350b57cec5SDimitry Andric     }
3360b57cec5SDimitry Andric 
337fe6060f1SDimitry Andric   case llvm::Triple::m68k:
338fe6060f1SDimitry Andric     switch (os) {
339fe6060f1SDimitry Andric     case llvm::Triple::Linux:
34006c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<M68kTargetInfo>>(Triple, Opts);
341fe6060f1SDimitry Andric     case llvm::Triple::NetBSD:
34206c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<M68kTargetInfo>>(Triple, Opts);
343fe6060f1SDimitry Andric     default:
34406c3fb27SDimitry Andric       return std::make_unique<M68kTargetInfo>(Triple, Opts);
345fe6060f1SDimitry Andric     }
346fe6060f1SDimitry Andric 
3470b57cec5SDimitry Andric   case llvm::Triple::le32:
3480b57cec5SDimitry Andric     switch (os) {
3490b57cec5SDimitry Andric     case llvm::Triple::NaCl:
35006c3fb27SDimitry Andric       return std::make_unique<NaClTargetInfo<PNaClTargetInfo>>(Triple, Opts);
3510b57cec5SDimitry Andric     default:
3520b57cec5SDimitry Andric       return nullptr;
3530b57cec5SDimitry Andric     }
3540b57cec5SDimitry Andric 
3550b57cec5SDimitry Andric   case llvm::Triple::le64:
35606c3fb27SDimitry Andric     return std::make_unique<Le64TargetInfo>(Triple, Opts);
3570b57cec5SDimitry Andric 
3580b57cec5SDimitry Andric   case llvm::Triple::ppc:
3590b57cec5SDimitry Andric     switch (os) {
3600b57cec5SDimitry Andric     case llvm::Triple::Linux:
36106c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
3620b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
36306c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
3640b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
36506c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
3660b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
36706c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
3680b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
36906c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<PPC32TargetInfo>>(Triple, Opts);
3700b57cec5SDimitry Andric     case llvm::Triple::AIX:
37106c3fb27SDimitry Andric       return std::make_unique<AIXPPC32TargetInfo>(Triple, Opts);
3720b57cec5SDimitry Andric     default:
37306c3fb27SDimitry Andric       return std::make_unique<PPC32TargetInfo>(Triple, Opts);
3740b57cec5SDimitry Andric     }
3750b57cec5SDimitry Andric 
376e8d8bef9SDimitry Andric   case llvm::Triple::ppcle:
377e8d8bef9SDimitry Andric     switch (os) {
378e8d8bef9SDimitry Andric     case llvm::Triple::Linux:
37906c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);
380e8d8bef9SDimitry Andric     case llvm::Triple::FreeBSD:
38106c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);
382e8d8bef9SDimitry Andric     default:
38306c3fb27SDimitry Andric       return std::make_unique<PPC32TargetInfo>(Triple, Opts);
384e8d8bef9SDimitry Andric     }
385e8d8bef9SDimitry Andric 
3860b57cec5SDimitry Andric   case llvm::Triple::ppc64:
3870b57cec5SDimitry Andric     switch (os) {
3880b57cec5SDimitry Andric     case llvm::Triple::Linux:
38906c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
3900b57cec5SDimitry Andric     case llvm::Triple::Lv2:
39106c3fb27SDimitry Andric       return std::make_unique<PS3PPUTargetInfo<PPC64TargetInfo>>(Triple, Opts);
3920b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
39306c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
3940b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
39506c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
39675b4d546SDimitry Andric     case llvm::Triple::OpenBSD:
39706c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
3980b57cec5SDimitry Andric     case llvm::Triple::AIX:
39906c3fb27SDimitry Andric       return std::make_unique<AIXPPC64TargetInfo>(Triple, Opts);
4000b57cec5SDimitry Andric     default:
40106c3fb27SDimitry Andric       return std::make_unique<PPC64TargetInfo>(Triple, Opts);
4020b57cec5SDimitry Andric     }
4030b57cec5SDimitry Andric 
4040b57cec5SDimitry Andric   case llvm::Triple::ppc64le:
4050b57cec5SDimitry Andric     switch (os) {
4060b57cec5SDimitry Andric     case llvm::Triple::Linux:
40706c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
40833fa4ac5SBrandon Bergren     case llvm::Triple::FreeBSD:
40906c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
4100b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
41106c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
41275b4d546SDimitry Andric     case llvm::Triple::OpenBSD:
41306c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);
4140b57cec5SDimitry Andric     default:
41506c3fb27SDimitry Andric       return std::make_unique<PPC64TargetInfo>(Triple, Opts);
4160b57cec5SDimitry Andric     }
4170b57cec5SDimitry Andric 
4180b57cec5SDimitry Andric   case llvm::Triple::nvptx:
41906c3fb27SDimitry Andric     return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
42006c3fb27SDimitry Andric                                              /*TargetPointerWidth=*/32);
4210b57cec5SDimitry Andric   case llvm::Triple::nvptx64:
42206c3fb27SDimitry Andric     return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
42306c3fb27SDimitry Andric                                              /*TargetPointerWidth=*/64);
4240b57cec5SDimitry Andric 
4250b57cec5SDimitry Andric   case llvm::Triple::amdgcn:
4260b57cec5SDimitry Andric   case llvm::Triple::r600:
42706c3fb27SDimitry Andric     return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);
4280b57cec5SDimitry Andric 
4290b57cec5SDimitry Andric   case llvm::Triple::riscv32:
4300b57cec5SDimitry Andric     switch (os) {
4315f757f3fSDimitry Andric     case llvm::Triple::NetBSD:
4325f757f3fSDimitry Andric       return std::make_unique<NetBSDTargetInfo<RISCV32TargetInfo>>(Triple,
43306c3fb27SDimitry Andric                                                                    Opts);
4340b57cec5SDimitry Andric     case llvm::Triple::Linux:
43506c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<RISCV32TargetInfo>>(Triple, Opts);
4360b57cec5SDimitry Andric     default:
43706c3fb27SDimitry Andric       return std::make_unique<RISCV32TargetInfo>(Triple, Opts);
4380b57cec5SDimitry Andric     }
4390b57cec5SDimitry Andric 
4400b57cec5SDimitry Andric   case llvm::Triple::riscv64:
4410b57cec5SDimitry Andric     switch (os) {
4420b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
44306c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<RISCV64TargetInfo>>(Triple,
44406c3fb27SDimitry Andric                                                                     Opts);
4455f757f3fSDimitry Andric     case llvm::Triple::NetBSD:
4465f757f3fSDimitry Andric       return std::make_unique<NetBSDTargetInfo<RISCV64TargetInfo>>(Triple,
4475f757f3fSDimitry Andric                                                                    Opts);
44875b4d546SDimitry Andric     case llvm::Triple::OpenBSD:
44906c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<RISCV64TargetInfo>>(Triple,
45006c3fb27SDimitry Andric                                                                     Opts);
451480093f4SDimitry Andric     case llvm::Triple::Fuchsia:
45206c3fb27SDimitry Andric       return std::make_unique<FuchsiaTargetInfo<RISCV64TargetInfo>>(Triple,
45306c3fb27SDimitry Andric                                                                     Opts);
4545f757f3fSDimitry Andric     case llvm::Triple::Haiku:
4555f757f3fSDimitry Andric       return std::make_unique<HaikuTargetInfo<RISCV64TargetInfo>>(Triple,
4565f757f3fSDimitry Andric                                                                   Opts);
4570b57cec5SDimitry Andric     case llvm::Triple::Linux:
45806c3fb27SDimitry Andric       switch (Triple.getEnvironment()) {
4590b57cec5SDimitry Andric       default:
46006c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<RISCV64TargetInfo>>(Triple,
46106c3fb27SDimitry Andric                                                                     Opts);
46206c3fb27SDimitry Andric       case llvm::Triple::OpenHOS:
46306c3fb27SDimitry Andric         return std::make_unique<OHOSTargetInfo<RISCV64TargetInfo>>(Triple,
46406c3fb27SDimitry Andric                                                                    Opts);
46506c3fb27SDimitry Andric       }
46606c3fb27SDimitry Andric     default:
46706c3fb27SDimitry Andric       return std::make_unique<RISCV64TargetInfo>(Triple, Opts);
4680b57cec5SDimitry Andric     }
4690b57cec5SDimitry Andric 
4700b57cec5SDimitry Andric   case llvm::Triple::sparc:
4710b57cec5SDimitry Andric     switch (os) {
4720b57cec5SDimitry Andric     case llvm::Triple::Linux:
47306c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
4740b57cec5SDimitry Andric     case llvm::Triple::Solaris:
47506c3fb27SDimitry Andric       return std::make_unique<SolarisTargetInfo<SparcV8TargetInfo>>(Triple,
47606c3fb27SDimitry Andric                                                                     Opts);
4770b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
47806c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<SparcV8TargetInfo>>(Triple,
47906c3fb27SDimitry Andric                                                                    Opts);
4800b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
48106c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<SparcV8TargetInfo>>(Triple, Opts);
4820b57cec5SDimitry Andric     default:
48306c3fb27SDimitry Andric       return std::make_unique<SparcV8TargetInfo>(Triple, Opts);
4840b57cec5SDimitry Andric     }
4850b57cec5SDimitry Andric 
4860b57cec5SDimitry Andric   case llvm::Triple::sparcel:
4870b57cec5SDimitry Andric     switch (os) {
4880b57cec5SDimitry Andric     case llvm::Triple::Linux:
48906c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<SparcV8elTargetInfo>>(Triple,
49006c3fb27SDimitry Andric                                                                     Opts);
4910b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
49206c3fb27SDimitry Andric       return std::make_unique<RTEMSTargetInfo<SparcV8elTargetInfo>>(Triple,
49306c3fb27SDimitry Andric                                                                     Opts);
4940b57cec5SDimitry Andric     default:
49506c3fb27SDimitry Andric       return std::make_unique<SparcV8elTargetInfo>(Triple, Opts);
4960b57cec5SDimitry Andric     }
4970b57cec5SDimitry Andric 
4980b57cec5SDimitry Andric   case llvm::Triple::sparcv9:
4990b57cec5SDimitry Andric     switch (os) {
5000b57cec5SDimitry Andric     case llvm::Triple::Linux:
50106c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<SparcV9TargetInfo>>(Triple, Opts);
5020b57cec5SDimitry Andric     case llvm::Triple::Solaris:
50306c3fb27SDimitry Andric       return std::make_unique<SolarisTargetInfo<SparcV9TargetInfo>>(Triple,
50406c3fb27SDimitry Andric                                                                     Opts);
5050b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
50606c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<SparcV9TargetInfo>>(Triple,
50706c3fb27SDimitry Andric                                                                    Opts);
5080b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
50906c3fb27SDimitry Andric       return std::make_unique<OpenBSDTargetInfo<SparcV9TargetInfo>>(Triple,
51006c3fb27SDimitry Andric                                                                     Opts);
5110b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
51206c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<SparcV9TargetInfo>>(Triple,
51306c3fb27SDimitry Andric                                                                     Opts);
5140b57cec5SDimitry Andric     default:
51506c3fb27SDimitry Andric       return std::make_unique<SparcV9TargetInfo>(Triple, Opts);
5160b57cec5SDimitry Andric     }
5170b57cec5SDimitry Andric 
5180b57cec5SDimitry Andric   case llvm::Triple::systemz:
5190b57cec5SDimitry Andric     switch (os) {
5200b57cec5SDimitry Andric     case llvm::Triple::Linux:
52106c3fb27SDimitry Andric       return std::make_unique<LinuxTargetInfo<SystemZTargetInfo>>(Triple, Opts);
522e8d8bef9SDimitry Andric     case llvm::Triple::ZOS:
52306c3fb27SDimitry Andric       return std::make_unique<ZOSTargetInfo<SystemZTargetInfo>>(Triple, Opts);
5240b57cec5SDimitry Andric     default:
52506c3fb27SDimitry Andric       return std::make_unique<SystemZTargetInfo>(Triple, Opts);
5260b57cec5SDimitry Andric     }
5270b57cec5SDimitry Andric 
5280b57cec5SDimitry Andric   case llvm::Triple::tce:
52906c3fb27SDimitry Andric     return std::make_unique<TCETargetInfo>(Triple, Opts);
5300b57cec5SDimitry Andric 
5310b57cec5SDimitry Andric   case llvm::Triple::tcele:
53206c3fb27SDimitry Andric     return std::make_unique<TCELETargetInfo>(Triple, Opts);
5330b57cec5SDimitry Andric 
5340b57cec5SDimitry Andric   case llvm::Triple::x86:
5350b57cec5SDimitry Andric     if (Triple.isOSDarwin())
53606c3fb27SDimitry Andric       return std::make_unique<DarwinI386TargetInfo>(Triple, Opts);
5370b57cec5SDimitry Andric 
5380b57cec5SDimitry Andric     switch (os) {
5390b57cec5SDimitry Andric     case llvm::Triple::Linux: {
5400b57cec5SDimitry Andric       switch (Triple.getEnvironment()) {
5410b57cec5SDimitry Andric       default:
54206c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<X86_32TargetInfo>>(Triple,
54306c3fb27SDimitry Andric                                                                    Opts);
5440b57cec5SDimitry Andric       case llvm::Triple::Android:
54506c3fb27SDimitry Andric         return std::make_unique<AndroidX86_32TargetInfo>(Triple, Opts);
5460b57cec5SDimitry Andric       }
5470b57cec5SDimitry Andric     }
5480b57cec5SDimitry Andric     case llvm::Triple::DragonFly:
54906c3fb27SDimitry Andric       return std::make_unique<DragonFlyBSDTargetInfo<X86_32TargetInfo>>(Triple,
55006c3fb27SDimitry Andric                                                                         Opts);
5510b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
55206c3fb27SDimitry Andric       return std::make_unique<NetBSDI386TargetInfo>(Triple, Opts);
5530b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
55406c3fb27SDimitry Andric       return std::make_unique<OpenBSDI386TargetInfo>(Triple, Opts);
5550b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
55606c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
55706c3fb27SDimitry Andric                                                                    Opts);
5585ffd83dbSDimitry Andric     case llvm::Triple::Fuchsia:
55906c3fb27SDimitry Andric       return std::make_unique<FuchsiaTargetInfo<X86_32TargetInfo>>(Triple,
56006c3fb27SDimitry Andric                                                                    Opts);
5610b57cec5SDimitry Andric     case llvm::Triple::KFreeBSD:
56206c3fb27SDimitry Andric       return std::make_unique<KFreeBSDTargetInfo<X86_32TargetInfo>>(Triple,
56306c3fb27SDimitry Andric                                                                     Opts);
5640b57cec5SDimitry Andric     case llvm::Triple::Solaris:
56506c3fb27SDimitry Andric       return std::make_unique<SolarisTargetInfo<X86_32TargetInfo>>(Triple,
56606c3fb27SDimitry Andric                                                                    Opts);
5670b57cec5SDimitry Andric     case llvm::Triple::Win32: {
5680b57cec5SDimitry Andric       switch (Triple.getEnvironment()) {
5690b57cec5SDimitry Andric       case llvm::Triple::Cygnus:
57006c3fb27SDimitry Andric         return std::make_unique<CygwinX86_32TargetInfo>(Triple, Opts);
5710b57cec5SDimitry Andric       case llvm::Triple::GNU:
57206c3fb27SDimitry Andric         return std::make_unique<MinGWX86_32TargetInfo>(Triple, Opts);
5730b57cec5SDimitry Andric       case llvm::Triple::Itanium:
5740b57cec5SDimitry Andric       case llvm::Triple::MSVC:
5750b57cec5SDimitry Andric       default: // Assume MSVC for unknown environments
57606c3fb27SDimitry Andric         return std::make_unique<MicrosoftX86_32TargetInfo>(Triple, Opts);
5770b57cec5SDimitry Andric       }
5780b57cec5SDimitry Andric     }
5790b57cec5SDimitry Andric     case llvm::Triple::Haiku:
58006c3fb27SDimitry Andric       return std::make_unique<HaikuX86_32TargetInfo>(Triple, Opts);
5810b57cec5SDimitry Andric     case llvm::Triple::RTEMS:
58206c3fb27SDimitry Andric       return std::make_unique<RTEMSX86_32TargetInfo>(Triple, Opts);
5830b57cec5SDimitry Andric     case llvm::Triple::NaCl:
58406c3fb27SDimitry Andric       return std::make_unique<NaClTargetInfo<X86_32TargetInfo>>(Triple, Opts);
5850b57cec5SDimitry Andric     case llvm::Triple::ELFIAMCU:
58606c3fb27SDimitry Andric       return std::make_unique<MCUX86_32TargetInfo>(Triple, Opts);
5870b57cec5SDimitry Andric     case llvm::Triple::Hurd:
58806c3fb27SDimitry Andric       return std::make_unique<HurdTargetInfo<X86_32TargetInfo>>(Triple, Opts);
5890b57cec5SDimitry Andric     default:
59006c3fb27SDimitry Andric       return std::make_unique<X86_32TargetInfo>(Triple, Opts);
5910b57cec5SDimitry Andric     }
5920b57cec5SDimitry Andric 
5930b57cec5SDimitry Andric   case llvm::Triple::x86_64:
5940b57cec5SDimitry Andric     if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
59506c3fb27SDimitry Andric       return std::make_unique<DarwinX86_64TargetInfo>(Triple, Opts);
5960b57cec5SDimitry Andric 
5970b57cec5SDimitry Andric     switch (os) {
5980b57cec5SDimitry Andric     case llvm::Triple::Linux: {
5990b57cec5SDimitry Andric       switch (Triple.getEnvironment()) {
6000b57cec5SDimitry Andric       default:
60106c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<X86_64TargetInfo>>(Triple,
60206c3fb27SDimitry Andric                                                                    Opts);
6030b57cec5SDimitry Andric       case llvm::Triple::Android:
60406c3fb27SDimitry Andric         return std::make_unique<AndroidX86_64TargetInfo>(Triple, Opts);
60506c3fb27SDimitry Andric       case llvm::Triple::OpenHOS:
60606c3fb27SDimitry Andric         return std::make_unique<OHOSX86_64TargetInfo>(Triple, Opts);
6070b57cec5SDimitry Andric       }
6080b57cec5SDimitry Andric     }
6090b57cec5SDimitry Andric     case llvm::Triple::DragonFly:
61006c3fb27SDimitry Andric       return std::make_unique<DragonFlyBSDTargetInfo<X86_64TargetInfo>>(Triple,
61106c3fb27SDimitry Andric                                                                         Opts);
6120b57cec5SDimitry Andric     case llvm::Triple::NetBSD:
61306c3fb27SDimitry Andric       return std::make_unique<NetBSDTargetInfo<X86_64TargetInfo>>(Triple, Opts);
6140b57cec5SDimitry Andric     case llvm::Triple::OpenBSD:
61506c3fb27SDimitry Andric       return std::make_unique<OpenBSDX86_64TargetInfo>(Triple, Opts);
6160b57cec5SDimitry Andric     case llvm::Triple::FreeBSD:
61706c3fb27SDimitry Andric       return std::make_unique<FreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
61806c3fb27SDimitry Andric                                                                    Opts);
6190b57cec5SDimitry Andric     case llvm::Triple::Fuchsia:
62006c3fb27SDimitry Andric       return std::make_unique<FuchsiaTargetInfo<X86_64TargetInfo>>(Triple,
62106c3fb27SDimitry Andric                                                                    Opts);
6220b57cec5SDimitry Andric     case llvm::Triple::KFreeBSD:
62306c3fb27SDimitry Andric       return std::make_unique<KFreeBSDTargetInfo<X86_64TargetInfo>>(Triple,
62406c3fb27SDimitry Andric                                                                     Opts);
6250b57cec5SDimitry Andric     case llvm::Triple::Solaris:
62606c3fb27SDimitry Andric       return std::make_unique<SolarisTargetInfo<X86_64TargetInfo>>(Triple,
62706c3fb27SDimitry Andric                                                                    Opts);
6280b57cec5SDimitry Andric     case llvm::Triple::Win32: {
6290b57cec5SDimitry Andric       switch (Triple.getEnvironment()) {
6300b57cec5SDimitry Andric       case llvm::Triple::Cygnus:
63106c3fb27SDimitry Andric         return std::make_unique<CygwinX86_64TargetInfo>(Triple, Opts);
6320b57cec5SDimitry Andric       case llvm::Triple::GNU:
63306c3fb27SDimitry Andric         return std::make_unique<MinGWX86_64TargetInfo>(Triple, Opts);
6340b57cec5SDimitry Andric       case llvm::Triple::MSVC:
6350b57cec5SDimitry Andric       default: // Assume MSVC for unknown environments
63606c3fb27SDimitry Andric         return std::make_unique<MicrosoftX86_64TargetInfo>(Triple, Opts);
6370b57cec5SDimitry Andric       }
6380b57cec5SDimitry Andric     }
6390b57cec5SDimitry Andric     case llvm::Triple::Haiku:
64006c3fb27SDimitry Andric       return std::make_unique<HaikuTargetInfo<X86_64TargetInfo>>(Triple, Opts);
6410b57cec5SDimitry Andric     case llvm::Triple::NaCl:
64206c3fb27SDimitry Andric       return std::make_unique<NaClTargetInfo<X86_64TargetInfo>>(Triple, Opts);
6430b57cec5SDimitry Andric     case llvm::Triple::PS4:
64406c3fb27SDimitry Andric       return std::make_unique<PS4OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
64581ad6265SDimitry Andric     case llvm::Triple::PS5:
64606c3fb27SDimitry Andric       return std::make_unique<PS5OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
6477a6dacacSDimitry Andric     case llvm::Triple::Hurd:
6487a6dacacSDimitry Andric       return std::make_unique<HurdTargetInfo<X86_64TargetInfo>>(Triple, Opts);
6490b57cec5SDimitry Andric     default:
65006c3fb27SDimitry Andric       return std::make_unique<X86_64TargetInfo>(Triple, Opts);
6510b57cec5SDimitry Andric     }
6520b57cec5SDimitry Andric 
6530b57cec5SDimitry Andric   case llvm::Triple::spir: {
654fe6060f1SDimitry Andric     if (os != llvm::Triple::UnknownOS ||
6550b57cec5SDimitry Andric         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6560b57cec5SDimitry Andric       return nullptr;
65706c3fb27SDimitry Andric     return std::make_unique<SPIR32TargetInfo>(Triple, Opts);
6580b57cec5SDimitry Andric   }
6590b57cec5SDimitry Andric   case llvm::Triple::spir64: {
660fe6060f1SDimitry Andric     if (os != llvm::Triple::UnknownOS ||
6610b57cec5SDimitry Andric         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6620b57cec5SDimitry Andric       return nullptr;
66306c3fb27SDimitry Andric     return std::make_unique<SPIR64TargetInfo>(Triple, Opts);
6640b57cec5SDimitry Andric   }
6655f757f3fSDimitry Andric   case llvm::Triple::spirv: {
6665f757f3fSDimitry Andric     return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
6675f757f3fSDimitry Andric   }
668349cc55cSDimitry Andric   case llvm::Triple::spirv32: {
669349cc55cSDimitry Andric     if (os != llvm::Triple::UnknownOS ||
670349cc55cSDimitry Andric         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
671349cc55cSDimitry Andric       return nullptr;
67206c3fb27SDimitry Andric     return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);
673349cc55cSDimitry Andric   }
674349cc55cSDimitry Andric   case llvm::Triple::spirv64: {
675349cc55cSDimitry Andric     if (os != llvm::Triple::UnknownOS ||
676349cc55cSDimitry Andric         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
677349cc55cSDimitry Andric       return nullptr;
67806c3fb27SDimitry Andric     return std::make_unique<SPIRV64TargetInfo>(Triple, Opts);
679349cc55cSDimitry Andric   }
6800b57cec5SDimitry Andric   case llvm::Triple::wasm32:
6810b57cec5SDimitry Andric     if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
6820b57cec5SDimitry Andric         Triple.getVendor() != llvm::Triple::UnknownVendor ||
6830b57cec5SDimitry Andric         !Triple.isOSBinFormatWasm())
6840b57cec5SDimitry Andric       return nullptr;
685fe6060f1SDimitry Andric     switch (os) {
6860b57cec5SDimitry Andric       case llvm::Triple::WASI:
68706c3fb27SDimitry Andric       return std::make_unique<WASITargetInfo<WebAssembly32TargetInfo>>(Triple,
68806c3fb27SDimitry Andric                                                                        Opts);
6890b57cec5SDimitry Andric       case llvm::Triple::Emscripten:
69006c3fb27SDimitry Andric       return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>(
69106c3fb27SDimitry Andric           Triple, Opts);
6920b57cec5SDimitry Andric       case llvm::Triple::UnknownOS:
69306c3fb27SDimitry Andric       return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>>(
69406c3fb27SDimitry Andric           Triple, Opts);
6950b57cec5SDimitry Andric       default:
6960b57cec5SDimitry Andric         return nullptr;
6970b57cec5SDimitry Andric     }
6980b57cec5SDimitry Andric   case llvm::Triple::wasm64:
6990b57cec5SDimitry Andric     if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
7000b57cec5SDimitry Andric         Triple.getVendor() != llvm::Triple::UnknownVendor ||
7010b57cec5SDimitry Andric         !Triple.isOSBinFormatWasm())
7020b57cec5SDimitry Andric       return nullptr;
703fe6060f1SDimitry Andric     switch (os) {
7040b57cec5SDimitry Andric       case llvm::Triple::WASI:
70506c3fb27SDimitry Andric       return std::make_unique<WASITargetInfo<WebAssembly64TargetInfo>>(Triple,
70606c3fb27SDimitry Andric                                                                        Opts);
7070b57cec5SDimitry Andric       case llvm::Triple::Emscripten:
70806c3fb27SDimitry Andric       return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>(
70906c3fb27SDimitry Andric           Triple, Opts);
7100b57cec5SDimitry Andric       case llvm::Triple::UnknownOS:
71106c3fb27SDimitry Andric       return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>>(
71206c3fb27SDimitry Andric           Triple, Opts);
7130b57cec5SDimitry Andric       default:
7140b57cec5SDimitry Andric         return nullptr;
7150b57cec5SDimitry Andric     }
7160b57cec5SDimitry Andric 
71781ad6265SDimitry Andric   case llvm::Triple::dxil:
71806c3fb27SDimitry Andric     return std::make_unique<DirectXTargetInfo>(Triple, Opts);
7190b57cec5SDimitry Andric   case llvm::Triple::renderscript32:
72006c3fb27SDimitry Andric     return std::make_unique<LinuxTargetInfo<RenderScript32TargetInfo>>(Triple,
72106c3fb27SDimitry Andric                                                                        Opts);
7220b57cec5SDimitry Andric   case llvm::Triple::renderscript64:
72306c3fb27SDimitry Andric     return std::make_unique<LinuxTargetInfo<RenderScript64TargetInfo>>(Triple,
72406c3fb27SDimitry Andric                                                                        Opts);
7255ffd83dbSDimitry Andric 
7265ffd83dbSDimitry Andric   case llvm::Triple::ve:
72706c3fb27SDimitry Andric     return std::make_unique<LinuxTargetInfo<VETargetInfo>>(Triple, Opts);
72881ad6265SDimitry Andric 
72981ad6265SDimitry Andric   case llvm::Triple::csky:
73081ad6265SDimitry Andric     switch (os) {
73181ad6265SDimitry Andric     case llvm::Triple::Linux:
73206c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<CSKYTargetInfo>>(Triple, Opts);
73381ad6265SDimitry Andric     default:
73406c3fb27SDimitry Andric         return std::make_unique<CSKYTargetInfo>(Triple, Opts);
73581ad6265SDimitry Andric     }
736bdd1243dSDimitry Andric   case llvm::Triple::loongarch32:
737bdd1243dSDimitry Andric     switch (os) {
738bdd1243dSDimitry Andric     case llvm::Triple::Linux:
73906c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
74006c3fb27SDimitry Andric                                                                         Opts);
741bdd1243dSDimitry Andric     default:
74206c3fb27SDimitry Andric         return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);
743bdd1243dSDimitry Andric     }
744bdd1243dSDimitry Andric   case llvm::Triple::loongarch64:
745bdd1243dSDimitry Andric     switch (os) {
746bdd1243dSDimitry Andric     case llvm::Triple::Linux:
74706c3fb27SDimitry Andric         return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
74806c3fb27SDimitry Andric                                                                         Opts);
749bdd1243dSDimitry Andric     default:
75006c3fb27SDimitry Andric         return std::make_unique<LoongArch64TargetInfo>(Triple, Opts);
751bdd1243dSDimitry Andric     }
7520b57cec5SDimitry Andric   }
7530b57cec5SDimitry Andric }
7540b57cec5SDimitry Andric } // namespace targets
7550b57cec5SDimitry Andric } // namespace clang
7560b57cec5SDimitry Andric 
7570b57cec5SDimitry Andric using namespace clang::targets;
7580b57cec5SDimitry Andric /// CreateTargetInfo - Return the target info object for the specified target
7590b57cec5SDimitry Andric /// options.
7600b57cec5SDimitry Andric TargetInfo *
CreateTargetInfo(DiagnosticsEngine & Diags,const std::shared_ptr<TargetOptions> & Opts)7610b57cec5SDimitry Andric TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7620b57cec5SDimitry Andric                              const std::shared_ptr<TargetOptions> &Opts) {
7630b57cec5SDimitry Andric   llvm::Triple Triple(Opts->Triple);
7640b57cec5SDimitry Andric 
7650b57cec5SDimitry Andric   // Construct the target
76606c3fb27SDimitry Andric   std::unique_ptr<TargetInfo> Target = AllocateTarget(Triple, *Opts);
7670b57cec5SDimitry Andric   if (!Target) {
7680b57cec5SDimitry Andric     Diags.Report(diag::err_target_unknown_triple) << Triple.str();
7690b57cec5SDimitry Andric     return nullptr;
7700b57cec5SDimitry Andric   }
7710b57cec5SDimitry Andric   Target->TargetOpts = Opts;
7720b57cec5SDimitry Andric 
7730b57cec5SDimitry Andric   // Set the target CPU if specified.
7740b57cec5SDimitry Andric   if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7750b57cec5SDimitry Andric     Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
7760b57cec5SDimitry Andric     SmallVector<StringRef, 32> ValidList;
7770b57cec5SDimitry Andric     Target->fillValidCPUList(ValidList);
7780b57cec5SDimitry Andric     if (!ValidList.empty())
7790b57cec5SDimitry Andric       Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");
7800b57cec5SDimitry Andric     return nullptr;
7810b57cec5SDimitry Andric   }
7820b57cec5SDimitry Andric 
783e8d8bef9SDimitry Andric   // Check the TuneCPU name if specified.
784e8d8bef9SDimitry Andric   if (!Opts->TuneCPU.empty() &&
785e8d8bef9SDimitry Andric       !Target->isValidTuneCPUName(Opts->TuneCPU)) {
786e8d8bef9SDimitry Andric     Diags.Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;
787e8d8bef9SDimitry Andric     SmallVector<StringRef, 32> ValidList;
788e8d8bef9SDimitry Andric     Target->fillValidTuneCPUList(ValidList);
789e8d8bef9SDimitry Andric     if (!ValidList.empty())
790e8d8bef9SDimitry Andric       Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");
791e8d8bef9SDimitry Andric     return nullptr;
792e8d8bef9SDimitry Andric   }
793e8d8bef9SDimitry Andric 
7940b57cec5SDimitry Andric   // Set the target ABI if specified.
7950b57cec5SDimitry Andric   if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7960b57cec5SDimitry Andric     Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
7970b57cec5SDimitry Andric     return nullptr;
7980b57cec5SDimitry Andric   }
7990b57cec5SDimitry Andric 
8000b57cec5SDimitry Andric   // Set the fp math unit.
8010b57cec5SDimitry Andric   if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8020b57cec5SDimitry Andric     Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
8030b57cec5SDimitry Andric     return nullptr;
8040b57cec5SDimitry Andric   }
8050b57cec5SDimitry Andric 
8060b57cec5SDimitry Andric   // Compute the default target features, we need the target to handle this
8070b57cec5SDimitry Andric   // because features may have dependencies on one another.
80806c3fb27SDimitry Andric   llvm::erase_if(Opts->FeaturesAsWritten, [&](StringRef Name) {
80906c3fb27SDimitry Andric     if (Target->isReadOnlyFeature(Name.substr(1))) {
81006c3fb27SDimitry Andric       Diags.Report(diag::warn_fe_backend_readonly_feature_flag) << Name;
81106c3fb27SDimitry Andric       return true;
81206c3fb27SDimitry Andric     }
81306c3fb27SDimitry Andric     return false;
81406c3fb27SDimitry Andric   });
81575b4d546SDimitry Andric   if (!Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,
8160b57cec5SDimitry Andric                               Opts->FeaturesAsWritten))
8170b57cec5SDimitry Andric     return nullptr;
8180b57cec5SDimitry Andric 
8190b57cec5SDimitry Andric   // Add the features to the compile options.
8200b57cec5SDimitry Andric   Opts->Features.clear();
82175b4d546SDimitry Andric   for (const auto &F : Opts->FeatureMap)
8220b57cec5SDimitry Andric     Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8230b57cec5SDimitry Andric   // Sort here, so we handle the features in a predictable order. (This matters
8240b57cec5SDimitry Andric   // when we're dealing with features that overlap.)
8250b57cec5SDimitry Andric   llvm::sort(Opts->Features);
8260b57cec5SDimitry Andric 
8270b57cec5SDimitry Andric   if (!Target->handleTargetFeatures(Opts->Features, Diags))
8280b57cec5SDimitry Andric     return nullptr;
8290b57cec5SDimitry Andric 
8300b57cec5SDimitry Andric   Target->setSupportedOpenCLOpts();
831e8d8bef9SDimitry Andric   Target->setCommandLineOpenCLOpts();
8320b57cec5SDimitry Andric   Target->setMaxAtomicWidth();
8330b57cec5SDimitry Andric 
83481ad6265SDimitry Andric   if (!Opts->DarwinTargetVariantTriple.empty())
83581ad6265SDimitry Andric     Target->DarwinTargetVariantTriple =
83681ad6265SDimitry Andric         llvm::Triple(Opts->DarwinTargetVariantTriple);
83781ad6265SDimitry Andric 
8380b57cec5SDimitry Andric   if (!Target->validateTarget(Diags))
8390b57cec5SDimitry Andric     return nullptr;
8400b57cec5SDimitry Andric 
8410b57cec5SDimitry Andric   Target->CheckFixedPointBits();
8420b57cec5SDimitry Andric 
8430b57cec5SDimitry Andric   return Target.release();
8440b57cec5SDimitry Andric }
845fe6060f1SDimitry Andric /// validateOpenCLTarget  - Check that OpenCL target has valid
846fe6060f1SDimitry Andric /// options setting based on OpenCL version.
validateOpenCLTarget(const LangOptions & Opts,DiagnosticsEngine & Diags) const847fe6060f1SDimitry Andric bool TargetInfo::validateOpenCLTarget(const LangOptions &Opts,
848fe6060f1SDimitry Andric                                       DiagnosticsEngine &Diags) const {
849fe6060f1SDimitry Andric   const llvm::StringMap<bool> &OpenCLFeaturesMap = getSupportedOpenCLOpts();
850e8d8bef9SDimitry Andric 
851fe6060f1SDimitry Andric   auto diagnoseNotSupportedCore = [&](llvm::StringRef Name, auto... OptArgs) {
852fe6060f1SDimitry Andric     if (OpenCLOptions::isOpenCLOptionCoreIn(Opts, OptArgs...) &&
853fe6060f1SDimitry Andric         !hasFeatureEnabled(OpenCLFeaturesMap, Name))
854fe6060f1SDimitry Andric       Diags.Report(diag::warn_opencl_unsupported_core_feature)
855fe6060f1SDimitry Andric           << Name << Opts.OpenCLCPlusPlus
856fe6060f1SDimitry Andric           << Opts.getOpenCLVersionTuple().getAsString();
857e8d8bef9SDimitry Andric   };
858fe6060f1SDimitry Andric #define OPENCL_GENERIC_EXTENSION(Ext, ...)                                     \
859fe6060f1SDimitry Andric   diagnoseNotSupportedCore(#Ext, __VA_ARGS__);
860e8d8bef9SDimitry Andric #include "clang/Basic/OpenCLExtensions.def"
861e8d8bef9SDimitry Andric 
862fe6060f1SDimitry Andric   // Validate that feature macros are set properly for OpenCL C 3.0.
863fe6060f1SDimitry Andric   // In other cases assume that target is always valid.
864349cc55cSDimitry Andric   if (Opts.getOpenCLCompatibleVersion() < 300)
865fe6060f1SDimitry Andric     return true;
866fe6060f1SDimitry Andric 
867fe6060f1SDimitry Andric   return OpenCLOptions::diagnoseUnsupportedFeatureDependencies(*this, Diags) &&
868fe6060f1SDimitry Andric          OpenCLOptions::diagnoseFeatureExtensionDifferences(*this, Diags);
869e8d8bef9SDimitry Andric }
870