File indexing completed on 2026-05-10 08:44:36
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_TARGETPARSER_AARCH64TARGETPARSER_H
0015 #define LLVM_TARGETPARSER_AARCH64TARGETPARSER_H
0016
0017 #include "llvm/ADT/ArrayRef.h"
0018 #include "llvm/ADT/Bitset.h"
0019 #include "llvm/ADT/StringExtras.h"
0020 #include "llvm/ADT/StringMap.h"
0021 #include "llvm/ADT/StringRef.h"
0022 #include "llvm/Support/VersionTuple.h"
0023 #include "llvm/Support/raw_ostream.h"
0024 #include "llvm/TargetParser/SubtargetFeature.h"
0025 #include <array>
0026 #include <set>
0027 #include <vector>
0028
0029 namespace llvm {
0030
0031 class Triple;
0032
0033 namespace AArch64 {
0034
0035 struct ArchInfo;
0036 struct CpuInfo;
0037
0038 #include "llvm/TargetParser/AArch64CPUFeatures.inc"
0039 #include "llvm/TargetParser/AArch64FeatPriorities.inc"
0040
0041 static_assert(FEAT_MAX < 62,
0042 "Number of features in CPUFeatures are limited to 62 entries");
0043
0044
0045 #define EMIT_ARCHEXTKIND_ENUM
0046 #include "llvm/TargetParser/AArch64TargetParserDef.inc"
0047
0048 using ExtensionBitset = Bitset<AEK_NUM_EXTENSIONS>;
0049
0050
0051
0052
0053
0054 struct ExtensionInfo {
0055 StringRef UserVisibleName;
0056
0057 std::optional<StringRef> Alias;
0058 ArchExtKind ID;
0059
0060 StringRef ArchFeatureName;
0061
0062 StringRef Description;
0063 StringRef PosTargetFeature;
0064
0065 StringRef NegTargetFeature;
0066
0067 };
0068
0069 #define EMIT_EXTENSIONS
0070 #include "llvm/TargetParser/AArch64TargetParserDef.inc"
0071
0072 struct FMVInfo {
0073 StringRef Name;
0074 CPUFeatures FeatureBit;
0075 FeatPriorities PriorityBit;
0076 std::optional<ArchExtKind> ID;
0077 FMVInfo(StringRef Name, CPUFeatures FeatureBit, FeatPriorities PriorityBit,
0078 std::optional<ArchExtKind> ID)
0079 : Name(Name), FeatureBit(FeatureBit), PriorityBit(PriorityBit), ID(ID) {};
0080 };
0081
0082 const std::vector<FMVInfo> &getFMVInfo();
0083
0084
0085
0086
0087
0088 struct ExtensionDependency {
0089 ArchExtKind Earlier;
0090 ArchExtKind Later;
0091 };
0092
0093 #define EMIT_EXTENSION_DEPENDENCIES
0094 #include "llvm/TargetParser/AArch64TargetParserDef.inc"
0095
0096 enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' };
0097
0098
0099 struct ArchInfo {
0100 VersionTuple Version;
0101 ArchProfile Profile;
0102 StringRef Name;
0103 StringRef ArchFeature;
0104 AArch64::ExtensionBitset
0105 DefaultExts;
0106
0107 bool operator==(const ArchInfo &Other) const {
0108 return this->Name == Other.Name;
0109 }
0110 bool operator!=(const ArchInfo &Other) const {
0111 return this->Name != Other.Name;
0112 }
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124 bool implies(const ArchInfo &Other) const {
0125 if (this->Profile != Other.Profile)
0126 return false;
0127 if (this->Version.getMajor() == Other.Version.getMajor()) {
0128 return this->Version > Other.Version;
0129 }
0130 if (this->Version.getMajor() == 9 && Other.Version.getMajor() == 8) {
0131 assert(this->Version.getMinor() && Other.Version.getMinor() &&
0132 "AArch64::ArchInfo should have a minor version.");
0133 return this->Version.getMinor().value_or(0) + 5 >=
0134 Other.Version.getMinor().value_or(0);
0135 }
0136 return false;
0137 }
0138
0139
0140
0141 bool is_superset(const ArchInfo &Other) const {
0142 return (*this == Other) || implies(Other);
0143 }
0144
0145
0146 StringRef getSubArch() const { return ArchFeature.substr(1); }
0147
0148
0149 static std::optional<ArchInfo> findBySubArch(StringRef SubArch);
0150 };
0151
0152 #define EMIT_ARCHITECTURES
0153 #include "llvm/TargetParser/AArch64TargetParserDef.inc"
0154
0155
0156 struct CpuInfo {
0157 StringRef Name;
0158 const ArchInfo &Arch;
0159 AArch64::ExtensionBitset
0160 DefaultExtensions;
0161
0162 AArch64::ExtensionBitset getImpliedExtensions() const {
0163 return DefaultExtensions;
0164 }
0165 };
0166
0167 #define EMIT_CPU_INFO
0168 #include "llvm/TargetParser/AArch64TargetParserDef.inc"
0169
0170 struct ExtensionSet {
0171
0172 ExtensionBitset Enabled;
0173
0174
0175 ExtensionBitset Touched;
0176
0177
0178 const ArchInfo *BaseArch;
0179
0180 ExtensionSet() : Enabled(), Touched(), BaseArch(nullptr) {}
0181
0182
0183
0184
0185 void enable(ArchExtKind E);
0186
0187
0188
0189
0190
0191 void disable(ArchExtKind E);
0192
0193
0194
0195 void addCPUDefaults(const CpuInfo &CPU);
0196
0197
0198
0199 void addArchDefaults(const ArchInfo &Arch);
0200
0201
0202
0203
0204
0205 bool parseModifier(StringRef Modifier, const bool AllowNoDashForm = false);
0206
0207
0208
0209
0210
0211 void reconstructFromParsedFeatures(const std::vector<std::string> &Features,
0212 std::vector<std::string> &NonExtensions);
0213
0214
0215
0216 template <typename T> void toLLVMFeatureList(std::vector<T> &Features) const {
0217 if (BaseArch && !BaseArch->ArchFeature.empty())
0218 Features.emplace_back(T(BaseArch->ArchFeature));
0219
0220 for (const auto &E : Extensions) {
0221 if (E.PosTargetFeature.empty() || !Touched.test(E.ID))
0222 continue;
0223 if (Enabled.test(E.ID))
0224 Features.emplace_back(T(E.PosTargetFeature));
0225 else
0226 Features.emplace_back(T(E.NegTargetFeature));
0227 }
0228 }
0229
0230 void dump() const;
0231 };
0232
0233
0234 struct Alias {
0235 StringRef AltName;
0236 StringRef Name;
0237 };
0238
0239 #define EMIT_CPU_ALIAS
0240 #include "llvm/TargetParser/AArch64TargetParserDef.inc"
0241
0242 const ExtensionInfo &getExtensionByID(ArchExtKind(ExtID));
0243
0244 bool getExtensionFeatures(
0245 const AArch64::ExtensionBitset &Extensions,
0246 std::vector<StringRef> &Features);
0247
0248 StringRef getArchExtFeature(StringRef ArchExt);
0249 StringRef resolveCPUAlias(StringRef CPU);
0250
0251
0252 const ArchInfo *getArchForCpu(StringRef CPU);
0253
0254
0255 const ArchInfo *parseArch(StringRef Arch);
0256
0257
0258 std::optional<ExtensionInfo> targetFeatureToExtension(StringRef TargetFeature);
0259
0260
0261 std::optional<ExtensionInfo> parseArchExtension(StringRef Extension);
0262
0263
0264 std::optional<FMVInfo> parseFMVExtension(StringRef Extension);
0265
0266
0267 std::optional<CpuInfo> parseCpu(StringRef Name);
0268
0269 void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
0270
0271 bool isX18ReservedByDefault(const Triple &TT);
0272
0273
0274
0275
0276 uint64_t getFMVPriority(ArrayRef<StringRef> Features);
0277
0278
0279
0280
0281
0282
0283 uint64_t getCpuSupportsMask(ArrayRef<StringRef> Features);
0284
0285 void PrintSupportedExtensions();
0286
0287 void printEnabledExtensions(const std::set<StringRef> &EnabledFeatureNames);
0288
0289 }
0290 }
0291
0292 #endif