Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets.cpp
35234 views
//===--- Targets.cpp - Implement target feature support -------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements construction of a TargetInfo object from a9// target triple.10//11//===----------------------------------------------------------------------===//1213#include "Targets.h"1415#include "Targets/AArch64.h"16#include "Targets/AMDGPU.h"17#include "Targets/ARC.h"18#include "Targets/ARM.h"19#include "Targets/AVR.h"20#include "Targets/BPF.h"21#include "Targets/CSKY.h"22#include "Targets/DirectX.h"23#include "Targets/Hexagon.h"24#include "Targets/Lanai.h"25#include "Targets/Le64.h"26#include "Targets/LoongArch.h"27#include "Targets/M68k.h"28#include "Targets/MSP430.h"29#include "Targets/Mips.h"30#include "Targets/NVPTX.h"31#include "Targets/OSTargets.h"32#include "Targets/PNaCl.h"33#include "Targets/PPC.h"34#include "Targets/RISCV.h"35#include "Targets/SPIR.h"36#include "Targets/Sparc.h"37#include "Targets/SystemZ.h"38#include "Targets/TCE.h"39#include "Targets/VE.h"40#include "Targets/WebAssembly.h"41#include "Targets/X86.h"42#include "Targets/XCore.h"43#include "clang/Basic/Diagnostic.h"44#include "clang/Basic/DiagnosticFrontend.h"45#include "llvm/ADT/StringExtras.h"46#include "llvm/TargetParser/Triple.h"4748using namespace clang;4950namespace clang {51namespace targets {52//===----------------------------------------------------------------------===//53// Common code shared among targets.54//===----------------------------------------------------------------------===//5556/// DefineStd - Define a macro name and standard variants. For example if57/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"58/// when in GNU mode.59void DefineStd(MacroBuilder &Builder, StringRef MacroName,60const LangOptions &Opts) {61assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");6263// If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier64// in the user's namespace.65if (Opts.GNUMode)66Builder.defineMacro(MacroName);6768// Define __unix.69Builder.defineMacro("__" + MacroName);7071// Define __unix__.72Builder.defineMacro("__" + MacroName + "__");73}7475void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning) {76Builder.defineMacro("__" + CPUName);77Builder.defineMacro("__" + CPUName + "__");78if (Tuning)79Builder.defineMacro("__tune_" + CPUName + "__");80}8182void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {83// Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang84// supports __declspec natively under -fdeclspec (also enabled with85// -fms-extensions), but we define a no-op __declspec macro anyway for86// pre-processor compatibility.87if (Opts.DeclSpecKeyword)88Builder.defineMacro("__declspec", "__declspec");89else90Builder.defineMacro("__declspec(a)", "__attribute__((a))");9192if (!Opts.MicrosoftExt) {93// Provide macros for all the calling convention keywords. Provide both94// single and double underscore prefixed variants. These are available on95// x64 as well as x86, even though they have no effect.96const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};97for (const char *CC : CCs) {98std::string GCCSpelling = "__attribute__((__";99GCCSpelling += CC;100GCCSpelling += "__))";101Builder.defineMacro(Twine("_") + CC, GCCSpelling);102Builder.defineMacro(Twine("__") + CC, GCCSpelling);103}104}105}106107//===----------------------------------------------------------------------===//108// Driver code109//===----------------------------------------------------------------------===//110111std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,112const TargetOptions &Opts) {113llvm::Triple::OSType os = Triple.getOS();114115switch (Triple.getArch()) {116default:117return nullptr;118119case llvm::Triple::arc:120return std::make_unique<ARCTargetInfo>(Triple, Opts);121122case llvm::Triple::xcore:123return std::make_unique<XCoreTargetInfo>(Triple, Opts);124125case llvm::Triple::hexagon:126if (os == llvm::Triple::Linux &&127Triple.getEnvironment() == llvm::Triple::Musl)128return std::make_unique<LinuxTargetInfo<HexagonTargetInfo>>(Triple, Opts);129return std::make_unique<HexagonTargetInfo>(Triple, Opts);130131case llvm::Triple::lanai:132return std::make_unique<LanaiTargetInfo>(Triple, Opts);133134case llvm::Triple::aarch64_32:135if (Triple.isOSDarwin())136return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);137138return nullptr;139case llvm::Triple::aarch64:140if (Triple.isOSDarwin())141return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);142143switch (os) {144case llvm::Triple::FreeBSD:145return std::make_unique<FreeBSDTargetInfo<AArch64leTargetInfo>>(Triple,146Opts);147case llvm::Triple::Fuchsia:148return std::make_unique<FuchsiaTargetInfo<AArch64leTargetInfo>>(Triple,149Opts);150case llvm::Triple::Haiku:151return std::make_unique<HaikuTargetInfo<AArch64leTargetInfo>>(Triple,152Opts);153case llvm::Triple::Linux:154switch (Triple.getEnvironment()) {155default:156return std::make_unique<LinuxTargetInfo<AArch64leTargetInfo>>(Triple,157Opts);158case llvm::Triple::OpenHOS:159return std::make_unique<OHOSTargetInfo<AArch64leTargetInfo>>(Triple,160Opts);161}162case llvm::Triple::NetBSD:163return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple,164Opts);165case llvm::Triple::OpenBSD:166return std::make_unique<OpenBSDTargetInfo<AArch64leTargetInfo>>(Triple,167Opts);168case llvm::Triple::Win32:169switch (Triple.getEnvironment()) {170case llvm::Triple::GNU:171return std::make_unique<MinGWARM64TargetInfo>(Triple, Opts);172case llvm::Triple::MSVC:173default: // Assume MSVC for unknown environments174return std::make_unique<MicrosoftARM64TargetInfo>(Triple, Opts);175}176default:177return std::make_unique<AArch64leTargetInfo>(Triple, Opts);178}179180case llvm::Triple::aarch64_be:181switch (os) {182case llvm::Triple::FreeBSD:183return std::make_unique<FreeBSDTargetInfo<AArch64beTargetInfo>>(Triple,184Opts);185case llvm::Triple::Fuchsia:186return std::make_unique<FuchsiaTargetInfo<AArch64beTargetInfo>>(Triple,187Opts);188case llvm::Triple::Linux:189return std::make_unique<LinuxTargetInfo<AArch64beTargetInfo>>(Triple,190Opts);191case llvm::Triple::NetBSD:192return std::make_unique<NetBSDTargetInfo<AArch64beTargetInfo>>(Triple,193Opts);194default:195return std::make_unique<AArch64beTargetInfo>(Triple, Opts);196}197198case llvm::Triple::arm:199case llvm::Triple::thumb:200if (Triple.isOSBinFormatMachO())201return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);202203switch (os) {204case llvm::Triple::Linux:205switch (Triple.getEnvironment()) {206default:207return std::make_unique<LinuxTargetInfo<ARMleTargetInfo>>(Triple, Opts);208case llvm::Triple::OpenHOS:209return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);210}211case llvm::Triple::LiteOS:212return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);213case llvm::Triple::FreeBSD:214return std::make_unique<FreeBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);215case llvm::Triple::NetBSD:216return std::make_unique<NetBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);217case llvm::Triple::OpenBSD:218return std::make_unique<OpenBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);219case llvm::Triple::RTEMS:220return std::make_unique<RTEMSTargetInfo<ARMleTargetInfo>>(Triple, Opts);221case llvm::Triple::Haiku:222return std::make_unique<HaikuTargetInfo<ARMleTargetInfo>>(Triple, Opts);223case llvm::Triple::NaCl:224return std::make_unique<NaClTargetInfo<ARMleTargetInfo>>(Triple, Opts);225case llvm::Triple::Win32:226switch (Triple.getEnvironment()) {227case llvm::Triple::Cygnus:228return std::make_unique<CygwinARMTargetInfo>(Triple, Opts);229case llvm::Triple::GNU:230return std::make_unique<MinGWARMTargetInfo>(Triple, Opts);231case llvm::Triple::Itanium:232return std::make_unique<ItaniumWindowsARMleTargetInfo>(Triple, Opts);233case llvm::Triple::MSVC:234default: // Assume MSVC for unknown environments235return std::make_unique<MicrosoftARMleTargetInfo>(Triple, Opts);236}237default:238return std::make_unique<ARMleTargetInfo>(Triple, Opts);239}240241case llvm::Triple::armeb:242case llvm::Triple::thumbeb:243if (Triple.isOSDarwin())244return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);245246switch (os) {247case llvm::Triple::Linux:248return std::make_unique<LinuxTargetInfo<ARMbeTargetInfo>>(Triple, Opts);249case llvm::Triple::NetBSD:250return std::make_unique<NetBSDTargetInfo<ARMbeTargetInfo>>(Triple, Opts);251case llvm::Triple::RTEMS:252return std::make_unique<RTEMSTargetInfo<ARMbeTargetInfo>>(Triple, Opts);253case llvm::Triple::NaCl:254return std::make_unique<NaClTargetInfo<ARMbeTargetInfo>>(Triple, Opts);255default:256return std::make_unique<ARMbeTargetInfo>(Triple, Opts);257}258259case llvm::Triple::avr:260return std::make_unique<AVRTargetInfo>(Triple, Opts);261case llvm::Triple::bpfeb:262case llvm::Triple::bpfel:263return std::make_unique<BPFTargetInfo>(Triple, Opts);264265case llvm::Triple::msp430:266return std::make_unique<MSP430TargetInfo>(Triple, Opts);267268case llvm::Triple::mips:269switch (os) {270case llvm::Triple::Linux:271return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);272case llvm::Triple::RTEMS:273return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);274case llvm::Triple::FreeBSD:275return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);276case llvm::Triple::NetBSD:277return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);278default:279return std::make_unique<MipsTargetInfo>(Triple, Opts);280}281282case llvm::Triple::mipsel:283switch (os) {284case llvm::Triple::Linux:285switch (Triple.getEnvironment()) {286default:287return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);288case llvm::Triple::OpenHOS:289return std::make_unique<OHOSTargetInfo<MipsTargetInfo>>(Triple, Opts);290}291case llvm::Triple::RTEMS:292return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);293case llvm::Triple::FreeBSD:294return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);295case llvm::Triple::NetBSD:296return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);297case llvm::Triple::NaCl:298return std::make_unique<NaClTargetInfo<NaClMips32TargetInfo>>(Triple,299Opts);300default:301return std::make_unique<MipsTargetInfo>(Triple, Opts);302}303304case llvm::Triple::mips64:305switch (os) {306case llvm::Triple::Linux:307return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);308case llvm::Triple::RTEMS:309return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);310case llvm::Triple::FreeBSD:311return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);312case llvm::Triple::NetBSD:313return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);314case llvm::Triple::OpenBSD:315return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);316default:317return std::make_unique<MipsTargetInfo>(Triple, Opts);318}319320case llvm::Triple::mips64el:321switch (os) {322case llvm::Triple::Linux:323return std::make_unique<LinuxTargetInfo<MipsTargetInfo>>(Triple, Opts);324case llvm::Triple::RTEMS:325return std::make_unique<RTEMSTargetInfo<MipsTargetInfo>>(Triple, Opts);326case llvm::Triple::FreeBSD:327return std::make_unique<FreeBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);328case llvm::Triple::NetBSD:329return std::make_unique<NetBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);330case llvm::Triple::OpenBSD:331return std::make_unique<OpenBSDTargetInfo<MipsTargetInfo>>(Triple, Opts);332default:333return std::make_unique<MipsTargetInfo>(Triple, Opts);334}335336case llvm::Triple::m68k:337switch (os) {338case llvm::Triple::Linux:339return std::make_unique<LinuxTargetInfo<M68kTargetInfo>>(Triple, Opts);340case llvm::Triple::NetBSD:341return std::make_unique<NetBSDTargetInfo<M68kTargetInfo>>(Triple, Opts);342default:343return std::make_unique<M68kTargetInfo>(Triple, Opts);344}345346case llvm::Triple::le32:347switch (os) {348case llvm::Triple::NaCl:349return std::make_unique<NaClTargetInfo<PNaClTargetInfo>>(Triple, Opts);350default:351return nullptr;352}353354case llvm::Triple::le64:355return std::make_unique<Le64TargetInfo>(Triple, Opts);356357case llvm::Triple::ppc:358switch (os) {359case llvm::Triple::Linux:360return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);361case llvm::Triple::FreeBSD:362return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);363case llvm::Triple::NetBSD:364return std::make_unique<NetBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);365case llvm::Triple::OpenBSD:366return std::make_unique<OpenBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);367case llvm::Triple::RTEMS:368return std::make_unique<RTEMSTargetInfo<PPC32TargetInfo>>(Triple, Opts);369case llvm::Triple::AIX:370return std::make_unique<AIXPPC32TargetInfo>(Triple, Opts);371default:372return std::make_unique<PPC32TargetInfo>(Triple, Opts);373}374375case llvm::Triple::ppcle:376switch (os) {377case llvm::Triple::Linux:378return std::make_unique<LinuxTargetInfo<PPC32TargetInfo>>(Triple, Opts);379case llvm::Triple::FreeBSD:380return std::make_unique<FreeBSDTargetInfo<PPC32TargetInfo>>(Triple, Opts);381default:382return std::make_unique<PPC32TargetInfo>(Triple, Opts);383}384385case llvm::Triple::ppc64:386switch (os) {387case llvm::Triple::Linux:388return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);389case llvm::Triple::Lv2:390return std::make_unique<PS3PPUTargetInfo<PPC64TargetInfo>>(Triple, Opts);391case llvm::Triple::FreeBSD:392return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);393case llvm::Triple::NetBSD:394return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);395case llvm::Triple::OpenBSD:396return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);397case llvm::Triple::AIX:398return std::make_unique<AIXPPC64TargetInfo>(Triple, Opts);399default:400return std::make_unique<PPC64TargetInfo>(Triple, Opts);401}402403case llvm::Triple::ppc64le:404switch (os) {405case llvm::Triple::Linux:406return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);407case llvm::Triple::FreeBSD:408return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);409case llvm::Triple::NetBSD:410return std::make_unique<NetBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);411case llvm::Triple::OpenBSD:412return std::make_unique<OpenBSDTargetInfo<PPC64TargetInfo>>(Triple, Opts);413default:414return std::make_unique<PPC64TargetInfo>(Triple, Opts);415}416417case llvm::Triple::nvptx:418return std::make_unique<NVPTXTargetInfo>(Triple, Opts,419/*TargetPointerWidth=*/32);420case llvm::Triple::nvptx64:421return std::make_unique<NVPTXTargetInfo>(Triple, Opts,422/*TargetPointerWidth=*/64);423424case llvm::Triple::amdgcn:425case llvm::Triple::r600:426return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);427428case llvm::Triple::riscv32:429switch (os) {430case llvm::Triple::NetBSD:431return std::make_unique<NetBSDTargetInfo<RISCV32TargetInfo>>(Triple,432Opts);433case llvm::Triple::Linux:434return std::make_unique<LinuxTargetInfo<RISCV32TargetInfo>>(Triple, Opts);435default:436return std::make_unique<RISCV32TargetInfo>(Triple, Opts);437}438439case llvm::Triple::riscv64:440switch (os) {441case llvm::Triple::FreeBSD:442return std::make_unique<FreeBSDTargetInfo<RISCV64TargetInfo>>(Triple,443Opts);444case llvm::Triple::NetBSD:445return std::make_unique<NetBSDTargetInfo<RISCV64TargetInfo>>(Triple,446Opts);447case llvm::Triple::OpenBSD:448return std::make_unique<OpenBSDTargetInfo<RISCV64TargetInfo>>(Triple,449Opts);450case llvm::Triple::Fuchsia:451return std::make_unique<FuchsiaTargetInfo<RISCV64TargetInfo>>(Triple,452Opts);453case llvm::Triple::Haiku:454return std::make_unique<HaikuTargetInfo<RISCV64TargetInfo>>(Triple,455Opts);456case llvm::Triple::Linux:457switch (Triple.getEnvironment()) {458default:459return std::make_unique<LinuxTargetInfo<RISCV64TargetInfo>>(Triple,460Opts);461case llvm::Triple::OpenHOS:462return std::make_unique<OHOSTargetInfo<RISCV64TargetInfo>>(Triple,463Opts);464}465default:466return std::make_unique<RISCV64TargetInfo>(Triple, Opts);467}468469case llvm::Triple::sparc:470switch (os) {471case llvm::Triple::Linux:472return std::make_unique<LinuxTargetInfo<SparcV8TargetInfo>>(Triple, Opts);473case llvm::Triple::Solaris:474return std::make_unique<SolarisTargetInfo<SparcV8TargetInfo>>(Triple,475Opts);476case llvm::Triple::NetBSD:477return std::make_unique<NetBSDTargetInfo<SparcV8TargetInfo>>(Triple,478Opts);479case llvm::Triple::RTEMS:480return std::make_unique<RTEMSTargetInfo<SparcV8TargetInfo>>(Triple, Opts);481default:482return std::make_unique<SparcV8TargetInfo>(Triple, Opts);483}484485case llvm::Triple::sparcel:486switch (os) {487case llvm::Triple::Linux:488return std::make_unique<LinuxTargetInfo<SparcV8elTargetInfo>>(Triple,489Opts);490case llvm::Triple::RTEMS:491return std::make_unique<RTEMSTargetInfo<SparcV8elTargetInfo>>(Triple,492Opts);493default:494return std::make_unique<SparcV8elTargetInfo>(Triple, Opts);495}496497case llvm::Triple::sparcv9:498switch (os) {499case llvm::Triple::Linux:500return std::make_unique<LinuxTargetInfo<SparcV9TargetInfo>>(Triple, Opts);501case llvm::Triple::Solaris:502return std::make_unique<SolarisTargetInfo<SparcV9TargetInfo>>(Triple,503Opts);504case llvm::Triple::NetBSD:505return std::make_unique<NetBSDTargetInfo<SparcV9TargetInfo>>(Triple,506Opts);507case llvm::Triple::OpenBSD:508return std::make_unique<OpenBSDTargetInfo<SparcV9TargetInfo>>(Triple,509Opts);510case llvm::Triple::FreeBSD:511return std::make_unique<FreeBSDTargetInfo<SparcV9TargetInfo>>(Triple,512Opts);513default:514return std::make_unique<SparcV9TargetInfo>(Triple, Opts);515}516517case llvm::Triple::systemz:518switch (os) {519case llvm::Triple::Linux:520return std::make_unique<LinuxTargetInfo<SystemZTargetInfo>>(Triple, Opts);521case llvm::Triple::ZOS:522return std::make_unique<ZOSTargetInfo<SystemZTargetInfo>>(Triple, Opts);523default:524return std::make_unique<SystemZTargetInfo>(Triple, Opts);525}526527case llvm::Triple::tce:528return std::make_unique<TCETargetInfo>(Triple, Opts);529530case llvm::Triple::tcele:531return std::make_unique<TCELETargetInfo>(Triple, Opts);532533case llvm::Triple::x86:534if (Triple.isOSDarwin())535return std::make_unique<DarwinI386TargetInfo>(Triple, Opts);536537switch (os) {538case llvm::Triple::Linux: {539switch (Triple.getEnvironment()) {540default:541return std::make_unique<LinuxTargetInfo<X86_32TargetInfo>>(Triple,542Opts);543case llvm::Triple::Android:544return std::make_unique<AndroidX86_32TargetInfo>(Triple, Opts);545}546}547case llvm::Triple::DragonFly:548return std::make_unique<DragonFlyBSDTargetInfo<X86_32TargetInfo>>(Triple,549Opts);550case llvm::Triple::NetBSD:551return std::make_unique<NetBSDI386TargetInfo>(Triple, Opts);552case llvm::Triple::OpenBSD:553return std::make_unique<OpenBSDI386TargetInfo>(Triple, Opts);554case llvm::Triple::FreeBSD:555return std::make_unique<FreeBSDTargetInfo<X86_32TargetInfo>>(Triple,556Opts);557case llvm::Triple::Fuchsia:558return std::make_unique<FuchsiaTargetInfo<X86_32TargetInfo>>(Triple,559Opts);560case llvm::Triple::KFreeBSD:561return std::make_unique<KFreeBSDTargetInfo<X86_32TargetInfo>>(Triple,562Opts);563case llvm::Triple::Solaris:564return std::make_unique<SolarisTargetInfo<X86_32TargetInfo>>(Triple,565Opts);566case llvm::Triple::Win32: {567switch (Triple.getEnvironment()) {568case llvm::Triple::Cygnus:569return std::make_unique<CygwinX86_32TargetInfo>(Triple, Opts);570case llvm::Triple::GNU:571return std::make_unique<MinGWX86_32TargetInfo>(Triple, Opts);572case llvm::Triple::Itanium:573case llvm::Triple::MSVC:574default: // Assume MSVC for unknown environments575return std::make_unique<MicrosoftX86_32TargetInfo>(Triple, Opts);576}577}578case llvm::Triple::Haiku:579return std::make_unique<HaikuX86_32TargetInfo>(Triple, Opts);580case llvm::Triple::RTEMS:581return std::make_unique<RTEMSX86_32TargetInfo>(Triple, Opts);582case llvm::Triple::NaCl:583return std::make_unique<NaClTargetInfo<X86_32TargetInfo>>(Triple, Opts);584case llvm::Triple::ELFIAMCU:585return std::make_unique<MCUX86_32TargetInfo>(Triple, Opts);586case llvm::Triple::Hurd:587return std::make_unique<HurdTargetInfo<X86_32TargetInfo>>(Triple, Opts);588default:589return std::make_unique<X86_32TargetInfo>(Triple, Opts);590}591592case llvm::Triple::x86_64:593if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())594return std::make_unique<DarwinX86_64TargetInfo>(Triple, Opts);595596switch (os) {597case llvm::Triple::Linux: {598switch (Triple.getEnvironment()) {599default:600return std::make_unique<LinuxTargetInfo<X86_64TargetInfo>>(Triple,601Opts);602case llvm::Triple::Android:603return std::make_unique<AndroidX86_64TargetInfo>(Triple, Opts);604case llvm::Triple::OpenHOS:605return std::make_unique<OHOSX86_64TargetInfo>(Triple, Opts);606}607}608case llvm::Triple::DragonFly:609return std::make_unique<DragonFlyBSDTargetInfo<X86_64TargetInfo>>(Triple,610Opts);611case llvm::Triple::NetBSD:612return std::make_unique<NetBSDTargetInfo<X86_64TargetInfo>>(Triple, Opts);613case llvm::Triple::OpenBSD:614return std::make_unique<OpenBSDX86_64TargetInfo>(Triple, Opts);615case llvm::Triple::FreeBSD:616return std::make_unique<FreeBSDTargetInfo<X86_64TargetInfo>>(Triple,617Opts);618case llvm::Triple::Fuchsia:619return std::make_unique<FuchsiaTargetInfo<X86_64TargetInfo>>(Triple,620Opts);621case llvm::Triple::KFreeBSD:622return std::make_unique<KFreeBSDTargetInfo<X86_64TargetInfo>>(Triple,623Opts);624case llvm::Triple::Solaris:625return std::make_unique<SolarisTargetInfo<X86_64TargetInfo>>(Triple,626Opts);627case llvm::Triple::Win32: {628switch (Triple.getEnvironment()) {629case llvm::Triple::Cygnus:630return std::make_unique<CygwinX86_64TargetInfo>(Triple, Opts);631case llvm::Triple::GNU:632return std::make_unique<MinGWX86_64TargetInfo>(Triple, Opts);633case llvm::Triple::MSVC:634default: // Assume MSVC for unknown environments635return std::make_unique<MicrosoftX86_64TargetInfo>(Triple, Opts);636}637}638case llvm::Triple::Haiku:639return std::make_unique<HaikuTargetInfo<X86_64TargetInfo>>(Triple, Opts);640case llvm::Triple::NaCl:641return std::make_unique<NaClTargetInfo<X86_64TargetInfo>>(Triple, Opts);642case llvm::Triple::PS4:643return std::make_unique<PS4OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);644case llvm::Triple::PS5:645return std::make_unique<PS5OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);646case llvm::Triple::Hurd:647return std::make_unique<HurdTargetInfo<X86_64TargetInfo>>(Triple, Opts);648default:649return std::make_unique<X86_64TargetInfo>(Triple, Opts);650}651652case llvm::Triple::spir: {653if (os != llvm::Triple::UnknownOS ||654Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)655return nullptr;656return std::make_unique<SPIR32TargetInfo>(Triple, Opts);657}658case llvm::Triple::spir64: {659if (os != llvm::Triple::UnknownOS ||660Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)661return nullptr;662return std::make_unique<SPIR64TargetInfo>(Triple, Opts);663}664case llvm::Triple::spirv: {665return std::make_unique<SPIRVTargetInfo>(Triple, Opts);666}667case llvm::Triple::spirv32: {668if (os != llvm::Triple::UnknownOS ||669Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)670return nullptr;671return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);672}673case llvm::Triple::spirv64: {674if (os != llvm::Triple::UnknownOS ||675Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) {676if (os == llvm::Triple::OSType::AMDHSA)677return std::make_unique<SPIRV64AMDGCNTargetInfo>(Triple, Opts);678return nullptr;679}680return std::make_unique<SPIRV64TargetInfo>(Triple, Opts);681}682case llvm::Triple::wasm32:683if (Triple.getSubArch() != llvm::Triple::NoSubArch ||684Triple.getVendor() != llvm::Triple::UnknownVendor ||685!Triple.isOSBinFormatWasm())686return nullptr;687switch (os) {688case llvm::Triple::WASI:689return std::make_unique<WASITargetInfo<WebAssembly32TargetInfo>>(Triple,690Opts);691case llvm::Triple::Emscripten:692return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>(693Triple, Opts);694case llvm::Triple::UnknownOS:695return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>>(696Triple, Opts);697default:698return nullptr;699}700case llvm::Triple::wasm64:701if (Triple.getSubArch() != llvm::Triple::NoSubArch ||702Triple.getVendor() != llvm::Triple::UnknownVendor ||703!Triple.isOSBinFormatWasm())704return nullptr;705switch (os) {706case llvm::Triple::WASI:707return std::make_unique<WASITargetInfo<WebAssembly64TargetInfo>>(Triple,708Opts);709case llvm::Triple::Emscripten:710return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>(711Triple, Opts);712case llvm::Triple::UnknownOS:713return std::make_unique<WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>>(714Triple, Opts);715default:716return nullptr;717}718719case llvm::Triple::dxil:720return std::make_unique<DirectXTargetInfo>(Triple, Opts);721case llvm::Triple::renderscript32:722return std::make_unique<LinuxTargetInfo<RenderScript32TargetInfo>>(Triple,723Opts);724case llvm::Triple::renderscript64:725return std::make_unique<LinuxTargetInfo<RenderScript64TargetInfo>>(Triple,726Opts);727728case llvm::Triple::ve:729return std::make_unique<LinuxTargetInfo<VETargetInfo>>(Triple, Opts);730731case llvm::Triple::csky:732switch (os) {733case llvm::Triple::Linux:734return std::make_unique<LinuxTargetInfo<CSKYTargetInfo>>(Triple, Opts);735default:736return std::make_unique<CSKYTargetInfo>(Triple, Opts);737}738case llvm::Triple::loongarch32:739switch (os) {740case llvm::Triple::Linux:741return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,742Opts);743default:744return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);745}746case llvm::Triple::loongarch64:747switch (os) {748case llvm::Triple::Linux:749return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,750Opts);751default:752return std::make_unique<LoongArch64TargetInfo>(Triple, Opts);753}754}755}756} // namespace targets757} // namespace clang758759using namespace clang::targets;760/// CreateTargetInfo - Return the target info object for the specified target761/// options.762TargetInfo *763TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,764const std::shared_ptr<TargetOptions> &Opts) {765llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple));766767// Construct the target768std::unique_ptr<TargetInfo> Target = AllocateTarget(Triple, *Opts);769if (!Target) {770Diags.Report(diag::err_target_unknown_triple) << Triple.str();771return nullptr;772}773Target->TargetOpts = Opts;774775// Set the target CPU if specified.776if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {777Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;778SmallVector<StringRef, 32> ValidList;779Target->fillValidCPUList(ValidList);780if (!ValidList.empty())781Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");782return nullptr;783}784785// Check the TuneCPU name if specified.786if (!Opts->TuneCPU.empty() &&787!Target->isValidTuneCPUName(Opts->TuneCPU)) {788Diags.Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;789SmallVector<StringRef, 32> ValidList;790Target->fillValidTuneCPUList(ValidList);791if (!ValidList.empty())792Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");793return nullptr;794}795796// Set the target ABI if specified.797if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {798Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;799return nullptr;800}801802// Set the fp math unit.803if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {804Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;805return nullptr;806}807808// Compute the default target features, we need the target to handle this809// because features may have dependencies on one another.810llvm::erase_if(Opts->FeaturesAsWritten, [&](StringRef Name) {811if (Target->isReadOnlyFeature(Name.substr(1))) {812Diags.Report(diag::warn_fe_backend_readonly_feature_flag) << Name;813return true;814}815return false;816});817if (!Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU,818Opts->FeaturesAsWritten))819return nullptr;820821// Add the features to the compile options.822Opts->Features.clear();823for (const auto &F : Opts->FeatureMap)824Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());825// Sort here, so we handle the features in a predictable order. (This matters826// when we're dealing with features that overlap.)827llvm::sort(Opts->Features);828829if (!Target->handleTargetFeatures(Opts->Features, Diags))830return nullptr;831832Target->setSupportedOpenCLOpts();833Target->setCommandLineOpenCLOpts();834Target->setMaxAtomicWidth();835836if (!Opts->DarwinTargetVariantTriple.empty())837Target->DarwinTargetVariantTriple =838llvm::Triple(Opts->DarwinTargetVariantTriple);839840if (!Target->validateTarget(Diags))841return nullptr;842843Target->CheckFixedPointBits();844845return Target.release();846}847/// validateOpenCLTarget - Check that OpenCL target has valid848/// options setting based on OpenCL version.849bool TargetInfo::validateOpenCLTarget(const LangOptions &Opts,850DiagnosticsEngine &Diags) const {851const llvm::StringMap<bool> &OpenCLFeaturesMap = getSupportedOpenCLOpts();852853auto diagnoseNotSupportedCore = [&](llvm::StringRef Name, auto... OptArgs) {854if (OpenCLOptions::isOpenCLOptionCoreIn(Opts, OptArgs...) &&855!hasFeatureEnabled(OpenCLFeaturesMap, Name))856Diags.Report(diag::warn_opencl_unsupported_core_feature)857<< Name << Opts.OpenCLCPlusPlus858<< Opts.getOpenCLVersionTuple().getAsString();859};860#define OPENCL_GENERIC_EXTENSION(Ext, ...) \861diagnoseNotSupportedCore(#Ext, __VA_ARGS__);862#include "clang/Basic/OpenCLExtensions.def"863864// Validate that feature macros are set properly for OpenCL C 3.0.865// In other cases assume that target is always valid.866if (Opts.getOpenCLCompatibleVersion() < 300)867return true;868869return OpenCLOptions::diagnoseUnsupportedFeatureDependencies(*this, Diags) &&870OpenCLOptions::diagnoseFeatureExtensionDifferences(*this, Diags);871}872873874