23#define DEBUG_TYPE "target-parser"
28#include "llvm/TargetParser/AArch64TargetParserDef.inc"
31 if (Arch.
size() >= 2 && Arch[0] ==
'v' && std::isdigit(Arch[1]))
32 return (Arch[1] - 48);
38 std::optional<CpuInfo> Cpu =
parseCpu(CPU);
45 for (
const auto *
A : AArch64::ArchInfos)
46 if (
A->getSubArch() == SubArch)
53 for (
const StringRef &FeatureStr : FeatureStrs) {
55 FeaturesMask |= (1ULL << Ext->Bit);
62 std::vector<StringRef> &Features) {
65 if (InputExts.
test(E.ID) && !E.PosTargetFeature.empty())
66 Features.push_back(E.PosTargetFeature);
72 for (
const auto &
A : CpuAliases)
73 if (
A.AltName ==
Name)
83 assert(!(AE.has_value() && AE->NegTargetFeature.empty()));
84 return IsNegated ? AE->NegTargetFeature : AE->PosTargetFeature;
91 for (
const auto &
C : CpuInfos)
94 for (
const auto &
Alias : CpuAliases)
103 return TT.isAndroid() || TT.isOSDarwin() || TT.isOSFuchsia() ||
104 TT.isOSWindows() || TT.isOHOSFamily();
114 for (
const auto *
A : ArchInfos) {
115 if (
A->Name.ends_with(Syn))
121std::optional<AArch64::ExtensionInfo>
126 if (ArchExt ==
A.UserVisibleName || ArchExt ==
A.Alias)
134 if (FMVExt ==
"rdma")
138 if (FMVExt ==
I.Name)
144std::optional<AArch64::ExtensionInfo>
147 if (TargetFeature == E.PosTargetFeature)
157 for (
const auto &
C : CpuInfos)
165 outs() <<
"All available -march extensions for AArch64\n\n"
171 if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) {
173 <<
format(Ext.Description.empty() ?
"%-20s%s\n" :
"%-20s%-55s%s\n",
174 Ext.UserVisibleName.str().c_str(),
175 Ext.ArchFeatureName.str().c_str(),
176 Ext.Description.str().c_str());
183 outs() <<
"Extensions enabled for the given AArch64 target\n\n"
186 std::vector<ExtensionInfo> EnabledExtensionsInfo;
187 for (
const auto &FeatureName : EnabledFeatureNames) {
188 std::string PosFeatureName =
'+' + FeatureName.str();
190 EnabledExtensionsInfo.push_back(*ExtInfo);
193 std::sort(EnabledExtensionsInfo.begin(), EnabledExtensionsInfo.end(),
195 return Lhs.ArchFeatureName < Rhs.ArchFeatureName;
198 for (
const auto &Ext : EnabledExtensionsInfo) {
201 Ext.ArchFeatureName.str().c_str(),
202 Ext.Description.str().c_str());
208 for (
const auto &E : llvm::AArch64::Extensions)
226 for (
auto Dep : ExtensionDependencies)
234 if (E == AEK_FP16 && BaseArch->is_superset(ARMV8_4A) &&
235 !BaseArch->is_superset(ARMV9A))
239 if (E == AEK_CRYPTO && BaseArch->is_superset(ARMV8_4A)) {
249 if (E == AEK_CRYPTO) {
265 for (
auto Dep : ExtensionDependencies)
266 if (E == Dep.Earlier)
272 BaseArch = &CPU.
Arch;
276 if (CPUExtensions.
test(E.ID))
290 const bool AllowNoDashForm) {
295 if (AllowNoDashForm && Modifier.
starts_with(
"no-"))
299 bool IsNegated = NChars != 0;
303 if (AE->PosTargetFeature.empty() || AE->NegTargetFeature.empty())
315 const std::vector<std::string> &Features,
316 std::vector<std::string> &NonExtensions) {
317 assert(Touched.none() &&
"Bitset already initialized");
318 for (
auto &
F : Features) {
319 bool IsNegated =
F[0] ==
'-';
328 NonExtensions.push_back(
F);
333 std::vector<StringRef> Features;
334 toLLVMFeatureList(Features);
static unsigned checkArchVersion(llvm::StringRef Arch)
const llvm::AArch64::ExtensionInfo & lookupExtensionByID(llvm::AArch64::ArchExtKind ExtID)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static cl::opt< std::set< SPIRV::Extension::Extension >, false, SPIRVExtensionsParser > Extensions("spirv-ext", cl::desc("Specify list of enabled SPIR-V extensions"))
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
constexpr bool test(unsigned I) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
constexpr size_t size() const
size - Get the string size.
Triple - Helper class for working with autoconf configuration names.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool isX18ReservedByDefault(const Triple &TT)
StringRef getArchExtFeature(StringRef ArchExt)
std::optional< ExtensionInfo > parseArchExtension(StringRef Extension)
std::optional< CpuInfo > parseCpu(StringRef Name)
uint64_t getCpuSupportsMask(ArrayRef< StringRef > FeatureStrs)
const ArchInfo * parseArch(StringRef Arch)
const ArchInfo * getArchForCpu(StringRef CPU)
void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values)
const ExtensionInfo & getExtensionByID(ArchExtKind(ExtID))
void printEnabledExtensions(const std::set< StringRef > &EnabledFeatureNames)
std::optional< FMVInfo > parseFMVExtension(StringRef Extension)
const std::vector< FMVInfo > & getFMVInfo()
void PrintSupportedExtensions()
std::optional< ExtensionInfo > targetFeatureToExtension(StringRef TargetFeature)
StringRef resolveCPUAlias(StringRef CPU)
bool getExtensionFeatures(const AArch64::ExtensionBitset &Extensions, std::vector< StringRef > &Features)
StringRef getCanonicalArchName(StringRef Arch)
MArch is expected to be of the form (arm|thumb)?(eb)?(v.
StringRef getArchSynonym(StringRef Arch)
Converts e.g. "armv8" -> "armv8-a".
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
void sort(IteratorTy Start, IteratorTy End)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
FormattedString left_justify(StringRef Str, unsigned Width)
left_justify - append spaces after string so total output is Width characters.
AArch64::ExtensionBitset DefaultExts
static std::optional< ArchInfo > findBySubArch(StringRef SubArch)
AArch64::ExtensionBitset getImpliedExtensions() const
bool parseModifier(StringRef Modifier, const bool AllowNoDashForm=false)
void addCPUDefaults(const CpuInfo &CPU)
void enable(ArchExtKind E)
void disable(ArchExtKind E)
void addArchDefaults(const ArchInfo &Arch)
void reconstructFromParsedFeatures(const std::vector< std::string > &Features, std::vector< std::string > &NonExtensions)