[clang] [llvm] [AArch64] Add ability to list extensions enabled for a target (PR #95805)

2024-06-24 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-24 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-24 Thread Jon Roelofs via cfe-commits


@@ -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)

2024-06-24 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-24 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits

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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-24 Thread Tomas Matheson via cfe-commits

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)

2024-06-19 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Jon Roelofs via cfe-commits


@@ -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)

2024-06-18 Thread David Green via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits

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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Tomas Matheson via cfe-commits

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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread David Spickett via cfe-commits


@@ -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)

2024-06-18 Thread David Spickett via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread David Spickett via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread Lucas Duarte Prates via cfe-commits


@@ -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)

2024-06-18 Thread David Spickett via cfe-commits


@@ -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)

2024-06-18 Thread David Green via cfe-commits


@@ -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)

2024-06-18 Thread David Green via cfe-commits


@@ -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)

2024-06-17 Thread Jonathan Thackray via cfe-commits

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)

2024-06-17 Thread Jon Roelofs via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits

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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread Tomas Matheson via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits

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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread David Spickett via cfe-commits

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)

2024-06-17 Thread David Spickett via cfe-commits

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)

2024-06-17 Thread David Spickett via cfe-commits


@@ -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)

2024-06-17 Thread via cfe-commits

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)

2024-06-17 Thread Lucas Duarte Prates via cfe-commits

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)

2024-06-17 Thread via cfe-commits

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)

2024-06-17 Thread via cfe-commits

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