Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/ARM.h
35266 views
//===--- ARM.h - Declare ARM target feature support -------------*- C++ -*-===//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 declares ARM TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H13#define LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H1415#include "OSTargets.h"16#include "clang/Basic/TargetInfo.h"17#include "clang/Basic/TargetOptions.h"18#include "llvm/Support/Compiler.h"19#include "llvm/TargetParser/ARMTargetParser.h"20#include "llvm/TargetParser/ARMTargetParserCommon.h"21#include "llvm/TargetParser/Triple.h"2223namespace clang {24namespace targets {2526class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {27// Possible FPU choices.28enum FPUMode {29VFP2FPU = (1 << 0),30VFP3FPU = (1 << 1),31VFP4FPU = (1 << 2),32NeonFPU = (1 << 3),33FPARMV8 = (1 << 4)34};3536enum MVEMode {37MVE_INT = (1 << 0),38MVE_FP = (1 << 1)39};4041// Possible HWDiv features.42enum HWDivMode { HWDivThumb = (1 << 0), HWDivARM = (1 << 1) };4344static bool FPUModeIsVFP(FPUMode Mode) {45return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);46}4748static const TargetInfo::GCCRegAlias GCCRegAliases[];49static const char *const GCCRegNames[];5051std::string ABI, CPU;5253StringRef CPUProfile;54StringRef CPUAttr;5556enum { FP_Default, FP_VFP, FP_Neon } FPMath;5758llvm::ARM::ISAKind ArchISA;59llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;60llvm::ARM::ProfileKind ArchProfile;61unsigned ArchVersion;6263LLVM_PREFERRED_TYPE(FPUMode)64unsigned FPU : 5;65LLVM_PREFERRED_TYPE(MVEMode)66unsigned MVE : 2;6768LLVM_PREFERRED_TYPE(bool)69unsigned IsAAPCS : 1;70LLVM_PREFERRED_TYPE(HWDivMode)71unsigned HWDiv : 2;7273// Initialized via features.74LLVM_PREFERRED_TYPE(bool)75unsigned SoftFloat : 1;76LLVM_PREFERRED_TYPE(bool)77unsigned SoftFloatABI : 1;7879LLVM_PREFERRED_TYPE(bool)80unsigned CRC : 1;81LLVM_PREFERRED_TYPE(bool)82unsigned Crypto : 1;83LLVM_PREFERRED_TYPE(bool)84unsigned SHA2 : 1;85LLVM_PREFERRED_TYPE(bool)86unsigned AES : 1;87LLVM_PREFERRED_TYPE(bool)88unsigned DSP : 1;89LLVM_PREFERRED_TYPE(bool)90unsigned DotProd : 1;91LLVM_PREFERRED_TYPE(bool)92unsigned HasMatMul : 1;93LLVM_PREFERRED_TYPE(bool)94unsigned FPRegsDisabled : 1;95LLVM_PREFERRED_TYPE(bool)96unsigned HasPAC : 1;97LLVM_PREFERRED_TYPE(bool)98unsigned HasBTI : 1;99100enum {101LDREX_B = (1 << 0), /// byte (8-bit)102LDREX_H = (1 << 1), /// half (16-bit)103LDREX_W = (1 << 2), /// word (32-bit)104LDREX_D = (1 << 3), /// double (64-bit)105};106107uint32_t LDREX;108109// ACLE 6.5.1 Hardware floating point110enum {111HW_FP_HP = (1 << 1), /// half (16-bit)112HW_FP_SP = (1 << 2), /// single (32-bit)113HW_FP_DP = (1 << 3), /// double (64-bit)114};115uint32_t HW_FP;116117enum {118/// __arm_cdp __arm_ldc, __arm_ldcl, __arm_stc,119/// __arm_stcl, __arm_mcr and __arm_mrc120FEATURE_COPROC_B1 = (1 << 0),121/// __arm_cdp2, __arm_ldc2, __arm_stc2, __arm_ldc2l,122/// __arm_stc2l, __arm_mcr2 and __arm_mrc2123FEATURE_COPROC_B2 = (1 << 1),124/// __arm_mcrr, __arm_mrrc125FEATURE_COPROC_B3 = (1 << 2),126/// __arm_mcrr2, __arm_mrrc2127FEATURE_COPROC_B4 = (1 << 3),128};129130void setABIAAPCS();131void setABIAPCS(bool IsAAPCS16);132133void setArchInfo();134void setArchInfo(llvm::ARM::ArchKind Kind);135136void setAtomic();137138bool isThumb() const;139bool supportsThumb() const;140bool supportsThumb2() const;141bool hasMVE() const;142bool hasMVEFloat() const;143bool hasCDE() const;144145StringRef getCPUAttr() const;146StringRef getCPUProfile() const;147148public:149ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);150151StringRef getABI() const override;152bool setABI(const std::string &Name) override;153154bool isBranchProtectionSupportedArch(StringRef Arch) const override;155bool validateBranchProtection(StringRef Spec, StringRef Arch,156BranchProtectionInfo &BPI,157StringRef &Err) const override;158159// FIXME: This should be based on Arch attributes, not CPU names.160bool161initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,162StringRef CPU,163const std::vector<std::string> &FeaturesVec) const override;164165bool isValidFeatureName(StringRef Feature) const override {166// We pass soft-float-abi in as a -target-feature, but the backend figures167// this out through other means.168return Feature != "soft-float-abi";169}170171bool handleTargetFeatures(std::vector<std::string> &Features,172DiagnosticsEngine &Diags) override;173174bool hasFeature(StringRef Feature) const override;175176bool hasBFloat16Type() const override;177178bool isValidCPUName(StringRef Name) const override;179void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;180181bool setCPU(const std::string &Name) override;182183bool setFPMath(StringRef Name) override;184185bool useFP16ConversionIntrinsics() const override {186return false;187}188189void getTargetDefinesARMV81A(const LangOptions &Opts,190MacroBuilder &Builder) const;191void getTargetDefinesARMV82A(const LangOptions &Opts,192MacroBuilder &Builder) const;193void getTargetDefinesARMV83A(const LangOptions &Opts,194MacroBuilder &Builder) const;195void getTargetDefines(const LangOptions &Opts,196MacroBuilder &Builder) const override;197198ArrayRef<Builtin::Info> getTargetBuiltins() const override;199200bool isCLZForZeroUndef() const override;201BuiltinVaListKind getBuiltinVaListKind() const override;202203ArrayRef<const char *> getGCCRegNames() const override;204ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;205bool validateAsmConstraint(const char *&Name,206TargetInfo::ConstraintInfo &Info) const override;207std::string convertConstraint(const char *&Constraint) const override;208bool209validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,210std::string &SuggestedModifier) const override;211std::string_view getClobbers() const override;212213StringRef getConstraintRegister(StringRef Constraint,214StringRef Expression) const override {215return Expression;216}217218CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;219220int getEHDataRegisterNumber(unsigned RegNo) const override;221222bool hasSjLjLowering() const override;223224bool hasBitIntType() const override { return true; }225226const char *getBFloat16Mangling() const override { return "u6__bf16"; };227228std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {229return std::make_pair(getTriple().isArch64Bit() ? 256 : 64, 64);230}231};232233class LLVM_LIBRARY_VISIBILITY ARMleTargetInfo : public ARMTargetInfo {234public:235ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);236void getTargetDefines(const LangOptions &Opts,237MacroBuilder &Builder) const override;238};239240class LLVM_LIBRARY_VISIBILITY ARMbeTargetInfo : public ARMTargetInfo {241public:242ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);243void getTargetDefines(const LangOptions &Opts,244MacroBuilder &Builder) const override;245};246247class LLVM_LIBRARY_VISIBILITY WindowsARMTargetInfo248: public WindowsTargetInfo<ARMleTargetInfo> {249const llvm::Triple Triple;250251public:252WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);253254void getVisualStudioDefines(const LangOptions &Opts,255MacroBuilder &Builder) const;256257BuiltinVaListKind getBuiltinVaListKind() const override;258259CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;260};261262// Windows ARM + Itanium C++ ABI Target263class LLVM_LIBRARY_VISIBILITY ItaniumWindowsARMleTargetInfo264: public WindowsARMTargetInfo {265public:266ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,267const TargetOptions &Opts);268269void getTargetDefines(const LangOptions &Opts,270MacroBuilder &Builder) const override;271};272273// Windows ARM, MS (C++) ABI274class LLVM_LIBRARY_VISIBILITY MicrosoftARMleTargetInfo275: public WindowsARMTargetInfo {276public:277MicrosoftARMleTargetInfo(const llvm::Triple &Triple,278const TargetOptions &Opts);279280void getTargetDefines(const LangOptions &Opts,281MacroBuilder &Builder) const override;282};283284// ARM MinGW target285class LLVM_LIBRARY_VISIBILITY MinGWARMTargetInfo : public WindowsARMTargetInfo {286public:287MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);288289void getTargetDefines(const LangOptions &Opts,290MacroBuilder &Builder) const override;291};292293// ARM Cygwin target294class LLVM_LIBRARY_VISIBILITY CygwinARMTargetInfo : public ARMleTargetInfo {295public:296CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);297298void getTargetDefines(const LangOptions &Opts,299MacroBuilder &Builder) const override;300};301302class LLVM_LIBRARY_VISIBILITY DarwinARMTargetInfo303: public DarwinTargetInfo<ARMleTargetInfo> {304protected:305void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,306MacroBuilder &Builder) const override;307308public:309DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);310};311312// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes313class LLVM_LIBRARY_VISIBILITY RenderScript32TargetInfo314: public ARMleTargetInfo {315public:316RenderScript32TargetInfo(const llvm::Triple &Triple,317const TargetOptions &Opts);318319void getTargetDefines(const LangOptions &Opts,320MacroBuilder &Builder) const override;321};322323} // namespace targets324} // namespace clang325326#endif // LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H327328329