[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -154,17 +156,39 @@ std::optional AArch64::parseCpu(StringRef Name) { return {}; } -void AArch64::PrintSupportedExtensions(StringMap DescMap) { +void AArch64::PrintSupportedExtensions() { outs() << "All available -march extensions for AArch64\n\n" << "" << left_justify("Name", 20) - << (DescMap.empty() ? "\n" : "Description\n"); + << left_justify("Architecture Feature(s)", 55) + << "Description\n"; for (const auto : Extensions) { // Extensions without a feature cannot be used with -march. -if (!Ext.Feature.empty()) { - std::string Description = DescMap[Ext.Name].str(); +if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) { + outs() << "" + << format(Ext.Description.empty() ? "%-20s%s\n" : "%-20s%-55s%s\n", + Ext.UserVisibleName.str().c_str(), + Ext.ArchFeatureName.str().c_str(), + Ext.Description.str().c_str()); +} + } +} + +void +AArch64::printEnabledExtensions(std::vector EnabledFeatureNames) { + outs() << "Extensions enabled for the given AArch64 target\n\n" + << "" << left_justify("Architecture Feature(s)", 55) + << "Description\n"; + auto IsEnabled = [&](const ExtensionInfo ) { +StringRef FeatureName = Ext.PosTargetFeature.drop_front(); // drop '+' before comparing pratlucas wrote: No, the only `PosTargetFeature` was chosen as a reference here. `EnabledFeatureNames` captures the list of plain names - i.e. without the `+` or `-` prefixes, so we just need a fixed reference to compare them to. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -1841,7 +1868,8 @@ INSTANTIATE_TEST_SUITE_P( AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA, - AArch64::AEK_PAUTH, AArch64::AEK_PERFMON}), + AArch64::AEK_PAUTH, AArch64::AEK_PERFMON, + AArch64::AEK_CCDP}), pratlucas wrote: I don't see an advantage to not having AEK entries for all extensions. Having this correspondence not only increases testability, as shown by the changes in `TargetParserTest.cpp`, but also makes them consistently visible to the wider codebase via the Target Parser interface. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -1130,7 +1130,8 @@ INSTANTIATE_TEST_SUITE_P( AArch64::AEK_MTE, AArch64::AEK_SSBS, AArch64::AEK_FP16,AArch64::AEK_FP16FML, AArch64::AEK_SB, AArch64::AEK_JSCVT, - AArch64::AEK_FCMA,AArch64::AEK_PERFMON}), + AArch64::AEK_FCMA,AArch64::AEK_PERFMON, + AArch64::AEK_ETE, AArch64::AEK_AM}), jroelofs wrote: OMG that would be amazing. Dealing with downstream diff there is really painful. It would be fantastic to have each one on their own line so that any downstream changes are purely `+ lines`. If you do that, please make sure it's in its own commit, and as NFC as you can make it, so it's much easier to "audit" when merging. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { + std::string Error; + const llvm::Target *TheTarget = + llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error); + if (!TheTarget) { +llvm::errs() << Error; +return 1; + } + + llvm::TargetOptions BackendOptions; pratlucas wrote: `TargetOpts` captures the frontend options as a `clang::TargetOptions` instance. The target machine takes an instance of `llvm::TargetOptions` instead. It's confusing that the same class name was chosen for both. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { + std::string Error; + const llvm::Target *TheTarget = + llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error); + if (!TheTarget) { +llvm::errs() << Error; +return 1; + } + + llvm::TargetOptions BackendOptions; + std::string FeaturesStr = llvm::join(TargetOpts.FeaturesAsWritten, ","); + std::unique_ptr TheTargetMachine( + TheTarget->createTargetMachine(TargetOpts.Triple, TargetOpts.CPU, FeaturesStr, BackendOptions, std::nullopt)); + const llvm::Triple = TheTargetMachine->getTargetTriple(); + const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo(); + const std::vector Features = +MCInfo->getEnabledProcessorFeatures(); + + std::vector EnabledFeatureNames; + for (const llvm::SubtargetFeatureKV : Features) +EnabledFeatureNames.push_back(feature.Key); pratlucas wrote: Unfortunately `llvm::SubtargetFeatureKV` doesn't hold a lot of information and semantics of its contents is even less clear the what's capture here. I'll add a comment to this block clarifying what's being captured. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -1130,7 +1130,8 @@ INSTANTIATE_TEST_SUITE_P( AArch64::AEK_MTE, AArch64::AEK_SSBS, AArch64::AEK_FP16,AArch64::AEK_FP16FML, AArch64::AEK_SB, AArch64::AEK_JSCVT, - AArch64::AEK_FCMA,AArch64::AEK_PERFMON}), + AArch64::AEK_FCMA,AArch64::AEK_PERFMON, + AArch64::AEK_ETE, AArch64::AEK_AM}), tmatheson-arm wrote: I notice there are no tests for `--print-enabled-extensions` for individual CPUs. Can we now remove these from `TargetParserTest`, which is quite annoying to keep updated, and instead add lit tests for these CPUs which can be autogenerated? Maybe in a follow up PR. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -154,17 +156,39 @@ std::optional AArch64::parseCpu(StringRef Name) { return {}; } -void AArch64::PrintSupportedExtensions(StringMap DescMap) { +void AArch64::PrintSupportedExtensions() { outs() << "All available -march extensions for AArch64\n\n" << "" << left_justify("Name", 20) - << (DescMap.empty() ? "\n" : "Description\n"); + << left_justify("Architecture Feature(s)", 55) + << "Description\n"; for (const auto : Extensions) { // Extensions without a feature cannot be used with -march. -if (!Ext.Feature.empty()) { - std::string Description = DescMap[Ext.Name].str(); +if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) { + outs() << "" + << format(Ext.Description.empty() ? "%-20s%s\n" : "%-20s%-55s%s\n", + Ext.UserVisibleName.str().c_str(), + Ext.ArchFeatureName.str().c_str(), + Ext.Description.str().c_str()); +} + } +} + +void +AArch64::printEnabledExtensions(std::vector EnabledFeatureNames) { + outs() << "Extensions enabled for the given AArch64 target\n\n" + << "" << left_justify("Architecture Feature(s)", 55) + << "Description\n"; + auto IsEnabled = [&](const ExtensionInfo ) { +StringRef FeatureName = Ext.PosTargetFeature.drop_front(); // drop '+' before comparing tmatheson-arm wrote: Can you ever have a negative feature here? https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,17 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | sort | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s tmatheson-arm wrote: I don't think any of the `2>&1` are necessary, because you print to `outs()` (which is good). https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,17 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | sort | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s tmatheson-arm wrote: Why not sort the extensions in the actual output, rather than just in the test? Currently they are not in any particular order, which will make reading the output difficult when there are a lot. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -14,23 +14,36 @@ class Extension< tmatheson-arm wrote: The comment needs updating, something like: > A SubtargetFeature that represents one or more Architecture Extensions, as > defined in the Arm ARM and typically named `FEAT_*`. Each has an `AEK_*` > entry in the ArmExtKind enum. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { + std::string Error; + const llvm::Target *TheTarget = + llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error); + if (!TheTarget) { +llvm::errs() << Error; +return 1; + } + + llvm::TargetOptions BackendOptions; tmatheson-arm wrote: What is the difference between this and `TargetOpts`? This section maybe needs a comment explaining what is going on. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -116,12 +116,18 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march, -cpu tmatheson-arm wrote: Please could you make the names here consistent with tablegen, i.e. either pick `UserVisibleName` or `MArchName`. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -154,17 +156,39 @@ std::optional AArch64::parseCpu(StringRef Name) { return {}; } -void AArch64::PrintSupportedExtensions(StringMap DescMap) { +void AArch64::PrintSupportedExtensions() { outs() << "All available -march extensions for AArch64\n\n" << "" << left_justify("Name", 20) - << (DescMap.empty() ? "\n" : "Description\n"); + << left_justify("Architecture Feature(s)", 55) + << "Description\n"; for (const auto : Extensions) { // Extensions without a feature cannot be used with -march. -if (!Ext.Feature.empty()) { - std::string Description = DescMap[Ext.Name].str(); +if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) { + outs() << "" + << format(Ext.Description.empty() ? "%-20s%s\n" : "%-20s%-55s%s\n", + Ext.UserVisibleName.str().c_str(), + Ext.ArchFeatureName.str().c_str(), + Ext.Description.str().c_str()); +} + } +} + +void +AArch64::printEnabledExtensions(std::vector EnabledFeatureNames) { + outs() << "Extensions enabled for the given AArch64 target\n\n" + << "" << left_justify("Architecture Feature(s)", 55) + << "Description\n"; + auto IsEnabled = [&](const ExtensionInfo ) { +StringRef FeatureName = Ext.PosTargetFeature.drop_front(); // drop '+' before comparing +return std::find(EnabledFeatureNames.begin(), EnabledFeatureNames.end(), + FeatureName) != EnabledFeatureNames.end(); tmatheson-arm wrote: Can you use `targetFeatureToExtension` here, to avoid the double loop? https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -1841,7 +1868,8 @@ INSTANTIATE_TEST_SUITE_P( AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA, - AArch64::AEK_PAUTH, AArch64::AEK_PERFMON}), + AArch64::AEK_PAUTH, AArch64::AEK_PERFMON, + AArch64::AEK_CCDP}), tmatheson-arm wrote: We should think about whether we want each AEK to correspond to a `-march` modifier (status quo) or whether we want it to correspond to an `Extension` like here. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/tmatheson-arm commented: LGTM, just some minor suggestions/clarifications. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -14,23 +14,36 @@ class Extension< string TargetFeatureName,// String used for -target-feature and -march, unless overridden. string Spelling, // The XYZ in HasXYZ and AEK_XYZ. + string ArchitectureFeatureName, // The extension's "FEAT_*"" name(s) defined by the architecture string Desc, // Description. list Implies = [] // List of dependent features. > : SubtargetFeature Implies> { string ArchExtKindSpelling = "AEK_" # Spelling; // ArchExtKind enum name. -// In general, the name written on the command line should match the name -// used for -target-feature. However, there are exceptions. Therefore we -// add a separate field for this, to allow overriding it. Strongly prefer -// not doing so. -string MArchName = TargetFeatureName; +string ArchFeatureName = ArchitectureFeatureName; + +// By default, extensions are available as -march/-cpu command line options. +string MArchName = ""; // An alias that can be used on the command line, if the extension has one. // Used for correcting historical names while remaining backwards compatible. string MArchAlias = ""; } +class ExtensionWithMArch< tmatheson-arm wrote: ```suggestion // An Extension that can be enabled via a `-march` modifier or target attribute, e.g. `+sm4` class ExtensionWithMArch< ``` https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { + std::string Error; + const llvm::Target *TheTarget = + llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error); + if (!TheTarget) { +llvm::errs() << Error; +return 1; + } + + llvm::TargetOptions BackendOptions; + std::string FeaturesStr = llvm::join(TargetOpts.FeaturesAsWritten, ","); + std::unique_ptr TheTargetMachine( + TheTarget->createTargetMachine(TargetOpts.Triple, TargetOpts.CPU, FeaturesStr, BackendOptions, std::nullopt)); + const llvm::Triple = TheTargetMachine->getTargetTriple(); + const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo(); + const std::vector Features = +MCInfo->getEnabledProcessorFeatures(); + + std::vector EnabledFeatureNames; + for (const llvm::SubtargetFeatureKV : Features) +EnabledFeatureNames.push_back(feature.Key); tmatheson-arm wrote: Maybe we shouldn't throw away the type information in `llvm::SubtargetFeatureKV` before `printEnabledExtensions`. It is not clear what `EnabledFeatureNames` contains, since it is just a vector of strings. i.e. are they internal names, extension names, subtarget feature names, etc. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/tmatheson-arm edited https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a pratlucas wrote: Agreed. I'll remove these comments and these can be discussed case-by-case in the future. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a jroelofs wrote: > The same idea has been applied to SVE2 in Armv9 (although that one has become > more debatable). Yep, this is a problem for `apple-m4`, which does not have support for SVE/SVE2, but because of that choice on LLVM's part, we have to consider it v8.7 instead. This has a compounding problem when users want to write preprocessor version checks for newer features: they often can't use feature test macros because they don't exist yet, and the version numbered ones don't help them either, since we have to report the mcpu as being that older version. To fix this without disrupting existing software in the wild, I think we need to make the `HasVX_Ya` feature groups _not_ apply their `DefaultExts` to processors that they're included on, and instead only transitively include the `implied_features` sets. That, or add support for "negative" features, which I think comes with its own can of worms. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a davemgreen wrote: There is a difference between what the Arm architecture technically describes as optional and what the platform enables by default (i.e. what we enable by default for the compiler in Armv8-a). We don't want everyone in the world to lose out on Neon vectorization and require soft-fp just because it is technically optional in the architecture. The same idea has been applied to SVE2 in Armv9 (although that one has become more debatable). Some of the other optional extensions seem like they might be system-register extensions, I imagine that might be why they are enabled. There might be a better way to handle that. So I'm not sure if there is anything that needs to be "fixed" here, and think I would recommend removing them (especially from fp/asimd, the others are more debatable and could stay if you think they are useful). https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/pratlucas edited https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a +// ARCH-EXTENSION: FEAT_AdvSIMD pratlucas wrote: I wanted to keep these tests focused on the `FEAT_*` identifiers and to remove the need of dealing with the less strict "description" content, which makes it tricky to autogenerate the check lines. The set of extensions for each architecture version is also stable, which reduces the value of going for autogenerated tests in this case. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a pratlucas wrote: When adding those tests, I've noticed a few inconsistencies in the list of extensions enabled per architecture version. Usually, for arch versions, we only enable mandatory extensions by default, but these don't follow that approach. We've seen a few issues recently when adding new CPUs, where it can be tricky to get a match between the llvm and the TRMs due to this. I mostly wanted to double-check if this is something we want to re-visit/discuss. Do you have any thoughts on this? I'm happy to remove the FIXME lines otherwise. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/tmatheson-arm approved this pull request. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -140,89 +152,480 @@ def FeatureAES : Extension< // compatibility, and now imply features SHA2 and AES, which was the // "traditional" meaning of Crypto. let FMVDependencies = "+aes,+sha2" in -def FeatureCrypto : Extension<"crypto", "Crypto", +def FeatureCrypto : ExtensionWithMArch<"crypto", "Crypto", "FEAT_Crypto", "Enable cryptographic instructions", [FeatureNEON, FeatureSHA2, FeatureAES]>; -def FeatureCRC : Extension<"crc", "CRC", - "Enable ARMv8 CRC-32 checksum instructions (FEAT_CRC32)", [], +def FeatureCRC : ExtensionWithMArch<"crc", "CRC", "FEAT_CRC32", + "Enable ARMv8 CRC-32 checksum instructions", [], "FEAT_CRC", "+crc", 110>; -def FeatureRAS : Extension<"ras", "RAS", - "Enable ARMv8 Reliability, Availability and Serviceability Extensions (FEAT_RAS, FEAT_RASv1p1)">; - -def FeatureRASv2 : Extension<"rasv2", "RASv2", - "Enable ARMv8.9-A Reliability, Availability and Serviceability Extensions (FEAT_RASv2)", - [FeatureRAS]>; - -def FeatureLSE : Extension<"lse", "LSE", - "Enable ARMv8.1 Large System Extension (LSE) atomic instructions (FEAT_LSE)", [], - "FEAT_LSE", "+lse", 80>; +// This SubtargetFeature is special. It controls only whether codegen will turn +// `llvm.readcyclecounter()` into an access to a PMUv3 System Register. The +// `FEAT_PMUv3*` system registers are always available for assembly/disassembly. +let MArchName = "pmuv3" in +def FeaturePerfMon : ExtensionWithMArch<"perfmon", "PerfMon", "FEAT_PMUv3", + "Enable Code Generation for ARMv8 PMUv3 Performance Monitors extension">; -def FeatureLSE2 : SubtargetFeature<"lse2", "HasLSE2", "true", - "Enable ARMv8.4 Large System Extension 2 (LSE2) atomicity rules (FEAT_LSE2)">; +def FeatureSpecRestrict : Extension<"specrestrict", "SpecRestrict", "FEAT_CSV2_2", + "Enable architectural speculation restriction">; -def FeatureOutlineAtomics : SubtargetFeature<"outline-atomics", "OutlineAtomics", "true", - "Enable out of line atomics to support LSE instructions">; +//===--===// +// Armv8.1 Architecture Extensions +//===--===// -def FeatureFMV : SubtargetFeature<"fmv", "HasFMV", "true", - "Enable Function Multi Versioning support.">; +def FeatureLSE : ExtensionWithMArch<"lse", "LSE", "FEAT_LSE", + "Enable ARMv8.1 Large System Extension (LSE) atomic instructions", [], + "FEAT_LSE", "+lse", 80>; let MArchAlias = "rdma" in -def FeatureRDM : Extension<"rdm", "RDM", - "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions (FEAT_RDM)", +def FeatureRDM : ExtensionWithMArch<"rdm", "RDM", "FEAT_RDM", + "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions", [FeatureNEON], "FEAT_RDM", "+rdm,+fp-armv8,+neon", 108>; -def FeaturePAN : SubtargetFeature< -"pan", "HasPAN", "true", -"Enables ARM v8.1 Privileged Access-Never extension (FEAT_PAN)">; +def FeaturePAN : Extension<"pan", "PAN", "FEAT_PAN", + "Enables ARM v8.1 Privileged Access-Never extension">; -def FeatureLOR : SubtargetFeature< -"lor", "HasLOR", "true", -"Enables ARM v8.1 Limited Ordering Regions extension (FEAT_LOR)">; +def FeatureLOR : Extension<"lor", "LOR", "FEAT_LOR", + "Enables ARM v8.1 Limited Ordering Regions extension">; def FeatureCONTEXTIDREL2 : SubtargetFeature<"CONTEXTIDREL2", "HasCONTEXTIDREL2", "true", "Enable RW operand CONTEXTIDR_EL2" >; -def FeatureVH : SubtargetFeature<"vh", "HasVH", "true", -"Enables ARM v8.1 Virtual Host extension (FEAT_VHE)", [FeatureCONTEXTIDREL2] >; +def FeatureVH : Extension<"vh", "VH", "FEAT_VHE", + "Enables ARM v8.1 Virtual Host extension", [FeatureCONTEXTIDREL2] >; -// This SubtargetFeature is special. It controls only whether codegen will turn -// `llvm.readcyclecounter()` into an access to a PMUv3 System Register. The -// `FEAT_PMUv3*` system registers are always available for assembly/disassembly. -let MArchName = "pmuv3" in -def FeaturePerfMon : Extension<"perfmon", "PerfMon", - "Enable Code Generation for ARMv8 PMUv3 Performance Monitors extension (FEAT_PMUv3)">; +//===--===// +// Armv8.2 Architecture Extensions +//===--===// + +def FeatureSM4 : ExtensionWithMArch<"sm4", "SM4", "FEAT_SM4, FEAT_SM3", + "Enable SM3 and SM4 support", [FeatureNEON], + "FEAT_SM4", "+sm4,+fp-armv8,+neon", 106>; + +def FeatureSHA3 : ExtensionWithMArch<"sha3", "SHA3", "FEAT_SHA3, FEAT_SHA512", + "Enable SHA512 and SHA3 support", [FeatureNEON, FeatureSHA2], + "FEAT_SHA3", "+sha3,+sha2,+fp-armv8,+neon", 140>; + +def FeatureRAS : ExtensionWithMArch<"ras", "RAS", "FEAT_RAS, FEAT_RASv1p1", + "Enable ARMv8 Reliability, Availability and Serviceability Extensions">; let ArchExtKindSpelling = "AEK_FP16", MArchName = "fp16" in -def FeatureFullFP16 : Extension<"fullfp16",
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -116,7 +116,9 @@ const AArch64::ArchInfo *AArch64::parseArch(StringRef Arch) { std::optional AArch64::parseArchExtension(StringRef ArchExt) { for (const auto : Extensions) { -if (ArchExt == A.Name || ArchExt == A.Alias) +if (A.UserVisibleName.empty() && !A.Alias) + continue; pratlucas wrote: Done. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -114,12 +114,14 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" std::optional Alias; // An alias for this extension, if one exists. ArchExtKind ID; // Corresponding to the ArchExtKind, this // extensions representation in the bitfield. - StringRef Feature; // -mattr enable string, e.g. "+spe" - StringRef NegFeature; // -mattr disable string, e.g. "-spe" + StringRef ArchFeatureName; // The feature name defined by the Architecture + StringRef Description; // The textual description of the extension + StringRef TargetFeature;// -target-feature/-mattr enable string, e.g. "+spe" pratlucas wrote: Done. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -114,12 +114,14 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" std::optional Alias; // An alias for this extension, if one exists. ArchExtKind ID; // Corresponding to the ArchExtKind, this // extensions representation in the bitfield. - StringRef Feature; // -mattr enable string, e.g. "+spe" - StringRef NegFeature; // -mattr disable string, e.g. "-spe" + StringRef ArchFeatureName; // The feature name defined by the Architecture pratlucas wrote: Done. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -114,12 +114,14 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" pratlucas wrote: I've updated the comment accordingly. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -134,17 +136,39 @@ std::optional AArch64::parseCpu(StringRef Name) { return {}; } -void AArch64::PrintSupportedExtensions(StringMap DescMap) { +void AArch64::PrintSupportedExtensions() { outs() << "All available -march extensions for AArch64\n\n" << "" << left_justify("Name", 20) - << (DescMap.empty() ? "\n" : "Description\n"); + << left_justify("Architecture Feature(s)", 55) + << "Description\n"; for (const auto : Extensions) { // Extensions without a feature cannot be used with -march. -if (!Ext.Feature.empty()) { - std::string Description = DescMap[Ext.Name].str(); +if (!Ext.UserVisibleName.empty() && !Ext.TargetFeature.empty()) { pratlucas wrote: I've added a new unit test to cover the formatting in `TargetParserTest.cpp`. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -5703,6 +5703,11 @@ def print_supported_extensions : Flag<["-", "--"], "print-supported-extensions"> Visibility<[ClangOption, CC1Option, CLOption]>, HelpText<"Print supported -march extensions (RISC-V, AArch64 and ARM only)">, MarshallingInfoFlag>; +def print_enabled_extensions : Flag<["-", "--"], "print-enabled-extensions">, + Visibility<[ClangOption, CC1Option, CLOption]>, + HelpText<"Print the -march/-mcpu extensions enabled for the given target" pratlucas wrote: Done. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -204,6 +238,10 @@ int cc1_main(ArrayRef Argv, const char *Argv0, void *MainAddr) { if (Clang->getFrontendOpts().PrintSupportedExtensions) return PrintSupportedExtensions(Clang->getTargetOpts().Triple); + // --print-enabled-extensions takes priority over the actual compilation. DavidSpickett wrote: Cool, I doubt anyone is going to combine them any time soon, but good that something deterministic happens. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE DavidSpickett wrote: > the implications between them are not very clear True. The visual difference might be `+whatever` but the user doesn't know what that requires or implies. Leave it as is and if anyone actually finds it useful they can add the `+...` themselves. I don't have an immediate use case myself. Just being able to compare 1 compiler command line against a technical reference manual is already an improvement. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -204,6 +238,10 @@ int cc1_main(ArrayRef Argv, const char *Argv0, void *MainAddr) { if (Clang->getFrontendOpts().PrintSupportedExtensions) return PrintSupportedExtensions(Clang->getTargetOpts().Triple); + // --print-enabled-extensions takes priority over the actual compilation. pratlucas wrote: Only one of them wins and is executed, depending on the order of their implementation in `cc1_main.cpp`. The same applies when using the two existing `--print-supported-extensions` and `--print-supported-cpus` together. Ideally, we should make these three options mutually exclusive in the future. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { DavidSpickett wrote: Cool, happy to "when in Rome" here and leave it as is. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { pratlucas wrote: It's just following the local code style. I'm happy to update all of the `static int PrintSomething(...)` functions in the file on a separate commit, to keep things consistent. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE pratlucas wrote: Also, yes, I believe it should be possible to use something like `clang --print-enabled-extensions | tail | cut ... | sort | uniq`. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE pratlucas wrote: The output for `--print-enbled-extensions` was implemented using the following format: ``` Extensions enabled for the given AArch64 target Architecture Feature(s)Description FEAT_ETE Enable Embedded Trace Extension ``` I chose not to include the `+foo` values in the output mostly because not all of the extensions are exposed via `-march`/`-mcpu` and the implications between them are not very clear. I'm happy to add these on a extra column, though, if you think there's value to it. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -13,3 +13,57 @@ // RUN: %clang --target=aarch64_be -mbig-endian -march=armv8.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A-BE %s // RUN: %clang --target=aarch64_be -mbig-endian -march=armv8.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A-BE %s // GENERICV86A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+v8.6a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.6-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s DavidSpickett wrote: Ok got it, the CHECK consumes the line so if there was anything left matching FEAT_, something was forgotten. Thanks. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -140,89 +152,480 @@ def FeatureAES : Extension< // compatibility, and now imply features SHA2 and AES, which was the // "traditional" meaning of Crypto. let FMVDependencies = "+aes,+sha2" in -def FeatureCrypto : Extension<"crypto", "Crypto", +def FeatureCrypto : ExtensionWithMArch<"crypto", "Crypto", "FEAT_Crypto", "Enable cryptographic instructions", [FeatureNEON, FeatureSHA2, FeatureAES]>; -def FeatureCRC : Extension<"crc", "CRC", - "Enable ARMv8 CRC-32 checksum instructions (FEAT_CRC32)", [], +def FeatureCRC : ExtensionWithMArch<"crc", "CRC", "FEAT_CRC32", + "Enable ARMv8 CRC-32 checksum instructions", [], "FEAT_CRC", "+crc", 110>; -def FeatureRAS : Extension<"ras", "RAS", - "Enable ARMv8 Reliability, Availability and Serviceability Extensions (FEAT_RAS, FEAT_RASv1p1)">; - -def FeatureRASv2 : Extension<"rasv2", "RASv2", - "Enable ARMv8.9-A Reliability, Availability and Serviceability Extensions (FEAT_RASv2)", - [FeatureRAS]>; - -def FeatureLSE : Extension<"lse", "LSE", - "Enable ARMv8.1 Large System Extension (LSE) atomic instructions (FEAT_LSE)", [], - "FEAT_LSE", "+lse", 80>; +// This SubtargetFeature is special. It controls only whether codegen will turn +// `llvm.readcyclecounter()` into an access to a PMUv3 System Register. The +// `FEAT_PMUv3*` system registers are always available for assembly/disassembly. +let MArchName = "pmuv3" in +def FeaturePerfMon : ExtensionWithMArch<"perfmon", "PerfMon", "FEAT_PMUv3", + "Enable Code Generation for ARMv8 PMUv3 Performance Monitors extension">; -def FeatureLSE2 : SubtargetFeature<"lse2", "HasLSE2", "true", - "Enable ARMv8.4 Large System Extension 2 (LSE2) atomicity rules (FEAT_LSE2)">; +def FeatureSpecRestrict : Extension<"specrestrict", "SpecRestrict", "FEAT_CSV2_2", + "Enable architectural speculation restriction">; -def FeatureOutlineAtomics : SubtargetFeature<"outline-atomics", "OutlineAtomics", "true", - "Enable out of line atomics to support LSE instructions">; +//===--===// +// Armv8.1 Architecture Extensions +//===--===// -def FeatureFMV : SubtargetFeature<"fmv", "HasFMV", "true", - "Enable Function Multi Versioning support.">; +def FeatureLSE : ExtensionWithMArch<"lse", "LSE", "FEAT_LSE", + "Enable ARMv8.1 Large System Extension (LSE) atomic instructions", [], + "FEAT_LSE", "+lse", 80>; let MArchAlias = "rdma" in -def FeatureRDM : Extension<"rdm", "RDM", - "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions (FEAT_RDM)", +def FeatureRDM : ExtensionWithMArch<"rdm", "RDM", "FEAT_RDM", + "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions", [FeatureNEON], "FEAT_RDM", "+rdm,+fp-armv8,+neon", 108>; -def FeaturePAN : SubtargetFeature< -"pan", "HasPAN", "true", -"Enables ARM v8.1 Privileged Access-Never extension (FEAT_PAN)">; +def FeaturePAN : Extension<"pan", "PAN", "FEAT_PAN", + "Enables ARM v8.1 Privileged Access-Never extension">; -def FeatureLOR : SubtargetFeature< -"lor", "HasLOR", "true", -"Enables ARM v8.1 Limited Ordering Regions extension (FEAT_LOR)">; +def FeatureLOR : Extension<"lor", "LOR", "FEAT_LOR", + "Enables ARM v8.1 Limited Ordering Regions extension">; def FeatureCONTEXTIDREL2 : SubtargetFeature<"CONTEXTIDREL2", "HasCONTEXTIDREL2", "true", "Enable RW operand CONTEXTIDR_EL2" >; -def FeatureVH : SubtargetFeature<"vh", "HasVH", "true", -"Enables ARM v8.1 Virtual Host extension (FEAT_VHE)", [FeatureCONTEXTIDREL2] >; +def FeatureVH : Extension<"vh", "VH", "FEAT_VHE", + "Enables ARM v8.1 Virtual Host extension", [FeatureCONTEXTIDREL2] >; -// This SubtargetFeature is special. It controls only whether codegen will turn -// `llvm.readcyclecounter()` into an access to a PMUv3 System Register. The -// `FEAT_PMUv3*` system registers are always available for assembly/disassembly. -let MArchName = "pmuv3" in -def FeaturePerfMon : Extension<"perfmon", "PerfMon", - "Enable Code Generation for ARMv8 PMUv3 Performance Monitors extension (FEAT_PMUv3)">; +//===--===// +// Armv8.2 Architecture Extensions +//===--===// + +def FeatureSM4 : ExtensionWithMArch<"sm4", "SM4", "FEAT_SM4, FEAT_SM3", + "Enable SM3 and SM4 support", [FeatureNEON], + "FEAT_SM4", "+sm4,+fp-armv8,+neon", 106>; + +def FeatureSHA3 : ExtensionWithMArch<"sha3", "SHA3", "FEAT_SHA3, FEAT_SHA512", + "Enable SHA512 and SHA3 support", [FeatureNEON, FeatureSHA2], + "FEAT_SHA3", "+sha3,+sha2,+fp-armv8,+neon", 140>; + +def FeatureRAS : ExtensionWithMArch<"ras", "RAS", "FEAT_RAS, FEAT_RASv1p1", + "Enable ARMv8 Reliability, Availability and Serviceability Extensions">; let ArchExtKindSpelling = "AEK_FP16", MArchName = "fp16" in -def FeatureFullFP16 : Extension<"fullfp16",
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a davemgreen wrote: Why do these have FIXMEs? https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
jthackray wrote: This is a good idea. Happy to approve, once all the FIXMEs are removed, since others have already made many salient suggestions, which I agree with. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -13,3 +13,57 @@ // RUN: %clang --target=aarch64_be -mbig-endian -march=armv8.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A-BE %s // RUN: %clang --target=aarch64_be -mbig-endian -march=armv8.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A-BE %s // GENERICV86A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+v8.6a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.6-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s jroelofs wrote: It ensures that every emitted line is covered by a CHECK. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/tmatheson-arm deleted https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a +// ARCH-EXTENSION: FEAT_AdvSIMD tmatheson-arm wrote: These should go in a separate file so that the tests can be autogenerated (or autogenerate this file, if possible). https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE +// ARCH-EXTENSION: FEAT_LOR +// ARCH-EXTENSION: FEAT_TRBE +// ARCH-EXTENSION: FEAT_VHE +// ARCH-EXTENSION: FEAT_PAN +// ARCH-EXTENSION: FEAT_CRC32 +// FIXME: FEAT_FP is optional from v8.0a +// ARCH-EXTENSION: FEAT_FP +// ARCH-EXTENSION: FEAT_LSE +// ARCH-EXTENSION: FEAT_RDM +// FIXME: FEAT_AdvSIMD is optional from v8.0a +// ARCH-EXTENSION: FEAT_AdvSIMD tmatheson-arm wrote: Use ARCH-NEXT to guarantee we don't miss any changes. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -116,7 +116,9 @@ const AArch64::ArchInfo *AArch64::parseArch(StringRef Arch) { std::optional AArch64::parseArchExtension(StringRef ArchExt) { for (const auto : Extensions) { -if (ArchExt == A.Name || ArchExt == A.Alias) +if (A.UserVisibleName.empty() && !A.Alias) + continue; tmatheson-arm wrote: This seems redundant when looking at the following `if` condition, maybe we actually want to check if `ArchExt.empty()` instead? https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -23,6 +23,7 @@ class Extension< string TargetFeatureName,// String used for -target-feature and -march, unless overridden. string Spelling, // The XYZ in HasXYZ and AEK_XYZ. + string ArchitectureFeatureName, // The extension's "FEAT_*"" name(s) defined by the architecture tmatheson-arm wrote: Keep the name in sync with the name in the struct if you can https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -114,12 +114,14 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" std::optional Alias; // An alias for this extension, if one exists. ArchExtKind ID; // Corresponding to the ArchExtKind, this // extensions representation in the bitfield. - StringRef Feature; // -mattr enable string, e.g. "+spe" - StringRef NegFeature; // -mattr disable string, e.g. "-spe" + StringRef ArchFeatureName; // The feature name defined by the Architecture + StringRef Description; // The textual description of the extension + StringRef TargetFeature;// -target-feature/-mattr enable string, e.g. "+spe" tmatheson-arm wrote: ```suggestion StringRef PosTargetFeature;// -target-feature/-mattr enable string, e.g. "+spe" ``` Keeps it consistent with `NegTargetFeature`, and makes it clear it includes the `+` https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -114,12 +114,14 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" tmatheson-arm wrote: This is also what is used in the `target` attribute. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -114,12 +114,14 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef Name; // Human readable name, e.g. "profile". + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" std::optional Alias; // An alias for this extension, if one exists. ArchExtKind ID; // Corresponding to the ArchExtKind, this // extensions representation in the bitfield. - StringRef Feature; // -mattr enable string, e.g. "+spe" - StringRef NegFeature; // -mattr disable string, e.g. "-spe" + StringRef ArchFeatureName; // The feature name defined by the Architecture tmatheson-arm wrote: ```suggestion StringRef ArchFeatureName; // The feature name defined by the Architecture e.g. FEAT_AdvSIMD ``` https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE DavidSpickett wrote: I'm also curious what it looks like just to confirm that it would be possible to do something like `clang --print-enabled-extensions | tail | cut ... | sort | uniq` if you wanted to extract the list. I assume we can because it's in a table. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
DavidSpickett wrote: Also please list the impact, if any, on `--print-supported-extensions` in the commit message. I think it got a column with the FEAT_ names added, which is a nice improvement. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -204,6 +238,10 @@ int cc1_main(ArrayRef Argv, const char *Argv0, void *MainAddr) { if (Clang->getFrontendOpts().PrintSupportedExtensions) return PrintSupportedExtensions(Clang->getTargetOpts().Triple); + // --print-enabled-extensions takes priority over the actual compilation. DavidSpickett wrote: What happens if I ask for `--print-supported-extensions` and `--print-enabled-extensions`? I'd guess either both happen, or the last one in wins. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -134,17 +136,39 @@ std::optional AArch64::parseCpu(StringRef Name) { return {}; } -void AArch64::PrintSupportedExtensions(StringMap DescMap) { +void AArch64::PrintSupportedExtensions() { outs() << "All available -march extensions for AArch64\n\n" << "" << left_justify("Name", 20) - << (DescMap.empty() ? "\n" : "Description\n"); + << left_justify("Architecture Feature(s)", 55) + << "Description\n"; for (const auto : Extensions) { // Extensions without a feature cannot be used with -march. -if (!Ext.Feature.empty()) { - std::string Description = DescMap[Ext.Name].str(); +if (!Ext.UserVisibleName.empty() && !Ext.TargetFeature.empty()) { DavidSpickett wrote: Which test in this PR checks this formatting? Just one row is fine. Perhaps the CPU tests do but it seems like they only want FEAT_XYZ to show up. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -13,3 +13,57 @@ // RUN: %clang --target=aarch64_be -mbig-endian -march=armv8.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A-BE %s // RUN: %clang --target=aarch64_be -mbig-endian -march=armv8.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A-BE %s // GENERICV86A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+v8.6a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.6-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s DavidSpickett wrote: What is the implicit-check-not doing here? Or rather, what possible bug is it making sure we don't miss? Is it that in the information we list the names as "AMUv1" for example, so if we forgot to add a name, we'd output just "FEAT_" ? https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -161,6 +162,39 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { DavidSpickett wrote: Is int here just following the local code style or would bool do? Since we only use 0 and 1. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -19,3 +19,19 @@ // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // RUN: %clang --target=arm64 -mlittle-endian -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERICV81A %s // ARM64-GENERICV81A: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"{{.*}} "-target-feature" "+v8.1a"{{.*}} "-target-feature" "+neon" + +// = Architecture extensions = + +// RUN: %clang -target aarch64 -march=armv8.1-a --print-enabled-extensions 2>&1 | FileCheck -check-prefix=ARCH-EXTENSION --implicit-check-not FEAT_ %s +// ARCH-EXTENSION: FEAT_ETE DavidSpickett wrote: I'm surprised that this doesn't show the name the user would use with `-march`, is that expected? Since `--print-supported-extensions` shows it: ``` All available -march extensions for AArch64 NameDescription aes Enable AES support (FEAT_AES, FEAT_PMULL) ``` And if I were comparing two command lines I might want to know what `+foo` I need to add to one to make it equivalent to the other. Or I am misreading the output and the name is there already :) https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/DavidSpickett commented: Cool idea, should be very useful. The TableGen has changed so much since I last looked so I didn't look over that myself. https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/DavidSpickett edited https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
@@ -5703,6 +5703,11 @@ def print_supported_extensions : Flag<["-", "--"], "print-supported-extensions"> Visibility<[ClangOption, CC1Option, CLOption]>, HelpText<"Print supported -march extensions (RISC-V, AArch64 and ARM only)">, MarshallingInfoFlag>; +def print_enabled_extensions : Flag<["-", "--"], "print-enabled-extensions">, + Visibility<[ClangOption, CC1Option, CLOption]>, + HelpText<"Print the -march/-mcpu extensions enabled for the given target" DavidSpickett wrote: This is tricky to word without it becoming a paragraph, but perhaps something like this is more accurate: ``` Print the extensions enabled by the given target and -march/-mcpu options. ``` This distinguishes it from `--print-supported-extensions`. Phrasing aside, the point is that it's listing a consequence of -march/-mcpu, not what you could add to -march and -mcpu. `supported` is "here's what you could have", `enabled` is "this is what we gave you given the other options you used". https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 964c92d04f039a205327cb47c75919096f9fca94 2e10a741ac8ddfccc661966df096de9c7ff505f1 -- clang/test/Driver/aarch64-v8a.c clang/test/Driver/aarch64-v9a.c clang/include/clang/Frontend/FrontendOptions.h clang/lib/Basic/Targets/AArch64.cpp clang/lib/CodeGen/Targets/AArch64.cpp clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/aarch64-v81a.c clang/test/Driver/aarch64-v82a.c clang/test/Driver/aarch64-v83a.c clang/test/Driver/aarch64-v84a.c clang/test/Driver/aarch64-v85a.c clang/test/Driver/aarch64-v86a.c clang/test/Driver/aarch64-v87a.c clang/test/Driver/aarch64-v88a.c clang/test/Driver/aarch64-v89a.c clang/test/Driver/aarch64-v91a.c clang/test/Driver/aarch64-v92a.c clang/test/Driver/aarch64-v93a.c clang/test/Driver/aarch64-v94a.c clang/test/Driver/aarch64-v95a.c clang/test/Driver/print-supported-extensions.c clang/tools/driver/cc1_main.cpp llvm/include/llvm/MC/MCSubtargetInfo.h llvm/include/llvm/TargetParser/AArch64TargetParser.h llvm/lib/MC/MCSubtargetInfo.cpp llvm/lib/TargetParser/AArch64TargetParser.cpp llvm/unittests/TargetParser/TargetParserTest.cpp llvm/utils/TableGen/ARMTargetDefEmitter.cpp `` View the diff from clang-format here. ``diff diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index db7327e25f..07561a2c36 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -370,7 +370,8 @@ phases::ID Driver::getFinalPhase(const DerivedArgList , // -{fsyntax-only,-analyze,emit-ast} only run up to the compiler. } else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) || (PhaseArg = DAL.getLastArg(options::OPT_print_supported_cpus)) || - (PhaseArg = DAL.getLastArg(options::OPT_print_enabled_extensions)) || + (PhaseArg = + DAL.getLastArg(options::OPT_print_enabled_extensions)) || (PhaseArg = DAL.getLastArg(options::OPT_module_file_info)) || (PhaseArg = DAL.getLastArg(options::OPT_verify_pch)) || (PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) || diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp index 6c0f488844..029a0a26ea 100644 --- a/clang/tools/driver/cc1_main.cpp +++ b/clang/tools/driver/cc1_main.cpp @@ -162,7 +162,7 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } -static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { +static int PrintEnabledExtensions(const TargetOptions ) { std::string Error; const llvm::Target *TheTarget = llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error); @@ -174,11 +174,13 @@ static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { llvm::TargetOptions BackendOptions; std::string FeaturesStr = llvm::join(TargetOpts.FeaturesAsWritten, ","); std::unique_ptr TheTargetMachine( - TheTarget->createTargetMachine(TargetOpts.Triple, TargetOpts.CPU, FeaturesStr, BackendOptions, std::nullopt)); + TheTarget->createTargetMachine(TargetOpts.Triple, TargetOpts.CPU, + FeaturesStr, BackendOptions, + std::nullopt)); const llvm::Triple = TheTargetMachine->getTargetTriple(); const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo(); const std::vector Features = -MCInfo->getEnabledProcessorFeatures(); + MCInfo->getEnabledProcessorFeatures(); std::vector EnabledFeatureNames; for (const llvm::SubtargetFeatureKV : Features) diff --git a/llvm/include/llvm/TargetParser/AArch64TargetParser.h b/llvm/include/llvm/TargetParser/AArch64TargetParser.h index d3a93da304..6979b5a34f 100644 --- a/llvm/include/llvm/TargetParser/AArch64TargetParser.h +++ b/llvm/include/llvm/TargetParser/AArch64TargetParser.h @@ -114,14 +114,16 @@ using ExtensionBitset = Bitset; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. "profile" + StringRef UserVisibleName; // Human readable name used in -march/-cpu, e.g. + // "profile" std::optional Alias; // An alias for this extension, if one exists. ArchExtKind ID; // Corresponding to the ArchExtKind, this // extensions representation in the bitfield. - StringRef ArchFeatureName; // The feature name defined by the Architecture - StringRef Description; // The textual description of the extension - StringRef TargetFeature;// -target-feature/-mattr enable string, e.g. "+spe" - StringRef NegTargetFeature;
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
https://github.com/pratlucas edited https://github.com/llvm/llvm-project/pull/95805 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
llvmbot wrote: @llvm/pr-subscribers-clang-driver Author: Lucas Duarte Prates (pratlucas) Changes This introduces the new '--print-enabled-extensions' command line option to AArch64, which prints the list of extensins that are enabled for the target specified by the combination of '--target/-march/-mcpu' values. The new option allows the manual inspection of the enabled extensions by users and enables us to programatically test that the correct set of extensions are enabled for specific architecture versions or CPU models. --- Patch is 108.34 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/95805.diff 32 Files Affected: - (modified) clang/include/clang/Driver/Options.td (+5) - (modified) clang/include/clang/Frontend/FrontendOptions.h (+4) - (modified) clang/lib/Basic/Targets/AArch64.cpp (+1-1) - (modified) clang/lib/CodeGen/Targets/AArch64.cpp (+2-2) - (modified) clang/lib/Driver/Driver.cpp (+14-5) - (modified) clang/lib/Driver/ToolChain.cpp (+4-4) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1-1) - (modified) clang/test/Driver/aarch64-v81a.c (+16) - (modified) clang/test/Driver/aarch64-v82a.c (+20) - (modified) clang/test/Driver/aarch64-v83a.c (+26) - (modified) clang/test/Driver/aarch64-v84a.c (+40) - (modified) clang/test/Driver/aarch64-v85a.c (+48) - (modified) clang/test/Driver/aarch64-v86a.c (+54) - (modified) clang/test/Driver/aarch64-v87a.c (+57) - (modified) clang/test/Driver/aarch64-v88a.c (+60) - (modified) clang/test/Driver/aarch64-v89a.c (+67) - (added) clang/test/Driver/aarch64-v8a.c (+31) - (modified) clang/test/Driver/aarch64-v91a.c (+63) - (modified) clang/test/Driver/aarch64-v92a.c (+66) - (modified) clang/test/Driver/aarch64-v93a.c (+69) - (modified) clang/test/Driver/aarch64-v94a.c (+75) - (modified) clang/test/Driver/aarch64-v95a.c (+78) - (added) clang/test/Driver/aarch64-v9a.c (+72) - (modified) clang/test/Driver/print-supported-extensions.c (+2-2) - (modified) clang/tools/driver/cc1_main.cpp (+39-1) - (modified) llvm/include/llvm/MC/MCSubtargetInfo.h (+3) - (modified) llvm/include/llvm/TargetParser/AArch64TargetParser.h (+8-4) - (modified) llvm/lib/MC/MCSubtargetInfo.cpp (+10) - (modified) llvm/lib/Target/AArch64/AArch64Features.td (+485-426) - (modified) llvm/lib/TargetParser/AArch64TargetParser.cpp (+38-14) - (modified) llvm/unittests/TargetParser/TargetParserTest.cpp (+2-8) - (modified) llvm/utils/TableGen/ARMTargetDefEmitter.cpp (+3-1) ``diff diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 49b44893c25f2..6a520dc9e7062 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5703,6 +5703,11 @@ def print_supported_extensions : Flag<["-", "--"], "print-supported-extensions"> Visibility<[ClangOption, CC1Option, CLOption]>, HelpText<"Print supported -march extensions (RISC-V, AArch64 and ARM only)">, MarshallingInfoFlag>; +def print_enabled_extensions : Flag<["-", "--"], "print-enabled-extensions">, + Visibility<[ClangOption, CC1Option, CLOption]>, + HelpText<"Print the -march/-mcpu extensions enabled for the given target" + " (AArch64 only)">, + MarshallingInfoFlag>; def : Flag<["-"], "mcpu=help">, Alias; def : Flag<["-"], "mtune=help">, Alias; def time : Flag<["-"], "time">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index ebb8e9e59c6b6..5e5034fe01eb5 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -306,6 +306,10 @@ class FrontendOptions { LLVM_PREFERRED_TYPE(bool) unsigned PrintSupportedExtensions : 1; + /// Print the extensions enabled for the current target. + LLVM_PREFERRED_TYPE(bool) + unsigned PrintEnabledExtensions : 1; + /// Show the -version text. LLVM_PREFERRED_TYPE(bool) unsigned ShowVersion : 1; diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index e125ad551f098..b2c3e839b7e6c 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1101,7 +1101,7 @@ bool AArch64TargetInfo::initFeatureMap( std::optional Extension = llvm::AArch64::parseArchExtension(Feature.substr(1)); if (Extension) - UpdatedFeature = Extension->Feature.str(); + UpdatedFeature = Extension->TargetFeature.str(); } UpdatedFeaturesVec.push_back(UpdatedFeature); } diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp index cfb4b5f58ef72..51a7221db8b83 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -966,8 +966,8 @@ void AArch64ABIInfo::appendAttributeMangling(StringRef AttrStr, llvm::SmallDenseSet UniqueFeats; for (auto : Features) if (auto Ext =
[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)
llvmbot wrote: @llvm/pr-subscribers-clang @llvm/pr-subscribers-backend-aarch64 Author: Lucas Duarte Prates (pratlucas) Changes This introduces the new '--print-enabled-extensions' command line option to AArch64, which prints the list of extensins that are enabled for the target specified by the combination of '--target/-march/-mcpu' values. The new option allows the manual inspection of the enabled extensions by users and enables us to programatically test that the correct set of extensions are enabled for specific architecture versions or CPU models. --- Patch is 108.34 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/95805.diff 32 Files Affected: - (modified) clang/include/clang/Driver/Options.td (+5) - (modified) clang/include/clang/Frontend/FrontendOptions.h (+4) - (modified) clang/lib/Basic/Targets/AArch64.cpp (+1-1) - (modified) clang/lib/CodeGen/Targets/AArch64.cpp (+2-2) - (modified) clang/lib/Driver/Driver.cpp (+14-5) - (modified) clang/lib/Driver/ToolChain.cpp (+4-4) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1-1) - (modified) clang/test/Driver/aarch64-v81a.c (+16) - (modified) clang/test/Driver/aarch64-v82a.c (+20) - (modified) clang/test/Driver/aarch64-v83a.c (+26) - (modified) clang/test/Driver/aarch64-v84a.c (+40) - (modified) clang/test/Driver/aarch64-v85a.c (+48) - (modified) clang/test/Driver/aarch64-v86a.c (+54) - (modified) clang/test/Driver/aarch64-v87a.c (+57) - (modified) clang/test/Driver/aarch64-v88a.c (+60) - (modified) clang/test/Driver/aarch64-v89a.c (+67) - (added) clang/test/Driver/aarch64-v8a.c (+31) - (modified) clang/test/Driver/aarch64-v91a.c (+63) - (modified) clang/test/Driver/aarch64-v92a.c (+66) - (modified) clang/test/Driver/aarch64-v93a.c (+69) - (modified) clang/test/Driver/aarch64-v94a.c (+75) - (modified) clang/test/Driver/aarch64-v95a.c (+78) - (added) clang/test/Driver/aarch64-v9a.c (+72) - (modified) clang/test/Driver/print-supported-extensions.c (+2-2) - (modified) clang/tools/driver/cc1_main.cpp (+39-1) - (modified) llvm/include/llvm/MC/MCSubtargetInfo.h (+3) - (modified) llvm/include/llvm/TargetParser/AArch64TargetParser.h (+8-4) - (modified) llvm/lib/MC/MCSubtargetInfo.cpp (+10) - (modified) llvm/lib/Target/AArch64/AArch64Features.td (+485-426) - (modified) llvm/lib/TargetParser/AArch64TargetParser.cpp (+38-14) - (modified) llvm/unittests/TargetParser/TargetParserTest.cpp (+2-8) - (modified) llvm/utils/TableGen/ARMTargetDefEmitter.cpp (+3-1) ``diff diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 49b44893c25f2..6a520dc9e7062 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5703,6 +5703,11 @@ def print_supported_extensions : Flag<["-", "--"], "print-supported-extensions"> Visibility<[ClangOption, CC1Option, CLOption]>, HelpText<"Print supported -march extensions (RISC-V, AArch64 and ARM only)">, MarshallingInfoFlag>; +def print_enabled_extensions : Flag<["-", "--"], "print-enabled-extensions">, + Visibility<[ClangOption, CC1Option, CLOption]>, + HelpText<"Print the -march/-mcpu extensions enabled for the given target" + " (AArch64 only)">, + MarshallingInfoFlag>; def : Flag<["-"], "mcpu=help">, Alias; def : Flag<["-"], "mtune=help">, Alias; def time : Flag<["-"], "time">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index ebb8e9e59c6b6..5e5034fe01eb5 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -306,6 +306,10 @@ class FrontendOptions { LLVM_PREFERRED_TYPE(bool) unsigned PrintSupportedExtensions : 1; + /// Print the extensions enabled for the current target. + LLVM_PREFERRED_TYPE(bool) + unsigned PrintEnabledExtensions : 1; + /// Show the -version text. LLVM_PREFERRED_TYPE(bool) unsigned ShowVersion : 1; diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index e125ad551f098..b2c3e839b7e6c 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1101,7 +1101,7 @@ bool AArch64TargetInfo::initFeatureMap( std::optional Extension = llvm::AArch64::parseArchExtension(Feature.substr(1)); if (Extension) - UpdatedFeature = Extension->Feature.str(); + UpdatedFeature = Extension->TargetFeature.str(); } UpdatedFeaturesVec.push_back(UpdatedFeature); } diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp index cfb4b5f58ef72..51a7221db8b83 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -966,8 +966,8 @@ void AArch64ABIInfo::appendAttributeMangling(StringRef AttrStr, llvm::SmallDenseSet UniqueFeats; for (auto : Features) if (auto Ext