[flang] [clang] [mlir] [clang-tools-extra] [libcxx] [libc] [compiler-rt] [llvm] [AsmWriter] Ensure getMnemonic doesn't return invalid pointers (PR #75783)

2023-12-19 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.

LGMT, surprised this didn't blow up earlier.

https://github.com/llvm/llvm-project/pull/75783
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-19 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm created 
https://github.com/llvm/llvm-project/pull/75947

- [AArch64] add missing test case for v9.4-A
- [AArch64] Add FEAT_PAuthLR assembler support
- [AArch64] Codegen support for FEAT_PAuthLR


>From 3b1722f0cf3c0dd80ca5736724c77c36608b112b Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 2 Feb 2023 13:19:05 +
Subject: [PATCH 1/3] [AArch64] add missing test case for v9.4-A

---
 clang/test/Preprocessor/aarch64-target-features.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1

>From df263e1d4aab1f099cdedfdc37670eb17c65696c Mon Sep 17 00:00:00 2001
From: Oliver Stannard 
Date: Wed, 1 Feb 2023 18:16:07 +
Subject: [PATCH 2/3] [AArch64] Add FEAT_PAuthLR assembler support

Add assembly/disassembly support for the new PAuthLR instructions
introduced in Armv9.5-A:

- AUTIASPPC/AUTIBSPPC
- PACIASPPC/PACIBSPPC
- PACNBIASPPC/PACNBIBSPPC
- RETAASPPC/RETABSPPC
- PACM

Documentation for these instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/
---
 llvm/lib/Target/AArch64/AArch64.td|   9 +-
 .../lib/Target/AArch64/AArch64InstrFormats.td |  74 +
 llvm/lib/Target/AArch64/AArch64InstrInfo.td   |  39 +
 llvm/lib/Target/AArch64/AArch64SchedA64FX.td  |   2 +-
 .../Target/AArch64/AArch64SchedNeoverseN2.td  |   2 +-
 .../AArch64/AsmParser/AArch64AsmParser.cpp|  28 
 .../Disassembler/AArch64Disassembler.cpp  |  18 +++
 .../MCTargetDesc/AArch64AsmBackend.cpp|  14 ++
 .../MCTargetDesc/AArch64ELFObjectWriter.cpp   |   4 +
 .../AArch64/MCTargetDesc/AArch64FixupKinds.h  |   5 +
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp |  28 
 .../MC/AArch64/armv9.5a-pauthlr-diagnostics.s |  57 +++
 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s |  12 ++
 llvm/test/MC/AArch64/armv9.5a-pauthlr.s   | 151 ++
 .../Disassembler/AArch64/armv9.5a-pauthlr.txt |  78 +
 15 files changed, 517 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-diagnostics.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr.s
 create mode 100644 llvm/test/MC/Disassembler/AArch64/armv9.5a-pauthlr.txt

diff --git a/llvm/lib/Target/AArch64/AArch64.td 
b/llvm/lib/Target/AArch64/AArch64.td
index d1dbced2466eae..f727da0fdb765d 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -622,8 +622,13 @@ def FeatureLdpAlignedOnly : 
SubtargetFeature<"ldp-aligned-only", "HasLdpAlignedO
 def FeatureStpAlignedOnly : SubtargetFeature<"stp-aligned-only", 
"HasStpAlignedOnly",
 "true", "In order to emit stp, first check if the store will be aligned to 
2 * element_size">;
 
+// AArch64 2023 Architecture Extensions (v9.5-A)
+
 def FeatureCPA : SubtargetFeature<"cpa", "HasCPA", "true",
-  "Enable ARMv9.5-A Checked Pointer Arithmetic (FEAT_CPA)">;
+  "Enable Armv9.5-A Checked Pointer Arithmetic (FEAT_CPA)">;
+
+def FeaturePAuthLR : SubtargetFeature<"pauth-lr", "HasPAuthLR",
+"true", "Enable Armv9.5-A PAC enhancements (FEAT_PAuth_LR)">;
 
 
//===--===//
 // Architectures.
@@ -810,7 +815,7 @@ def SMEUnsupported : AArch64Unsupported {
   SME2Unsupported.F);
 }
 
-let F = [HasPAuth] in
+let F = [HasPAuth, HasPAuthLR] in
 def PAUnsupported : AArch64Unsupported;
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td 
b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 690ac0dcda6212..cb63d8726744d4 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -2368,6 +2368,80 @@ class Clea

[clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-19 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/75947

>From d3201659d87260acaf1d20a96705e290caf21693 Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 2 Feb 2023 13:19:05 +
Subject: [PATCH 1/3] [AArch64] add missing test case for v9.4-A

---
 clang/test/Preprocessor/aarch64-target-features.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1

>From 1d4208d53830e0ef8dadad9be12e7ef2b53c6190 Mon Sep 17 00:00:00 2001
From: Oliver Stannard 
Date: Wed, 1 Feb 2023 18:16:07 +
Subject: [PATCH 2/3] [AArch64] Add FEAT_PAuthLR assembler support

Add assembly/disassembly support for the new PAuthLR instructions
introduced in Armv9.5-A:

- AUTIASPPC/AUTIBSPPC
- PACIASPPC/PACIBSPPC
- PACNBIASPPC/PACNBIBSPPC
- RETAASPPC/RETABSPPC
- PACM

Documentation for these instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/
---
 llvm/lib/Target/AArch64/AArch64.td|   7 +-
 .../lib/Target/AArch64/AArch64InstrFormats.td |  74 +
 llvm/lib/Target/AArch64/AArch64InstrInfo.td   |  39 +
 llvm/lib/Target/AArch64/AArch64SchedA64FX.td  |   2 +-
 .../Target/AArch64/AArch64SchedNeoverseN2.td  |   2 +-
 .../AArch64/AsmParser/AArch64AsmParser.cpp|  28 
 .../Disassembler/AArch64Disassembler.cpp  |  18 +++
 .../MCTargetDesc/AArch64AsmBackend.cpp|  14 ++
 .../MCTargetDesc/AArch64ELFObjectWriter.cpp   |   4 +
 .../AArch64/MCTargetDesc/AArch64FixupKinds.h  |   5 +
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp |  28 
 .../MC/AArch64/armv9.5a-pauthlr-diagnostics.s |  57 +++
 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s |  12 ++
 llvm/test/MC/AArch64/armv9.5a-pauthlr.s   | 151 ++
 .../Disassembler/AArch64/armv9.5a-pauthlr.txt |  78 +
 15 files changed, 516 insertions(+), 3 deletions(-)
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-diagnostics.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr.s
 create mode 100644 llvm/test/MC/Disassembler/AArch64/armv9.5a-pauthlr.txt

diff --git a/llvm/lib/Target/AArch64/AArch64.td 
b/llvm/lib/Target/AArch64/AArch64.td
index c600bcaab2b3ea..95e171109b4eb0 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -622,6 +622,11 @@ def FeatureLdpAlignedOnly : 
SubtargetFeature<"ldp-aligned-only", "HasLdpAlignedO
 def FeatureStpAlignedOnly : SubtargetFeature<"stp-aligned-only", 
"HasStpAlignedOnly",
 "true", "In order to emit stp, first check if the store will be aligned to 
2 * element_size">;
 
+// AArch64 2023 Architecture Extensions (v9.5-A)
+
+def FeaturePAuthLR : SubtargetFeature<"pauth-lr", "HasPAuthLR",
+"true", "Enable Armv9.5-A PAC enhancements (FEAT_PAuth_LR)">;
+
 
//===--===//
 // Architectures.
 //
@@ -807,7 +812,7 @@ def SMEUnsupported : AArch64Unsupported {
   SME2Unsupported.F);
 }
 
-let F = [HasPAuth] in
+let F = [HasPAuth, HasPAuthLR] in
 def PAUnsupported : AArch64Unsupported;
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td 
b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 68e87f491a09e4..92bf9f4ec2a21b 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -2368,6 +2368,80 @@ class ClearAuth data, string asm>
   let Inst{4-0} = Rd;
 }
 
+// v9.5-A FEAT_PAuth_LR
+
+class SignAuthFixedRegs opcode2, bits<6> opcode, string asm>
+  : I<(outs), (ins), asm, "", "", []>,
+Sched<[WriteI, ReadI]> {
+  let Inst{31} = 0b1; // sf
+  let Inst{30} = 0b1;
+  let Inst{29} = 0b0; // S
+  let Inst{28-21} = 0b1101011

[lldb] [clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-19 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/75947

>From d3201659d87260acaf1d20a96705e290caf21693 Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 2 Feb 2023 13:19:05 +
Subject: [PATCH 1/3] [AArch64] add missing test case for v9.4-A

---
 clang/test/Preprocessor/aarch64-target-features.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1

>From 1d4208d53830e0ef8dadad9be12e7ef2b53c6190 Mon Sep 17 00:00:00 2001
From: Oliver Stannard 
Date: Wed, 1 Feb 2023 18:16:07 +
Subject: [PATCH 2/3] [AArch64] Add FEAT_PAuthLR assembler support

Add assembly/disassembly support for the new PAuthLR instructions
introduced in Armv9.5-A:

- AUTIASPPC/AUTIBSPPC
- PACIASPPC/PACIBSPPC
- PACNBIASPPC/PACNBIBSPPC
- RETAASPPC/RETABSPPC
- PACM

Documentation for these instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/
---
 llvm/lib/Target/AArch64/AArch64.td|   7 +-
 .../lib/Target/AArch64/AArch64InstrFormats.td |  74 +
 llvm/lib/Target/AArch64/AArch64InstrInfo.td   |  39 +
 llvm/lib/Target/AArch64/AArch64SchedA64FX.td  |   2 +-
 .../Target/AArch64/AArch64SchedNeoverseN2.td  |   2 +-
 .../AArch64/AsmParser/AArch64AsmParser.cpp|  28 
 .../Disassembler/AArch64Disassembler.cpp  |  18 +++
 .../MCTargetDesc/AArch64AsmBackend.cpp|  14 ++
 .../MCTargetDesc/AArch64ELFObjectWriter.cpp   |   4 +
 .../AArch64/MCTargetDesc/AArch64FixupKinds.h  |   5 +
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp |  28 
 .../MC/AArch64/armv9.5a-pauthlr-diagnostics.s |  57 +++
 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s |  12 ++
 llvm/test/MC/AArch64/armv9.5a-pauthlr.s   | 151 ++
 .../Disassembler/AArch64/armv9.5a-pauthlr.txt |  78 +
 15 files changed, 516 insertions(+), 3 deletions(-)
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-diagnostics.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr.s
 create mode 100644 llvm/test/MC/Disassembler/AArch64/armv9.5a-pauthlr.txt

diff --git a/llvm/lib/Target/AArch64/AArch64.td 
b/llvm/lib/Target/AArch64/AArch64.td
index c600bcaab2b3ea..95e171109b4eb0 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -622,6 +622,11 @@ def FeatureLdpAlignedOnly : 
SubtargetFeature<"ldp-aligned-only", "HasLdpAlignedO
 def FeatureStpAlignedOnly : SubtargetFeature<"stp-aligned-only", 
"HasStpAlignedOnly",
 "true", "In order to emit stp, first check if the store will be aligned to 
2 * element_size">;
 
+// AArch64 2023 Architecture Extensions (v9.5-A)
+
+def FeaturePAuthLR : SubtargetFeature<"pauth-lr", "HasPAuthLR",
+"true", "Enable Armv9.5-A PAC enhancements (FEAT_PAuth_LR)">;
+
 
//===--===//
 // Architectures.
 //
@@ -807,7 +812,7 @@ def SMEUnsupported : AArch64Unsupported {
   SME2Unsupported.F);
 }
 
-let F = [HasPAuth] in
+let F = [HasPAuth, HasPAuthLR] in
 def PAUnsupported : AArch64Unsupported;
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td 
b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 68e87f491a09e4..92bf9f4ec2a21b 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -2368,6 +2368,80 @@ class ClearAuth data, string asm>
   let Inst{4-0} = Rd;
 }
 
+// v9.5-A FEAT_PAuth_LR
+
+class SignAuthFixedRegs opcode2, bits<6> opcode, string asm>
+  : I<(outs), (ins), asm, "", "", []>,
+Sched<[WriteI, ReadI]> {
+  let Inst{31} = 0b1; // sf
+  let Inst{30} = 0b1;
+  let Inst{29} = 0b0; // S
+  let Inst{28-21} = 0b1101011

[clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-19 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/75947

>From a6039367acca5de4c925925c1cefc56097ae496a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 2 Feb 2023 13:19:05 +
Subject: [PATCH 1/3] [AArch64] add missing test case for v9.4-A

---
 clang/test/Preprocessor/aarch64-target-features.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1

>From b84addbf39d1734f1b860dba1e9a6acab3558ae7 Mon Sep 17 00:00:00 2001
From: Oliver Stannard 
Date: Wed, 1 Feb 2023 18:16:07 +
Subject: [PATCH 2/3] [AArch64] Add FEAT_PAuthLR assembler support

Add assembly/disassembly support for the new PAuthLR instructions
introduced in Armv9.5-A:

- AUTIASPPC/AUTIBSPPC
- PACIASPPC/PACIBSPPC
- PACNBIASPPC/PACNBIBSPPC
- RETAASPPC/RETABSPPC
- PACM

Documentation for these instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/
---
 llvm/lib/Target/AArch64/AArch64.td|   7 +-
 .../lib/Target/AArch64/AArch64InstrFormats.td |  74 +
 llvm/lib/Target/AArch64/AArch64InstrInfo.td   |  39 +
 llvm/lib/Target/AArch64/AArch64SchedA64FX.td  |   2 +-
 .../Target/AArch64/AArch64SchedNeoverseN2.td  |   2 +-
 .../AArch64/AsmParser/AArch64AsmParser.cpp|  28 
 .../Disassembler/AArch64Disassembler.cpp  |  18 +++
 .../MCTargetDesc/AArch64AsmBackend.cpp|  14 ++
 .../MCTargetDesc/AArch64ELFObjectWriter.cpp   |   4 +
 .../AArch64/MCTargetDesc/AArch64FixupKinds.h  |   5 +
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp |  28 
 .../MC/AArch64/armv9.5a-pauthlr-diagnostics.s |  57 +++
 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s |  12 ++
 llvm/test/MC/AArch64/armv9.5a-pauthlr.s   | 151 ++
 .../Disassembler/AArch64/armv9.5a-pauthlr.txt |  78 +
 15 files changed, 516 insertions(+), 3 deletions(-)
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-diagnostics.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr.s
 create mode 100644 llvm/test/MC/Disassembler/AArch64/armv9.5a-pauthlr.txt

diff --git a/llvm/lib/Target/AArch64/AArch64.td 
b/llvm/lib/Target/AArch64/AArch64.td
index c600bcaab2b3ea..95e171109b4eb0 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -622,6 +622,11 @@ def FeatureLdpAlignedOnly : 
SubtargetFeature<"ldp-aligned-only", "HasLdpAlignedO
 def FeatureStpAlignedOnly : SubtargetFeature<"stp-aligned-only", 
"HasStpAlignedOnly",
 "true", "In order to emit stp, first check if the store will be aligned to 
2 * element_size">;
 
+// AArch64 2023 Architecture Extensions (v9.5-A)
+
+def FeaturePAuthLR : SubtargetFeature<"pauth-lr", "HasPAuthLR",
+"true", "Enable Armv9.5-A PAC enhancements (FEAT_PAuth_LR)">;
+
 
//===--===//
 // Architectures.
 //
@@ -807,7 +812,7 @@ def SMEUnsupported : AArch64Unsupported {
   SME2Unsupported.F);
 }
 
-let F = [HasPAuth] in
+let F = [HasPAuth, HasPAuthLR] in
 def PAUnsupported : AArch64Unsupported;
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td 
b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 68e87f491a09e4..92bf9f4ec2a21b 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -2368,6 +2368,80 @@ class ClearAuth data, string asm>
   let Inst{4-0} = Rd;
 }
 
+// v9.5-A FEAT_PAuth_LR
+
+class SignAuthFixedRegs opcode2, bits<6> opcode, string asm>
+  : I<(outs), (ins), asm, "", "", []>,
+Sched<[WriteI, ReadI]> {
+  let Inst{31} = 0b1; // sf
+  let Inst{30} = 0b1;
+  let Inst{29} = 0b0; // S
+  let Inst{28-21} = 0b1101011

[clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-19 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/75947

>From a6039367acca5de4c925925c1cefc56097ae496a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 2 Feb 2023 13:19:05 +
Subject: [PATCH 1/3] [AArch64] add missing test case for v9.4-A

---
 clang/test/Preprocessor/aarch64-target-features.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1

>From a5baa372f55196fe6ac0fe7979fbd736ba82f411 Mon Sep 17 00:00:00 2001
From: Oliver Stannard 
Date: Wed, 1 Feb 2023 18:16:07 +
Subject: [PATCH 2/3] [AArch64] Add FEAT_PAuthLR assembler support

Add assembly/disassembly support for the new PAuthLR instructions
introduced in Armv9.5-A:

- AUTIASPPC/AUTIBSPPC
- PACIASPPC/PACIBSPPC
- PACNBIASPPC/PACNBIBSPPC
- RETAASPPC/RETABSPPC
- PACM

Documentation for these instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/
---
 llvm/lib/Target/AArch64/AArch64.td|   7 +-
 .../lib/Target/AArch64/AArch64InstrFormats.td |  74 +
 llvm/lib/Target/AArch64/AArch64InstrInfo.td   |  39 +
 llvm/lib/Target/AArch64/AArch64SchedA64FX.td  |   2 +-
 .../Target/AArch64/AArch64SchedNeoverseN2.td  |   2 +-
 .../AArch64/AsmParser/AArch64AsmParser.cpp|  28 
 .../Disassembler/AArch64Disassembler.cpp  |  18 +++
 .../MCTargetDesc/AArch64AsmBackend.cpp|  14 ++
 .../MCTargetDesc/AArch64ELFObjectWriter.cpp   |   4 +
 .../AArch64/MCTargetDesc/AArch64FixupKinds.h  |   5 +
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp |  29 
 .../MC/AArch64/armv9.5a-pauthlr-diagnostics.s |  57 +++
 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s |  12 ++
 llvm/test/MC/AArch64/armv9.5a-pauthlr.s   | 151 ++
 .../Disassembler/AArch64/armv9.5a-pauthlr.txt |  78 +
 15 files changed, 517 insertions(+), 3 deletions(-)
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-diagnostics.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr.s
 create mode 100644 llvm/test/MC/Disassembler/AArch64/armv9.5a-pauthlr.txt

diff --git a/llvm/lib/Target/AArch64/AArch64.td 
b/llvm/lib/Target/AArch64/AArch64.td
index c600bcaab2b3ea..95e171109b4eb0 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -622,6 +622,11 @@ def FeatureLdpAlignedOnly : 
SubtargetFeature<"ldp-aligned-only", "HasLdpAlignedO
 def FeatureStpAlignedOnly : SubtargetFeature<"stp-aligned-only", 
"HasStpAlignedOnly",
 "true", "In order to emit stp, first check if the store will be aligned to 
2 * element_size">;
 
+// AArch64 2023 Architecture Extensions (v9.5-A)
+
+def FeaturePAuthLR : SubtargetFeature<"pauth-lr", "HasPAuthLR",
+"true", "Enable Armv9.5-A PAC enhancements (FEAT_PAuth_LR)">;
+
 
//===--===//
 // Architectures.
 //
@@ -807,7 +812,7 @@ def SMEUnsupported : AArch64Unsupported {
   SME2Unsupported.F);
 }
 
-let F = [HasPAuth] in
+let F = [HasPAuth, HasPAuthLR] in
 def PAUnsupported : AArch64Unsupported;
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td 
b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 68e87f491a09e4..92bf9f4ec2a21b 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -2368,6 +2368,80 @@ class ClearAuth data, string asm>
   let Inst{4-0} = Rd;
 }
 
+// v9.5-A FEAT_PAuth_LR
+
+class SignAuthFixedRegs opcode2, bits<6> opcode, string asm>
+  : I<(outs), (ins), asm, "", "", []>,
+Sched<[WriteI, ReadI]> {
+  let Inst{31} = 0b1; // sf
+  let Inst{30} = 0b1;
+  let Inst{29} = 0b0; // S
+  let Inst{28-21} = 0b1101011

[clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-21 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/75947

>From 29eb3db45ac1782d6cdcff106bd6088f06bbc680 Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 2 Feb 2023 13:19:05 +
Subject: [PATCH 1/3] [AArch64] add missing test case for v9.4-A

---
 clang/test/Preprocessor/aarch64-target-features.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1

>From 6db8387da6aa6ad533559ee147e01b990c27deee Mon Sep 17 00:00:00 2001
From: Oliver Stannard 
Date: Wed, 1 Feb 2023 18:16:07 +
Subject: [PATCH 2/3] [AArch64] Add FEAT_PAuthLR assembler support

Add assembly/disassembly support for the new PAuthLR instructions
introduced in Armv9.5-A:

- AUTIASPPC/AUTIBSPPC
- PACIASPPC/PACIBSPPC
- PACNBIASPPC/PACNBIBSPPC
- RETAASPPC/RETABSPPC
- PACM

Documentation for these instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/
---
 llvm/lib/Target/AArch64/AArch64.td|   9 +-
 .../lib/Target/AArch64/AArch64InstrFormats.td |  74 +
 llvm/lib/Target/AArch64/AArch64InstrInfo.td   |  39 +
 llvm/lib/Target/AArch64/AArch64SchedA64FX.td  |   2 +-
 .../Target/AArch64/AArch64SchedNeoverseN2.td  |   2 +-
 .../AArch64/AsmParser/AArch64AsmParser.cpp|  28 
 .../Disassembler/AArch64Disassembler.cpp  |  18 +++
 .../MCTargetDesc/AArch64AsmBackend.cpp|  14 ++
 .../MCTargetDesc/AArch64ELFObjectWriter.cpp   |   4 +
 .../AArch64/MCTargetDesc/AArch64FixupKinds.h  |   5 +
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp |  29 
 .../MC/AArch64/armv9.5a-pauthlr-diagnostics.s |  57 +++
 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s |  12 ++
 llvm/test/MC/AArch64/armv9.5a-pauthlr.s   | 151 ++
 .../Disassembler/AArch64/armv9.5a-pauthlr.txt |  78 +
 15 files changed, 518 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-diagnostics.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr-reloc.s
 create mode 100644 llvm/test/MC/AArch64/armv9.5a-pauthlr.s
 create mode 100644 llvm/test/MC/Disassembler/AArch64/armv9.5a-pauthlr.txt

diff --git a/llvm/lib/Target/AArch64/AArch64.td 
b/llvm/lib/Target/AArch64/AArch64.td
index db92a94e40e4b5..97e92a57a7ff4b 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -622,8 +622,13 @@ def FeatureLdpAlignedOnly : 
SubtargetFeature<"ldp-aligned-only", "HasLdpAlignedO
 def FeatureStpAlignedOnly : SubtargetFeature<"stp-aligned-only", 
"HasStpAlignedOnly",
 "true", "In order to emit stp, first check if the store will be aligned to 
2 * element_size">;
 
+// AArch64 2023 Architecture Extensions (v9.5-A)
+
 def FeatureCPA : SubtargetFeature<"cpa", "HasCPA", "true",
-  "Enable ARMv9.5-A Checked Pointer Arithmetic (FEAT_CPA)">;
+"Enable Armv9.5-A Checked Pointer Arithmetic (FEAT_CPA)">;
+
+def FeaturePAuthLR : SubtargetFeature<"pauth-lr", "HasPAuthLR",
+"true", "Enable Armv9.5-A PAC enhancements (FEAT_PAuth_LR)">;
 
 
//===--===//
 // Architectures.
@@ -810,7 +815,7 @@ def SMEUnsupported : AArch64Unsupported {
   SME2Unsupported.F);
 }
 
-let F = [HasPAuth] in
+let F = [HasPAuth, HasPAuthLR] in
 def PAUnsupported : AArch64Unsupported;
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td 
b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 690ac0dcda6212..cb63d8726744d4 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -2368,6 +2368,80 @@ class ClearAuth data, string asm>
   let Inst{4-0} = Rd;
 }
 
+// v9.5-A FEAT_PAuth_LR
+
+class SignAuthFixedRegs opcode2, bits<6> opcode, string a

[clang] 92dc23c - [AArch64] add missing test case for v9.4-A

2023-12-21 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2023-12-21T14:18:33Z
New Revision: 92dc23c0e054183e8adf41aad2a2609cefc392c0

URL: 
https://github.com/llvm/llvm-project/commit/92dc23c0e054183e8adf41aad2a2609cefc392c0
DIFF: 
https://github.com/llvm/llvm-project/commit/92dc23c0e054183e8adf41aad2a2609cefc392c0.diff

LOG: [AArch64] add missing test case for v9.4-A

Added: 


Modified: 
clang/test/Preprocessor/aarch64-target-features.c

Removed: 




diff  --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index db89aa7b608ad5..b3da54162da04b 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -600,6 +600,7 @@
 // RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
+// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | 
FileCheck 
--check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
 // CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
 // CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 5992ce9 - [AArch64] Codegen support for FEAT_PAuthLR

2023-12-21 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2023-12-21T14:18:33Z
New Revision: 5992ce90b8c0fac06436c3c86621fbf6d5398ee5

URL: 
https://github.com/llvm/llvm-project/commit/5992ce90b8c0fac06436c3c86621fbf6d5398ee5
DIFF: 
https://github.com/llvm/llvm-project/commit/5992ce90b8c0fac06436c3c86621fbf6d5398ee5.diff

LOG: [AArch64] Codegen support for FEAT_PAuthLR

- Adds a new +pc option to -mbranch-protection that will enable
  the use of PC as a diversifier in PAC branch protection code.

- When +pauth-lr is enabled (-march=armv9.5a+pauth-lr) in combination
  with -mbranch-protection=pac-ret+pc, the new 9.5-a instructions
  (pacibsppc, retaasppc, etc) are used.

Documentation for the relevant instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions/

Co-authored-by: Lucas Prates 

Added: 
clang/test/Driver/aarch64-pauth-lr.c
llvm/test/CodeGen/AArch64/sign-return-address-pauth-lr.ll

Modified: 
clang/include/clang/Basic/LangOptions.def
clang/include/clang/Basic/TargetInfo.h
clang/include/clang/Driver/Options.td
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/ARM.cpp
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/Targets/AArch64.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/CodeGen/aarch64-branch-protection-attr.c
clang/test/Driver/aarch64-v95a.c
llvm/include/llvm/TargetParser/AArch64TargetParser.h
llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h
llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
llvm/lib/TargetParser/ARMTargetParserCommon.cpp
llvm/test/CodeGen/AArch64/sign-return-address.ll
llvm/unittests/TargetParser/TargetParserTest.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 152d9f65f86dbe..21abc346cf17ac 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -456,6 +456,7 @@ ENUM_LANGOPT(SignReturnAddressScope, 
SignReturnAddressScopeKind, 2, SignReturnAd
 ENUM_LANGOPT(SignReturnAddressKey, SignReturnAddressKeyKind, 1, 
SignReturnAddressKeyKind::AKey,
  "Key used for return address signing")
 LANGOPT(BranchTargetEnforcement, 1, 0, "Branch-target enforcement enabled")
+LANGOPT(BranchProtectionPAuthLR, 1, 0, "Use PC as a diversifier using PAuthLR 
NOP instructions.")
 
 LANGOPT(SpeculativeLoadHardening, 1, 0, "Speculative load hardening enabled")
 

diff  --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index aa0f5023104a1a..ac3c324c6c29c4 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1372,6 +1372,7 @@ class TargetInfo : public TransferrableTargetInfo,
 LangOptions::SignReturnAddressKeyKind SignKey =
 LangOptions::SignReturnAddressKeyKind::AKey;
 bool BranchTargetEnforcement = false;
+bool BranchProtectionPAuthLR = false;
   };
 
   /// Determine if the Architecture in this TargetInfo supports branch

diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 1b02087425b751..965d402af2d7b3 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6999,6 +6999,8 @@ def msign_return_address_key_EQ : Joined<["-"], 
"msign-return-address-key=">,
 Values<"a_key,b_key">;
 def mbranch_target_enforce : Flag<["-"], "mbranch-target-enforce">,
   MarshallingInfoFlag>;
+def mbranch_protection_pauth_lr : Flag<["-"], "mbranch-protection-pauth-lr">,
+  MarshallingInfoFlag>;
 def fno_dllexport_inlines : Flag<["-"], "fno-dllexport-inlines">,
   MarshallingInfoNegativeFlag>;
 def cfguard_no_checks : Flag<["-"], "cfguard-no-checks">,

diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index def16c032c869e..3ee39133fcee72 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -225,6 +225,7 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 BPI.SignKey = LangOptions::SignReturnAddressKeyKind::BKey;
 
   BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
+  BPI.BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
   return true;
 }
 

diff  --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..6e1842fc64e505 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -419,6 +419,7 @@ bool ARMTargetInfo::validateBranchProtection(StringRef 
Spec, StringRef Arch,
   BPI.SignKey = LangOptions::SignReturnAddressKeyKind::AKey;
 
   BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
+  BPI.BranchProtectionPAuthLR = PBP.BranchProtec

[clang] [llvm] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-21 Thread Tomas Matheson via cfe-commits

tmatheson-arm wrote:

Manually merged to avoid squashing the commits:
92dc23c0e054183e8adf41aad2a2609cefc392c0
934b1099cbf14fa3f86a269dff957da8e5fb619f
5992ce90b8c0fac06436c3c86621fbf6d5398ee5


https://github.com/llvm/llvm-project/pull/75947
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [AArch64] Support for 9.5-A PAuthLR (PR #75947)

2023-12-21 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm closed 
https://github.com/llvm/llvm-project/pull/75947
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 9f0f558 - Revert "[AArch64] Codegen support for FEAT_PAuthLR"

2023-12-21 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2023-12-21T16:25:55Z
New Revision: 9f0f5587426a4ff24b240018cf8bf3acc3c566ae

URL: 
https://github.com/llvm/llvm-project/commit/9f0f5587426a4ff24b240018cf8bf3acc3c566ae
DIFF: 
https://github.com/llvm/llvm-project/commit/9f0f5587426a4ff24b240018cf8bf3acc3c566ae.diff

LOG: Revert "[AArch64] Codegen support for FEAT_PAuthLR"

This reverts commit 5992ce90b8c0fac06436c3c86621fbf6d5398ee5.

Builtbot failures with expensive checks enabled.

Added: 


Modified: 
clang/include/clang/Basic/LangOptions.def
clang/include/clang/Basic/TargetInfo.h
clang/include/clang/Driver/Options.td
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/ARM.cpp
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/Targets/AArch64.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/CodeGen/aarch64-branch-protection-attr.c
clang/test/Driver/aarch64-v95a.c
llvm/include/llvm/TargetParser/AArch64TargetParser.h
llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h
llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
llvm/lib/TargetParser/ARMTargetParserCommon.cpp
llvm/test/CodeGen/AArch64/sign-return-address.ll
llvm/unittests/TargetParser/TargetParserTest.cpp

Removed: 
clang/test/Driver/aarch64-pauth-lr.c
llvm/test/CodeGen/AArch64/sign-return-address-pauth-lr.ll



diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 21abc346cf17ac..152d9f65f86dbe 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -456,7 +456,6 @@ ENUM_LANGOPT(SignReturnAddressScope, 
SignReturnAddressScopeKind, 2, SignReturnAd
 ENUM_LANGOPT(SignReturnAddressKey, SignReturnAddressKeyKind, 1, 
SignReturnAddressKeyKind::AKey,
  "Key used for return address signing")
 LANGOPT(BranchTargetEnforcement, 1, 0, "Branch-target enforcement enabled")
-LANGOPT(BranchProtectionPAuthLR, 1, 0, "Use PC as a diversifier using PAuthLR 
NOP instructions.")
 
 LANGOPT(SpeculativeLoadHardening, 1, 0, "Speculative load hardening enabled")
 

diff  --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ac3c324c6c29c4..aa0f5023104a1a 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1372,7 +1372,6 @@ class TargetInfo : public TransferrableTargetInfo,
 LangOptions::SignReturnAddressKeyKind SignKey =
 LangOptions::SignReturnAddressKeyKind::AKey;
 bool BranchTargetEnforcement = false;
-bool BranchProtectionPAuthLR = false;
   };
 
   /// Determine if the Architecture in this TargetInfo supports branch

diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 2b93ddf033499c..9678165bfd98e8 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -7000,8 +7000,6 @@ def msign_return_address_key_EQ : Joined<["-"], 
"msign-return-address-key=">,
 Values<"a_key,b_key">;
 def mbranch_target_enforce : Flag<["-"], "mbranch-target-enforce">,
   MarshallingInfoFlag>;
-def mbranch_protection_pauth_lr : Flag<["-"], "mbranch-protection-pauth-lr">,
-  MarshallingInfoFlag>;
 def fno_dllexport_inlines : Flag<["-"], "fno-dllexport-inlines">,
   MarshallingInfoNegativeFlag>;
 def cfguard_no_checks : Flag<["-"], "cfguard-no-checks">,

diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 3ee39133fcee72..def16c032c869e 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -225,7 +225,6 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 BPI.SignKey = LangOptions::SignReturnAddressKeyKind::BKey;
 
   BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
-  BPI.BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
   return true;
 }
 

diff  --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 6e1842fc64e505..ce7e4d4639ceac 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -419,7 +419,6 @@ bool ARMTargetInfo::validateBranchProtection(StringRef 
Spec, StringRef Arch,
   BPI.SignKey = LangOptions::SignReturnAddressKeyKind::AKey;
 
   BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
-  BPI.BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
   return true;
 }
 

diff  --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index d78f2594a23764..b2e173d0d6949e 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1106,9 +1106,6 @@ void CodeGenModule::Release() {
 if (LangOpts.BranchTargetEnforcement)
 

[clang] 7bd1721 - Re-land "[AArch64] Codegen support for FEAT_PAuthLR" (#75947)

2023-12-21 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2023-12-21T18:32:55Z
New Revision: 7bd17212ef23a72ea224a037126d33d3e02553fe

URL: 
https://github.com/llvm/llvm-project/commit/7bd17212ef23a72ea224a037126d33d3e02553fe
DIFF: 
https://github.com/llvm/llvm-project/commit/7bd17212ef23a72ea224a037126d33d3e02553fe.diff

LOG: Re-land "[AArch64] Codegen support for FEAT_PAuthLR" (#75947)

This reverts commit 9f0f5587426a4ff24b240018cf8bf3acc3c566ae.

Fix expensive checks failure by properly marking register def for ADR.

Added: 
clang/test/Driver/aarch64-pauth-lr.c
llvm/test/CodeGen/AArch64/sign-return-address-pauth-lr.ll

Modified: 
clang/include/clang/Basic/LangOptions.def
clang/include/clang/Basic/TargetInfo.h
clang/include/clang/Driver/Options.td
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/ARM.cpp
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/Targets/AArch64.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/CodeGen/aarch64-branch-protection-attr.c
clang/test/Driver/aarch64-v95a.c
llvm/include/llvm/TargetParser/AArch64TargetParser.h
llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h
llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
llvm/lib/TargetParser/ARMTargetParserCommon.cpp
llvm/test/CodeGen/AArch64/sign-return-address.ll
llvm/unittests/TargetParser/TargetParserTest.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 152d9f65f86dbe..21abc346cf17ac 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -456,6 +456,7 @@ ENUM_LANGOPT(SignReturnAddressScope, 
SignReturnAddressScopeKind, 2, SignReturnAd
 ENUM_LANGOPT(SignReturnAddressKey, SignReturnAddressKeyKind, 1, 
SignReturnAddressKeyKind::AKey,
  "Key used for return address signing")
 LANGOPT(BranchTargetEnforcement, 1, 0, "Branch-target enforcement enabled")
+LANGOPT(BranchProtectionPAuthLR, 1, 0, "Use PC as a diversifier using PAuthLR 
NOP instructions.")
 
 LANGOPT(SpeculativeLoadHardening, 1, 0, "Speculative load hardening enabled")
 

diff  --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index aa0f5023104a1a..ac3c324c6c29c4 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1372,6 +1372,7 @@ class TargetInfo : public TransferrableTargetInfo,
 LangOptions::SignReturnAddressKeyKind SignKey =
 LangOptions::SignReturnAddressKeyKind::AKey;
 bool BranchTargetEnforcement = false;
+bool BranchProtectionPAuthLR = false;
   };
 
   /// Determine if the Architecture in this TargetInfo supports branch

diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 9678165bfd98e8..2b93ddf033499c 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -7000,6 +7000,8 @@ def msign_return_address_key_EQ : Joined<["-"], 
"msign-return-address-key=">,
 Values<"a_key,b_key">;
 def mbranch_target_enforce : Flag<["-"], "mbranch-target-enforce">,
   MarshallingInfoFlag>;
+def mbranch_protection_pauth_lr : Flag<["-"], "mbranch-protection-pauth-lr">,
+  MarshallingInfoFlag>;
 def fno_dllexport_inlines : Flag<["-"], "fno-dllexport-inlines">,
   MarshallingInfoNegativeFlag>;
 def cfguard_no_checks : Flag<["-"], "cfguard-no-checks">,

diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index def16c032c869e..3ee39133fcee72 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -225,6 +225,7 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 BPI.SignKey = LangOptions::SignReturnAddressKeyKind::BKey;
 
   BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
+  BPI.BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
   return true;
 }
 

diff  --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..6e1842fc64e505 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -419,6 +419,7 @@ bool ARMTargetInfo::validateBranchProtection(StringRef 
Spec, StringRef Arch,
   BPI.SignKey = LangOptions::SignReturnAddressKeyKind::AKey;
 
   BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
+  BPI.BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
   return true;
 }
 

diff  --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index b2e173d0d6949e..d78f2594a23764 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1106,6 +1106,9 @@ void CodeGenModule::Release() {
 if (LangOpt

[llvm] [clang] [AArch64] Assembly support for the Armv9.5-A Memory System Extensions (PR #76237)

2023-12-22 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/76237
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM][AArch64] Add branch protection attributes to the defaults. (PR #83277)

2024-02-28 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/83277
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [NFC][ARM][AArch64] Deduplicated code. (PR #82785)

2024-02-28 Thread Tomas Matheson via cfe-commits


@@ -1369,13 +1369,20 @@ class TargetInfo : public TransferrableTargetInfo,
   }
 
   struct BranchProtectionInfo {
-LangOptions::SignReturnAddressScopeKind SignReturnAddr =
-LangOptions::SignReturnAddressScopeKind::None;
-LangOptions::SignReturnAddressKeyKind SignKey =
-LangOptions::SignReturnAddressKeyKind::AKey;
-bool BranchTargetEnforcement = false;
-bool BranchProtectionPAuthLR = false;
-bool GuardedControlStack = false;
+LangOptions::SignReturnAddressScopeKind SignReturnAddr;
+LangOptions::SignReturnAddressKeyKind SignKey;
+bool BranchTargetEnforcement;
+bool BranchProtectionPAuthLR;
+bool GuardedControlStack;
+
+BranchProtectionInfo() = default;
+
+const char *getSignReturnAddrStr() const {
+  static const char *SignReturnAddrStr[] = {"none", "non-leaf", "all"};
+  assert(static_cast(SignReturnAddr) <= 2 &&
+ "Unexpected SignReturnAddressScopeKind");
+  return SignReturnAddrStr[static_cast(SignReturnAddr)];
+}

tmatheson-arm wrote:

```suggestion
const char *getSignReturnAddrStr() const {
switch (SignReturnAddr) {
  case None:
return "none";
  case NonLeaf:
return "non-leaf";
  case All:
return "all";
  }
  assert(false && "Unexpected SignReturnAddressScopeKind");
}
```

https://github.com/llvm/llvm-project/pull/82785
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [NFC][ARM][AArch64] Deduplicated code. (PR #82785)

2024-02-28 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/82785
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM][AArch64] Add branch protection attributes to the defaults. (PR #83277)

2024-02-28 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.


https://github.com/llvm/llvm-project/pull/83277
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [flang] [clang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [llvm] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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

https://github.com/tmatheson-arm commented:

This looks like a great improvement over the existing system to me.

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -3,8 +3,7 @@
 // FEAT_D128 is optional (off by default) for v9.4a and older, and can be 
enabled using +d128
 // RUN: %clang -### --target=aarch64-none-elf -march=armv9.4-a%s 2>&1 
| FileCheck %s --check-prefix=NOT_ENABLED
 // RUN: %clang -### --target=aarch64-none-elf -march=armv9.4-a+d128   %s 2>&1 
| FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### --target=aarch64-none-elf -march=armv9.4-a+nod128 %s 2>&1 
| FileCheck %s --check-prefix=DISABLED
+// RUN: %clang -### --target=aarch64-none-elf -march=armv9.4-a+nod128 %s 2>&1 
| FileCheck %s --check-prefix=NOT_ENABLED
 
 // ENABLED: "-target-feature" "+d128"
 // NOT_ENABLED-NOT: "-target-feature" "+d128"
-// DISABLED: "-target-feature" "-d128"

tmatheson-arm wrote:

So features that are explicitly disabled with a `+noXYZ` will no longer appear 
in the `-cc1` command line as `-taget-feature -XYZ`? Is that always the case, 
what about for features that are on by default?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -308,6 +312,104 @@ inline constexpr ExtensionInfo Extensions[] = {
 };
 // clang-format on
 
+struct ExtensionSet {
+  // Set of extensions which are currently enabled.
+  ExtensionBitset Enabled;
+  // Set of extensions which have been enabled or disabled at any point. Used
+  // to avoid cluttering the cc1 command-line with lots of unneeded features.
+  ExtensionBitset Touched;
+  // Base architecture version, which we need to know because some feature
+  // dependencies change depending on this.
+  const ArchInfo *BaseArch;
+
+  ExtensionSet() : Enabled(), Touched(), BaseArch(nullptr) {}
+
+  // Enable the given architecture extension, and any other extensions it
+  // depends on. Does not change the base architecture, or follow dependencies
+  // between features which are only related by required arcitecture versions.
+  void enable(ArchExtKind E);
+
+  // Disable the given architecture extension, and any other extensions which
+  // depend on it. Does not change the base architecture, or follow
+  // dependencies between features which are only related by required
+  // arcitecture versions.
+  void disable(ArchExtKind E);
+
+  // Add default extensions for the given CPU. Records the base architecture,
+  // to later resolve dependencies which depend on it.
+  void addCPUDefaults(const CpuInfo &CPU);
+
+  // Add default extensions for the given architecture version. Records the
+  // base architecture, to later resolve dependencies which depend on it.
+  void addArchDefaults(const ArchInfo &Arch);
+
+  // Add or remove a feature based on a modifier string. The string must be of

tmatheson-arm wrote:

I'm a bit unclear on the terminology. Often "extension" is taken to mean 
something which has an entry in `ArchExtKind`, whereas "feature" is an LLVM 
backend feature. In the Arm ARM they are referred to as extensions and there is 
no concept of features.

Should this be "Add or remove an extension"?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [llvm] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -1,20 +1,21 @@
 // RAS is off by default for v8a, but can be enabled by +ras (this is not 
architecturally valid)
 // RUN: %clang --target=aarch64-none-elf -march=armv8a+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
+// RUN: %clang --target=aarch64-none-elf -march=armv8.2a+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -march=armv8-a+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -mcpu=generic+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -mcpu=cortex-a75 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -mcpu=cortex-a55 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // CHECK-RAS: "-target-feature" "+ras"
 
-// RUN: %clang --target=aarch64-none-elf -march=armv8a+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-NORAS %s
-// RUN: %clang --target=aarch64-none-elf -mcpu=generic+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-NORAS %s
-// CHECK-NORAS: "-target-feature" "-ras"
+// RUN: %clang --target=aarch64-none-elf -march=armv8a+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ABSENT %s
+// RUN: %clang --target=aarch64-none-elf -mcpu=generic+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ABSENT %s
+// CHECK-ABSENT-NOT: "-target-feature" ++ras"

tmatheson-arm wrote:

typo?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -150,3 +153,137 @@ void 
AArch64::PrintSupportedExtensions(StringMap DescMap) {
 }
   }
 }
+
+const llvm::AArch64::ExtensionInfo &
+lookupExtensionByID(llvm::AArch64::ArchExtKind ExtID) {
+  for (const auto &E : llvm::AArch64::Extensions)
+if (E.ID == ExtID)
+  return E;
+  assert(false && "Invalid extension ID");
+}
+
+void AArch64::ExtensionSet::enable(ArchExtKind E) {
+  if (Enabled.test(E))
+return;
+
+  LLVM_DEBUG(llvm::dbgs() << "Enable " << lookupExtensionByID(E).Name << "\n");
+
+  Touched.set(E);
+  Enabled.set(E);
+
+  // Recursively enable all features that this one depends on. This handles all
+  // of the simple cases, where the behaviour doesn't depend on the base
+  // architecture version.
+  for (auto Dep : ExtensionDependencies)
+if (E == Dep.Later)
+  enable(Dep.Earlier);
+
+  // Special cases for dependencies which vary depending on the base
+  // architecture version.
+  if (BaseArch) {
+// +sve implies +f32mm if the base architecture is v8.6A+ or v9.1A+
+// It isn't the case in general that sve implies both f64mm and f32mm
+if (E == AEK_SVE && BaseArch->is_superset(ARMV8_6A))
+  enable(AEK_F32MM);
+
+// +fp16 implies +fp16fml for v8.4A+, but not v9.0-A+
+if (E == AEK_FP16 && BaseArch->is_superset(ARMV8_4A) &&
+!BaseArch->is_superset(ARMV9A))
+  enable(AEK_FP16FML);
+
+// For all architectures, +crypto enables +aes and +sha2.
+if (E == AEK_CRYPTO) {
+  enable(AEK_AES);
+  enable(AEK_SHA2);
+}
+
+// For v8.4A+ and v9.0A+, +crypto also enables +sha3 and +sm4.
+if (E == AEK_CRYPTO && BaseArch->is_superset(ARMV8_4A)) {
+  enable(AEK_SHA3);
+  enable(AEK_SM4);
+}
+  }
+}
+
+void AArch64::ExtensionSet::disable(ArchExtKind E) {
+  // -crypto always disables aes, sha2, sha3 and sm4, even for architectures
+  // where the latter two would not be enabled by +crypto.
+  if (E == AEK_CRYPTO) {
+disable(AEK_AES);
+disable(AEK_SHA2);
+disable(AEK_SHA3);
+disable(AEK_SM4);
+  }
+
+  if (!Enabled.test(E))
+return;

tmatheson-arm wrote:

Does it matter that this won't disable dependent extensions, like it would do 
if the current extension was enabled?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -1,25 +1,25 @@
 // RUN: %clang --target=aarch64 -### -c %s 2>&1 | FileCheck 
-check-prefix=GENERIC-V8A %s
 // RUN: %clang --target=aarch64 -march=armv8-a -### -c %s 2>&1 | FileCheck 
-check-prefix=GENERIC-V8A %s
-// GENERIC-V8A: "-cc1"{{.*}} "-triple" "aarch64{{(--)?}}"{{.*}} "-target-cpu" 
"generic" "-target-feature" "+neon" "-target-feature" "+v8a"
+// GENERIC-V8A: "-cc1"{{.*}} "-triple" "aarch64{{(--)?}}"{{.*}} "-target-cpu" 
"generic" "-target-feature" "+v8a"

tmatheson-arm wrote:

Is something specific happening with neon/noneon, and shouldn't it be checked 
for here?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -150,3 +153,137 @@ void 
AArch64::PrintSupportedExtensions(StringMap DescMap) {
 }
   }
 }
+
+const llvm::AArch64::ExtensionInfo &
+lookupExtensionByID(llvm::AArch64::ArchExtKind ExtID) {
+  for (const auto &E : llvm::AArch64::Extensions)
+if (E.ID == ExtID)
+  return E;
+  assert(false && "Invalid extension ID");
+}
+
+void AArch64::ExtensionSet::enable(ArchExtKind E) {
+  if (Enabled.test(E))
+return;
+
+  LLVM_DEBUG(llvm::dbgs() << "Enable " << lookupExtensionByID(E).Name << "\n");
+
+  Touched.set(E);
+  Enabled.set(E);
+
+  // Recursively enable all features that this one depends on. This handles all
+  // of the simple cases, where the behaviour doesn't depend on the base
+  // architecture version.
+  for (auto Dep : ExtensionDependencies)
+if (E == Dep.Later)
+  enable(Dep.Earlier);

tmatheson-arm wrote:

One concern I have is that `ExtensionDependencies` expresses the dependencies 
as a directed graph, but in reality we probably just want a tree, as this code 
assumes.

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [flang] [clang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -1,9 +1,9 @@
 // RUN: %clang -### --target=aarch64-none-elf -march=armv8.4a+memtag %s 2>&1 | 
FileCheck %s
 // RUN: %clang -### --target=aarch64-none-elf -march=armv8.5a+memtag %s 2>&1 | 
FileCheck %s
+// RUN: %clang -### --target=aarch64-none-elf -mcpu=cortex-a510 %s 2>&1 | 
FileCheck %s
 // CHECK: "-target-feature" "+mte"
 
-// RUN: %clang -### --target=aarch64-none-elf -march=armv8.4a+nomemtag %s 2>&1 
| FileCheck %s --check-prefix=NOMTE
-// RUN: %clang -### --target=aarch64-none-elf -march=armv8.5a+nomemtag %s 2>&1 
| FileCheck %s --check-prefix=NOMTE
+// RUN: %clang -### --target=aarch64-none-elf -mcpu=cortex-a510+nomemtag %s 
2>&1 | FileCheck %s --check-prefix=NOMTE

tmatheson-arm wrote:

This seems like a material change to what is being tested, it might be better 
split out. (Applies to several files where `-march` has been substituted with 
`-mcpu`)

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -150,3 +153,137 @@ void 
AArch64::PrintSupportedExtensions(StringMap DescMap) {
 }
   }
 }
+
+const llvm::AArch64::ExtensionInfo &
+lookupExtensionByID(llvm::AArch64::ArchExtKind ExtID) {
+  for (const auto &E : llvm::AArch64::Extensions)
+if (E.ID == ExtID)
+  return E;
+  assert(false && "Invalid extension ID");
+}
+
+void AArch64::ExtensionSet::enable(ArchExtKind E) {
+  if (Enabled.test(E))
+return;
+
+  LLVM_DEBUG(llvm::dbgs() << "Enable " << lookupExtensionByID(E).Name << "\n");
+
+  Touched.set(E);
+  Enabled.set(E);
+
+  // Recursively enable all features that this one depends on. This handles all
+  // of the simple cases, where the behaviour doesn't depend on the base
+  // architecture version.
+  for (auto Dep : ExtensionDependencies)
+if (E == Dep.Later)
+  enable(Dep.Earlier);
+
+  // Special cases for dependencies which vary depending on the base
+  // architecture version.
+  if (BaseArch) {
+// +sve implies +f32mm if the base architecture is v8.6A+ or v9.1A+
+// It isn't the case in general that sve implies both f64mm and f32mm
+if (E == AEK_SVE && BaseArch->is_superset(ARMV8_6A))
+  enable(AEK_F32MM);
+
+// +fp16 implies +fp16fml for v8.4A+, but not v9.0-A+
+if (E == AEK_FP16 && BaseArch->is_superset(ARMV8_4A) &&
+!BaseArch->is_superset(ARMV9A))
+  enable(AEK_FP16FML);
+
+// For all architectures, +crypto enables +aes and +sha2.
+if (E == AEK_CRYPTO) {
+  enable(AEK_AES);
+  enable(AEK_SHA2);
+}
+
+// For v8.4A+ and v9.0A+, +crypto also enables +sha3 and +sm4.
+if (E == AEK_CRYPTO && BaseArch->is_superset(ARMV8_4A)) {
+  enable(AEK_SHA3);
+  enable(AEK_SM4);
+}
+  }
+}
+
+void AArch64::ExtensionSet::disable(ArchExtKind E) {
+  // -crypto always disables aes, sha2, sha3 and sm4, even for architectures
+  // where the latter two would not be enabled by +crypto.
+  if (E == AEK_CRYPTO) {
+disable(AEK_AES);
+disable(AEK_SHA2);
+disable(AEK_SHA3);
+disable(AEK_SM4);
+  }
+
+  if (!Enabled.test(E))
+return;
+
+  LLVM_DEBUG(llvm::dbgs() << "Disable " << lookupExtensionByID(E).Name << 
"\n");
+
+  Touched.set(E);
+  Enabled.reset(E);
+
+  // Recursively disable all features that depends on this one.
+  for (auto Dep : ExtensionDependencies)
+if (E == Dep.Earlier)
+  disable(Dep.Later);
+}
+
+void AArch64::ExtensionSet::toLLVMFeatureList(
+std::vector &Features) const {
+  if (BaseArch && !BaseArch->ArchFeature.empty())
+Features.push_back(BaseArch->ArchFeature);
+
+  for (const auto &E : Extensions) {
+if (E.Feature.empty() || !Touched.test(E.ID))
+  continue;
+if (Enabled.test(E.ID))
+  Features.push_back(E.Feature);
+else
+  Features.push_back(E.NegFeature);

tmatheson-arm wrote:

When exactly do we need negative features?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [llvm] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -711,10 +819,10 @@ StringRef getArchExtFeature(StringRef ArchExt);
 StringRef resolveCPUAlias(StringRef CPU);
 
 // Information by Name
-std::optional getArchForCpu(StringRef CPU);

tmatheson-arm wrote:

Why the switch back to raw pointers from std::optional? This seems to undo what 
was done in https://reviews.llvm.org/D142539

Does this new implementation rely on there being one global copy of `ArchInfo`? 
A while back I tried to make this work so that `ArchInfo::operator==` made use 
of this address, but that ended up being unworkable so we switched to allowing 
copying of `ArchInfo` objects.

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -1,49 +1,51 @@
 // RUN: %clang -target aarch64-linux-gnu -march=armv8-a+sme %s -### 2>&1 | 
FileCheck %s --check-prefix=SME-IMPLY
-// SME-IMPLY: "-target-feature" "+sme" "-target-feature" "+bf16"
+// SME-IMPLY: "-target-feature" "+bf16"{{.*}} "-target-feature" "+sme"
 
 // RUN: %clang -target aarch64-linux-gnu -march=armv8-a+nosme %s -### 2>&1 | 
FileCheck %s --check-prefix=NOSME
-// NOSME: "-target-feature" "-sme"
+// NOSME-NOT: "-target-feature" "{{\+|-}}sme"
 
 // RUN: %clang -target aarch64-linux-gnu -march=armv8-a+sme+nosme %s -### 2>&1 
| FileCheck %s --check-prefix=SME-REVERT
 // SME-REVERT-NOT: "-target-feature" "+sme"
-// SME-REVERT: "-target-feature" "+bf16" "-target-feature" "-sme" 
"-target-feature" "-sme-f64f64" "-target-feature" "-sme-i16i64"
+// SME-REVERT: "-target-feature" "+bf16"{{.*}} "-target-feature" "-sme"

tmatheson-arm wrote:

So here, `+sme+nosme` should no longer explicitly remove `sme-f64f64` etc, 
which are dependencies of `+sme`, instead they default to off and are not 
mentioned on the `-cc1` command line? In other words, there is no behaviour 
change here, iiuc.

Do we have any later checks that the features are reassembled correctly? Checks 
for preprocessor macros maybe.

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -308,6 +312,104 @@ inline constexpr ExtensionInfo Extensions[] = {
 };
 // clang-format on
 
+struct ExtensionSet {
+  // Set of extensions which are currently enabled.
+  ExtensionBitset Enabled;
+  // Set of extensions which have been enabled or disabled at any point. Used
+  // to avoid cluttering the cc1 command-line with lots of unneeded features.
+  ExtensionBitset Touched;
+  // Base architecture version, which we need to know because some feature
+  // dependencies change depending on this.
+  const ArchInfo *BaseArch;

tmatheson-arm wrote:

What does this point to exactly? What owns the thing it points to?

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [flang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -1,20 +1,21 @@
 // RAS is off by default for v8a, but can be enabled by +ras (this is not 
architecturally valid)
 // RUN: %clang --target=aarch64-none-elf -march=armv8a+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
+// RUN: %clang --target=aarch64-none-elf -march=armv8.2a+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -march=armv8-a+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -mcpu=generic+ras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -mcpu=cortex-a75 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // RUN: %clang --target=aarch64-none-elf -mcpu=cortex-a55 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-RAS %s
 // CHECK-RAS: "-target-feature" "+ras"
 
-// RUN: %clang --target=aarch64-none-elf -march=armv8a+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-NORAS %s
-// RUN: %clang --target=aarch64-none-elf -mcpu=generic+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-NORAS %s
-// CHECK-NORAS: "-target-feature" "-ras"
+// RUN: %clang --target=aarch64-none-elf -march=armv8a+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ABSENT %s
+// RUN: %clang --target=aarch64-none-elf -mcpu=generic+noras -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ABSENT %s
+// CHECK-ABSENT-NOT: "-target-feature" ++ras"
 
 // RAS is on by default for v8.2a, but can be disabled by +noras
-// FIXME: in the current implementation, RAS is not on by default at all for 
v8.2a (the test says it all...)
-// RUN: %clang --target=aarch64 -march=armv8.2a  -### -c %s 2>&1 | FileCheck 
-check-prefix=V82ARAS %s
-// RUN: %clang --target=aarch64 -march=armv8.2-a -### -c %s 2>&1 | FileCheck 
-check-prefix=V82ARAS %s
+// RUN: %clang --target=aarch64 -march=armv8.2a  -### -c %s 2>&1 | FileCheck 
-check-prefix=CHECK-RAS %s
+// RUN: %clang --target=aarch64 -march=armv8.2-a -### -c %s 2>&1 | FileCheck 
-check-prefix=CHECK-RAS %s
 // V82ARAS-NOT: "-target-feature" "+ras"
 // V82ARAS-NOT: "-target-feature" "-ras"

tmatheson-arm wrote:

This check-prefix is no longer in use

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [llvm] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -3,15 +3,14 @@
 // FEAT_ITE is optional (off by default) for v8.9a/9.4a and older, and can be 
enabled using +ite
 // RUN: %clang -### --target=aarch64-none-elf -march=armv8.8-a   %s 2>&1 | 
FileCheck %s --check-prefix=NOT_ENABLED
 // RUN: %clang -### --target=aarch64-none-elf -march=armv8.8-a+ite   %s 2>&1 | 
FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### --target=aarch64-none-elf -march=armv8.8-a+noite %s 2>&1 | 
FileCheck %s --check-prefix=DISABLED
+// RUN: %clang -### --target=aarch64-none-elf -march=armv8.8-a+noite %s 2>&1 | 
FileCheck %s --check-prefix=NOT_ENABLED
 // RUN: %clang -### --target=aarch64-none-elf -march=armv9.3-a   %s 2>&1 | 
FileCheck %s --check-prefix=NOT_ENABLED
 // RUN: %clang -### --target=aarch64-none-elf -march=armv9.3-a+ite   %s 2>&1 | 
FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### --target=aarch64-none-elf -march=armv9.3-a+noite %s 2>&1 | 
FileCheck %s --check-prefix=DISABLED
+// RUN: %clang -### --target=aarch64-none-elf -march=armv9.3-a+noite %s 2>&1 | 
FileCheck %s --check-prefix=NOT_ENABLED
 
 // FEAT_ITE is invalid before v8
 // RUN: not %clang -### --target=arm-none-none-eabi -march=armv7-a+ite %s 
2>&1 | FileCheck %s --check-prefix=INVALID
 
 // INVALID: error: unsupported argument 'armv7-a+ite' to option '-march='
 // ENABLED: "-target-feature" "+ite"
 // NOT_ENABLED-NOT: "-target-feature" "+ite"

tmatheson-arm wrote:

Should this also check that the negative case isn't present? (Applies to many 
other files too.)

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [llvm] [clang] [AArch64][Driver] Better handling of target feature dependencies (PR #78270)

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


@@ -150,3 +153,137 @@ void 
AArch64::PrintSupportedExtensions(StringMap DescMap) {
 }
   }
 }
+
+const llvm::AArch64::ExtensionInfo &
+lookupExtensionByID(llvm::AArch64::ArchExtKind ExtID) {
+  for (const auto &E : llvm::AArch64::Extensions)
+if (E.ID == ExtID)
+  return E;
+  assert(false && "Invalid extension ID");
+}
+
+void AArch64::ExtensionSet::enable(ArchExtKind E) {
+  if (Enabled.test(E))
+return;
+
+  LLVM_DEBUG(llvm::dbgs() << "Enable " << lookupExtensionByID(E).Name << "\n");
+
+  Touched.set(E);
+  Enabled.set(E);
+
+  // Recursively enable all features that this one depends on. This handles all
+  // of the simple cases, where the behaviour doesn't depend on the base
+  // architecture version.
+  for (auto Dep : ExtensionDependencies)
+if (E == Dep.Later)
+  enable(Dep.Earlier);
+
+  // Special cases for dependencies which vary depending on the base
+  // architecture version.
+  if (BaseArch) {
+// +sve implies +f32mm if the base architecture is v8.6A+ or v9.1A+
+// It isn't the case in general that sve implies both f64mm and f32mm
+if (E == AEK_SVE && BaseArch->is_superset(ARMV8_6A))
+  enable(AEK_F32MM);
+
+// +fp16 implies +fp16fml for v8.4A+, but not v9.0-A+
+if (E == AEK_FP16 && BaseArch->is_superset(ARMV8_4A) &&
+!BaseArch->is_superset(ARMV9A))
+  enable(AEK_FP16FML);
+
+// For all architectures, +crypto enables +aes and +sha2.
+if (E == AEK_CRYPTO) {
+  enable(AEK_AES);
+  enable(AEK_SHA2);
+}
+
+// For v8.4A+ and v9.0A+, +crypto also enables +sha3 and +sm4.
+if (E == AEK_CRYPTO && BaseArch->is_superset(ARMV8_4A)) {
+  enable(AEK_SHA3);
+  enable(AEK_SM4);
+}
+  }

tmatheson-arm wrote:

This logic is so much nicer than what we currently have.

https://github.com/llvm/llvm-project/pull/78270
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 01b9e61 - [Clang][Codegen] Truncate initializers of union bitfield members

2021-01-28 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2021-01-28T09:19:19Z
New Revision: 01b9e613c28b833327ab4de93d0638a5c8d3514f

URL: 
https://github.com/llvm/llvm-project/commit/01b9e613c28b833327ab4de93d0638a5c8d3514f
DIFF: 
https://github.com/llvm/llvm-project/commit/01b9e613c28b833327ab4de93d0638a5c8d3514f.diff

LOG: [Clang][Codegen] Truncate initializers of union bitfield members

If an initial value is given for a bitfield that does not fit in the
bitfield, the value should be truncated. Constant folding for
expressions did not account for this truncation in the case of union
member functions, despite a warning being emitted. In some contexts,
evaluation of expressions was not enabled unless C++11, ROPI or RWPI
was enabled.

Differential Revision: https://reviews.llvm.org/D93101

Added: 


Modified: 
clang/lib/AST/ExprConstant.cpp
clang/test/CodeGenCXX/bitfield-layout.cpp

Removed: 




diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index c1973720e49a..0f0c33b0ac85 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -9798,7 +9798,14 @@ bool RecordExprEvaluator::VisitInitListExpr(const 
InitListExpr *E) {
 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This,
   isa(InitExpr));
 
-return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr);
+if (EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr)) {
+  if (Field->isBitField())
+return truncateBitfieldValue(Info, InitExpr, Result.getUnionValue(),
+ Field);
+  return true;
+}
+
+return false;
   }
 
   if (!Result.hasValue())

diff  --git a/clang/test/CodeGenCXX/bitfield-layout.cpp 
b/clang/test/CodeGenCXX/bitfield-layout.cpp
index 49b196253f3c..79dbf9c691c4 100644
--- a/clang/test/CodeGenCXX/bitfield-layout.cpp
+++ b/clang/test/CodeGenCXX/bitfield-layout.cpp
@@ -2,6 +2,7 @@
 // RUN: %clang_cc1 %s -triple=i386-apple-darwin10 -emit-llvm -o - -O3 | 
FileCheck %s
 // RUN: %clang_cc1 %s -triple=aarch64_be-none-eabi -emit-llvm -o - -O3 | 
FileCheck %s
 // RUN: %clang_cc1 %s -triple=thumbv7_be-none-eabi -emit-llvm -o - -O3 | 
FileCheck %s
+// RUN: %clang_cc1 %s -triple=x86_64-unknown-unknown -emit-llvm -o - -O3 
-std=c++11 | FileCheck -check-prefix=CHECK -check-prefix=CHECK-LP64 %s
 
 // CHECK-LP64: %union.Test1 = type { i32, [4 x i8] }
 union Test1 {
@@ -84,3 +85,68 @@ int test_init() {
   // CHECK: ret i32 0
   return 0;
 }
+
+extern "C" {
+int test_trunc_int() {
+  union {
+int i : 4; // truncated to 0b == -1
+  } const U = {15};  // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_int()
+// CHECK: ret i32 -1
+
+int test_trunc_three_bits() {
+  union {
+int i : 3; // truncated to 0b111 == -1
+  } const U = {15};  // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_three_bits()
+// CHECK: ret i32 -1
+
+int test_trunc_1() {
+  union {
+int i : 1; // truncated to 0b1 == -1
+  } const U = {15};  // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_1()
+// CHECK: ret i32 -1
+
+int test_trunc_zero() {
+  union {
+int i : 4; // truncated to 0b == 0
+  } const U = {80};  // 0b0101
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_zero()
+// CHECK: ret i32 0
+
+int test_constexpr() {
+  union {
+int i : 3;   // truncated to 0b111 == -1
+  } const U = {1 + 2 + 4 + 8}; // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_constexpr()
+// CHECK: ret i32 -1
+
+int test_notrunc() {
+  union {
+int i : 12;  // not truncated
+  } const U = {1 + 2 + 4 + 8}; // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_notrunc()
+// CHECK: ret i32 15
+
+long long test_trunc_long_long() {
+  union {
+long long i : 14; // truncated to 0b0001001101 ==
+  } const U = {0b010001001101};
+  return U.i;
+}
+// CHECK: define dso_local i64 @test_trunc_long_long()
+// CHECK: ret i64 3917
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 01b9e61 - [Clang][Codegen] Truncate initializers of union bitfield members

2021-01-28 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2021-01-28T09:19:19Z
New Revision: 01b9e613c28b833327ab4de93d0638a5c8d3514f

URL: 
https://github.com/llvm/llvm-project/commit/01b9e613c28b833327ab4de93d0638a5c8d3514f
DIFF: 
https://github.com/llvm/llvm-project/commit/01b9e613c28b833327ab4de93d0638a5c8d3514f.diff

LOG: [Clang][Codegen] Truncate initializers of union bitfield members

If an initial value is given for a bitfield that does not fit in the
bitfield, the value should be truncated. Constant folding for
expressions did not account for this truncation in the case of union
member functions, despite a warning being emitted. In some contexts,
evaluation of expressions was not enabled unless C++11, ROPI or RWPI
was enabled.

Differential Revision: https://reviews.llvm.org/D93101

Added: 


Modified: 
clang/lib/AST/ExprConstant.cpp
clang/test/CodeGenCXX/bitfield-layout.cpp

Removed: 




diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index c1973720e49a..0f0c33b0ac85 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -9798,7 +9798,14 @@ bool RecordExprEvaluator::VisitInitListExpr(const 
InitListExpr *E) {
 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This,
   isa(InitExpr));
 
-return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr);
+if (EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr)) {
+  if (Field->isBitField())
+return truncateBitfieldValue(Info, InitExpr, Result.getUnionValue(),
+ Field);
+  return true;
+}
+
+return false;
   }
 
   if (!Result.hasValue())

diff  --git a/clang/test/CodeGenCXX/bitfield-layout.cpp 
b/clang/test/CodeGenCXX/bitfield-layout.cpp
index 49b196253f3c..79dbf9c691c4 100644
--- a/clang/test/CodeGenCXX/bitfield-layout.cpp
+++ b/clang/test/CodeGenCXX/bitfield-layout.cpp
@@ -2,6 +2,7 @@
 // RUN: %clang_cc1 %s -triple=i386-apple-darwin10 -emit-llvm -o - -O3 | 
FileCheck %s
 // RUN: %clang_cc1 %s -triple=aarch64_be-none-eabi -emit-llvm -o - -O3 | 
FileCheck %s
 // RUN: %clang_cc1 %s -triple=thumbv7_be-none-eabi -emit-llvm -o - -O3 | 
FileCheck %s
+// RUN: %clang_cc1 %s -triple=x86_64-unknown-unknown -emit-llvm -o - -O3 
-std=c++11 | FileCheck -check-prefix=CHECK -check-prefix=CHECK-LP64 %s
 
 // CHECK-LP64: %union.Test1 = type { i32, [4 x i8] }
 union Test1 {
@@ -84,3 +85,68 @@ int test_init() {
   // CHECK: ret i32 0
   return 0;
 }
+
+extern "C" {
+int test_trunc_int() {
+  union {
+int i : 4; // truncated to 0b == -1
+  } const U = {15};  // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_int()
+// CHECK: ret i32 -1
+
+int test_trunc_three_bits() {
+  union {
+int i : 3; // truncated to 0b111 == -1
+  } const U = {15};  // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_three_bits()
+// CHECK: ret i32 -1
+
+int test_trunc_1() {
+  union {
+int i : 1; // truncated to 0b1 == -1
+  } const U = {15};  // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_1()
+// CHECK: ret i32 -1
+
+int test_trunc_zero() {
+  union {
+int i : 4; // truncated to 0b == 0
+  } const U = {80};  // 0b0101
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_trunc_zero()
+// CHECK: ret i32 0
+
+int test_constexpr() {
+  union {
+int i : 3;   // truncated to 0b111 == -1
+  } const U = {1 + 2 + 4 + 8}; // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_constexpr()
+// CHECK: ret i32 -1
+
+int test_notrunc() {
+  union {
+int i : 12;  // not truncated
+  } const U = {1 + 2 + 4 + 8}; // 0b
+  return U.i;
+}
+// CHECK: define dso_local i32 @test_notrunc()
+// CHECK: ret i32 15
+
+long long test_trunc_long_long() {
+  union {
+long long i : 14; // truncated to 0b0001001101 ==
+  } const U = {0b010001001101};
+  return U.i;
+}
+// CHECK: define dso_local i64 @test_trunc_long_long()
+// CHECK: ret i64 3917
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 103bbdd - [ARM] Move Triple::getARMCPUForArch into ARMTargetParser

2022-11-09 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-11-09T11:52:35Z
New Revision: 103bbddde66f4157b52c2b6d7532c1dd0dfcaf94

URL: 
https://github.com/llvm/llvm-project/commit/103bbddde66f4157b52c2b6d7532c1dd0dfcaf94
DIFF: 
https://github.com/llvm/llvm-project/commit/103bbddde66f4157b52c2b6d7532c1dd0dfcaf94.diff

LOG: [ARM] Move Triple::getARMCPUForArch into ARMTargetParser

This is very backend specific so either belongs in Toolchains/ARM or in
ARMTargetParser. Since it is used in lldb, ARMTargetParser made more sense.

This is part of an effort to move information about ARM/AArch64 architecture
versions, extensions and CPUs into their respective TargetParsers.

Differential Revision: https://reviews.llvm.org/D137564

Added: 


Modified: 
clang/lib/Driver/ToolChains/Arch/ARM.cpp
lldb/source/Utility/ArchSpec.cpp
llvm/include/llvm/ADT/Triple.h
llvm/include/llvm/Support/ARMTargetParser.h
llvm/lib/Support/ARMTargetParser.cpp
llvm/lib/Support/Triple.cpp
llvm/unittests/ADT/TripleTest.cpp
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp 
b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index 67dec7cadada5..bbf466ba847de 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -938,7 +938,7 @@ StringRef arm::getARMCPUForMArch(StringRef Arch, const 
llvm::Triple &Triple) {
 
   // We need to return an empty string here on invalid MArch values as the
   // various places that call this function can't cope with a null result.
-  return Triple.getARMCPUForArch(MArch);
+  return llvm::ARM::getARMCPUForArch(Triple, MArch);
 }
 
 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
@@ -971,7 +971,8 @@ llvm::ARM::ArchKind arm::getLLVMArchKindForARM(StringRef 
CPU, StringRef Arch,
 if (ArchKind == llvm::ARM::ArchKind::INVALID)
   // In case of generic Arch, i.e. "arm",
   // extract arch from default cpu of the Triple
-  ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
+  ArchKind =
+  llvm::ARM::parseCPUArch(llvm::ARM::getARMCPUForArch(Triple, 
ARMArch));
   } else {
 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
 // armv7k triple if it's actually been specified via "-arch armv7k".

diff  --git a/lldb/source/Utility/ArchSpec.cpp 
b/lldb/source/Utility/ArchSpec.cpp
index 126bedc209232..e1d7ee3ee276d 100644
--- a/lldb/source/Utility/ArchSpec.cpp
+++ b/lldb/source/Utility/ArchSpec.cpp
@@ -16,6 +16,7 @@
 #include "llvm/BinaryFormat/COFF.h"
 #include "llvm/BinaryFormat/ELF.h"
 #include "llvm/BinaryFormat/MachO.h"
+#include "llvm/Support/ARMTargetParser.h"
 #include "llvm/Support/Compiler.h"
 
 using namespace lldb;
@@ -638,7 +639,7 @@ std::string ArchSpec::GetClangTargetCPU() const {
   }
 
   if (GetTriple().isARM())
-cpu = GetTriple().getARMCPUForArch("").str();
+cpu = llvm::ARM::getARMCPUForArch(GetTriple(), "").str();
   return cpu;
 }
 

diff  --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h
index dc96398dba999..5aba2730c5a8b 100644
--- a/llvm/include/llvm/ADT/Triple.h
+++ b/llvm/include/llvm/ADT/Triple.h
@@ -1024,12 +1024,6 @@ class Triple {
   ///  architecture if no such variant can be found.
   llvm::Triple getLittleEndianArchVariant() const;
 
-  /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
-  ///
-  /// \param Arch the architecture name (e.g., "armv7s"). If it is an empty
-  /// string then the triple's arch name is used.
-  StringRef getARMCPUForArch(StringRef Arch = StringRef()) const;
-
   /// Tests whether the target triple is little endian.
   ///
   /// \returns true if the triple is little endian, false otherwise.

diff  --git a/llvm/include/llvm/Support/ARMTargetParser.h 
b/llvm/include/llvm/Support/ARMTargetParser.h
index 5fb4090395c07..32cc31db5936a 100644
--- a/llvm/include/llvm/Support/ARMTargetParser.h
+++ b/llvm/include/llvm/Support/ARMTargetParser.h
@@ -296,6 +296,12 @@ unsigned parseArchVersion(StringRef Arch);
 void fillValidCPUArchList(SmallVectorImpl &Values);
 StringRef computeDefaultTargetABI(const Triple &TT, StringRef CPU);
 
+/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
+///
+/// \param Arch the architecture name (e.g., "armv7s"). If it is an empty
+/// string then the triple's arch name is used.
+StringRef getARMCPUForArch(const llvm::Triple &Triple, StringRef MArch = {});
+
 } // namespace ARM
 } // namespace llvm
 

diff  --git a/llvm/lib/Support/ARMTargetParser.cpp 
b/llvm/lib/Support/ARMTargetParser.cpp
index a68244a5e38af..43cbb409b0f04 100644
--- a/llvm/lib/Support/ARMTargetParser.cpp
+++ b/llvm/lib/Support/ARMTargetParser.cpp
@@ -643,3 +643,72 @@ StringRef ARM::computeDefaultTargetABI(const Triple &TT, 
StringRef CPU) {
 return "aapcs";
   }
 }
+
+StringRef ARM::getARMC

[clang] a6aaa96 - [AArch64] Assembly support for FEAT_LRCPC3

2022-11-25 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-11-25T18:59:07Z
New Revision: a6aaa969f7caec58a994142f8d855861cf3a1463

URL: 
https://github.com/llvm/llvm-project/commit/a6aaa969f7caec58a994142f8d855861cf3a1463
DIFF: 
https://github.com/llvm/llvm-project/commit/a6aaa969f7caec58a994142f8d855861cf3a1463.diff

LOG: [AArch64] Assembly support for FEAT_LRCPC3

This patch implements assembly support for the 2022 A-Profile Architecture
extension FEAT_LRCPC3. FEAT_LRCPC3 is AArch64 only and introduces new
variants of load/store instructions with release consistency ordering.

Specs for individual instructions can be found here:
https://developer.arm.com/documentation/ddi0602/2022-09/Base-Instructions/

This feature is optionally available from v8.2a and therefore not enabled by
default.

Contributors:
  Lucas Prates
  Sam Elliot
  Son Tuan Vu
  Tomas Matheson

Differential Revision: https://reviews.llvm.org/D138579

Added: 
clang/test/Driver/aarch64-lrcpc3.c
llvm/test/MC/AArch64/armv8.9a-lrcpc3.s
llvm/test/MC/Disassembler/AArch64/armv8.9a-lrcpc3.txt

Modified: 
llvm/include/llvm/Support/AArch64TargetParser.def
llvm/include/llvm/Support/AArch64TargetParser.h
llvm/lib/Target/AArch64/AArch64.td
llvm/lib/Target/AArch64/AArch64InstrFormats.td
llvm/lib/Target/AArch64/AArch64InstrInfo.td
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/test/MC/AArch64/arm64-memory.s
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/test/Driver/aarch64-lrcpc3.c 
b/clang/test/Driver/aarch64-lrcpc3.c
new file mode 100644
index 0..27b522d74c5f8
--- /dev/null
+++ b/clang/test/Driver/aarch64-lrcpc3.c
@@ -0,0 +1,26 @@
+// Test that target feature FEAT_RCPC3 is implemented and available correctly
+
+// FEAT_RCPC3 is optional for v8.2a onwards, and can be enabled with +rcpc3
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.9-a %s 
2>&1 | FileCheck %s --check-prefix=NOT_ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.9-a+rcpc3   %s 
2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.9-a+norcpc3 %s 
2>&1 | FileCheck %s --check-prefix=DISABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.4-a %s 
2>&1 | FileCheck %s --check-prefix=NOT_ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.4-a+rcpc3   %s 
2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.4-a+norcpc3 %s 
2>&1 | FileCheck %s --check-prefix=DISABLED
+
+// FEAT_RCPC3 is optional (off by default) for v8.8a/9.3a and older, and can 
be enabled using +rcpc3
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.2-a %s 
2>&1 | FileCheck %s --check-prefix=NOT_ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.2-a+rcpc3   %s 
2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.2-a+norcpc3 %s 
2>&1 | FileCheck %s --check-prefix=DISABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9-a %s 
2>&1 | FileCheck %s --check-prefix=NOT_ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9-a+rcpc3   %s 
2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9-a+norcpc3 %s 
2>&1 | FileCheck %s --check-prefix=DISABLED
+
+// FEAT_RCPC3 is invalid before v8
+// RUN: %clang -### -target arm-none-none-eabi -march=armv7-a+rcpc3 %s 
2>&1 | FileCheck %s --check-prefix=INVALID
+
+// INVALID: error: unsupported argument 'armv7-a+rcpc3' to option '-march='
+// ENABLED: "-target-feature" "+rcpc3"
+// NOT_ENABLED-NOT: "-target-feature" "+rcpc3"
+// DISABLED: "-target-feature" "-rcpc3"
+

diff  --git a/llvm/include/llvm/Support/AArch64TargetParser.def 
b/llvm/include/llvm/Support/AArch64TargetParser.def
index f016c9147a7bb..6fd68872e96c1 100644
--- a/llvm/include/llvm/Support/AArch64TargetParser.def
+++ b/llvm/include/llvm/Support/AArch64TargetParser.def
@@ -152,6 +152,7 @@ AARCH64_ARCH_EXT_NAME("hbc",  AArch64::AEK_HBC, 
"+hbc",
 AARCH64_ARCH_EXT_NAME("mops", AArch64::AEK_MOPS,"+mops",   
  "-mops")
 AARCH64_ARCH_EXT_NAME("pmuv3",AArch64::AEK_PERFMON, "+perfmon",
  "-perfmon")
 AARCH64_ARCH_EXT_NAME("cssc", AArch64::AEK_CSSC,"+cssc",   
  "-cssc")
+AARCH64_ARCH_EXT_NAME("rcpc3",AArch64::AEK_RCPC3,   "+rcpc3",  
  "-rcpc3")
 #undef AARCH64_ARCH_EXT_NAME
 
 #ifndef AARCH64_CPU_NAME

diff  --git a/llvm/include/llvm/Support/AArch64TargetParser.h 
b/llvm/include/llvm/Support/AArch64TargetParser.h
index 4d069a6b67831..3261e3f5b5eae 100644
--- a/llvm/include/llvm/Support/AArch64TargetParser.h
+++ b/llvm/include/llvm/Support/AArch64TargetParser.h
@@ -77,6 +77,7 @@ enum ArchEx

[clang] f57f086 - [AArch64TargetParser] getArchFeatures -> getArchFeature

2022-12-01 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-12-01T12:50:17Z
New Revision: f57f086714bc7a1399acf05d5ca1d665237cd725

URL: 
https://github.com/llvm/llvm-project/commit/f57f086714bc7a1399acf05d5ca1d665237cd725
DIFF: 
https://github.com/llvm/llvm-project/commit/f57f086714bc7a1399acf05d5ca1d665237cd725.diff

LOG: [AArch64TargetParser] getArchFeatures -> getArchFeature

Differential Revision: https://reviews.llvm.org/D138753

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Driver/ToolChains/Arch/AArch64.cpp
llvm/include/llvm/Support/AArch64TargetParser.h
llvm/lib/Support/AArch64TargetParser.cpp
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index fb3d0b553542a..c36e942cf46ac 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -810,12 +810,9 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  std::vector FeatureStrs;
-  if (ArchKind == llvm::AArch64::ArchKind::INVALID ||
-  !llvm::AArch64::getArchFeatures(ArchKind, FeatureStrs))
+  if (ArchKind == llvm::AArch64::ArchKind::INVALID)
 continue;
-  for (auto R : FeatureStrs)
-Ret.Features.push_back(R.str());
+  Ret.Features.push_back(llvm::AArch64::getArchFeature(ArchKind).str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
 } else if (Feature.startswith("cpu=")) {

diff  --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp 
b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index 2a5c4718d084a..2a1269316bc75 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -135,8 +135,9 @@ static bool DecodeAArch64Mcpu(const Driver &D, StringRef 
Mcpu, StringRef &CPU,
 Features.push_back("+neon");
   } else {
 ArchKind = llvm::AArch64::parseCPUArch(CPU);
-if (!llvm::AArch64::getArchFeatures(ArchKind, Features))
+if (ArchKind == llvm::AArch64::ArchKind::INVALID)
   return false;
+Features.push_back(llvm::AArch64::getArchFeature(ArchKind));
 
 uint64_t Extension = llvm::AArch64::getDefaultExtensions(CPU, ArchKind);
 if (!llvm::AArch64::getExtensionFeatures(Extension, Features))
@@ -160,9 +161,9 @@ getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef 
March,
   llvm::AArch64::ArchKind ArchKind = llvm::AArch64::parseArch(Split.first);
   if (Split.first == "native")
 ArchKind = 
llvm::AArch64::getCPUArchKind(llvm::sys::getHostCPUName().str());
-  if (ArchKind == llvm::AArch64::ArchKind::INVALID ||
-  !llvm::AArch64::getArchFeatures(ArchKind, Features))
+  if (ArchKind == llvm::AArch64::ArchKind::INVALID)
 return false;
+  Features.push_back(llvm::AArch64::getArchFeature(ArchKind));
 
   // Enable SVE2 by default on Armv9-A.
   // It can still be disabled if +nosve2 is present.

diff  --git a/llvm/include/llvm/Support/AArch64TargetParser.h 
b/llvm/include/llvm/Support/AArch64TargetParser.h
index ccee51f6bc1e8..5347c4e1f5e34 100644
--- a/llvm/include/llvm/Support/AArch64TargetParser.h
+++ b/llvm/include/llvm/Support/AArch64TargetParser.h
@@ -160,7 +160,7 @@ inline ArchKind &operator--(ArchKind &Kind) {
 
 bool getExtensionFeatures(uint64_t Extensions,
   std::vector &Features);
-bool getArchFeatures(ArchKind AK, std::vector &Features);
+StringRef getArchFeature(ArchKind AK);
 
 StringRef getArchName(ArchKind AK);
 StringRef getSubArch(ArchKind AK);

diff  --git a/llvm/lib/Support/AArch64TargetParser.cpp 
b/llvm/lib/Support/AArch64TargetParser.cpp
index e13b061eabb2d..aecb193e409a8 100644
--- a/llvm/lib/Support/AArch64TargetParser.cpp
+++ b/llvm/lib/Support/AArch64TargetParser.cpp
@@ -80,12 +80,8 @@ StringRef AArch64::resolveCPUAlias(StringRef CPU) {
   .Default(CPU);
 }
 
-bool AArch64::getArchFeatures(AArch64::ArchKind AK,
-  std::vector &Features) {
-  if (AK == ArchKind::INVALID)
-return false;
-  Features.push_back(AArch64ARCHNames[static_cast(AK)].ArchFeature);
-  return true;
+StringRef AArch64::getArchFeature(AArch64::ArchKind AK) {
+  return AArch64ARCHNames[static_cast(AK)].ArchFeature;
 }
 
 StringRef AArch64::getArchName(AArch64::ArchKind AK) {

diff  --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp 
b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 8556bd7c6d875..53290c6e8c196 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -6889,7 +6889,7 @@ bool AArch64AsmParser::parseDirectiveArch(SMLoc L) {
 
   // Get the architecture and extension features.
   std::v

[clang] 450de80 - [AArch64] Improve TargetParser API

2022-12-01 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-12-01T12:50:23Z
New Revision: 450de8008bb0ccb5dfc9dd69b6f5b434158772bd

URL: 
https://github.com/llvm/llvm-project/commit/450de8008bb0ccb5dfc9dd69b6f5b434158772bd
DIFF: 
https://github.com/llvm/llvm-project/commit/450de8008bb0ccb5dfc9dd69b6f5b434158772bd.diff

LOG: [AArch64] Improve TargetParser API

The TargetParser depends heavily on a collection of macros and enums to tie
together information about architectures, CPUs and extensions. Over time this
has led to some pretty awkward API choices. For example, recently a custom
operator-- has been added to the enum, which effectively turns iteration into
a graph traversal and makes the ordering of the macro calls in the header
significant. More generally there is a lot of string <-> enum conversion
going on. I think this shows the extent to which the current data structures
are constraining us, and the need for a rethink.

Key changes:

 - Get rid of Arch enum, which is used to bind fields together. Instead of
   passing around ArchKind, use the named ArchInfo objects directly or via
   references.

 - The list of all known ArchInfo becomes an array of pointers.

 - ArchKind::operator-- is replaced with ArchInfo::implies(), which defines
   which architectures are predecessors to each other. This allows features
   from predecessor architectures to be added in a more intuitive way.

 - Free functions of the form f(ArchKind) are converted to ArchInfo::f(). Some
   functions become unnecessary and are deleted.

 - Version number and profile are added to the ArchInfo. This makes comparison
   of architectures easier and moves a couple of functions out of clang and
   into AArch64TargetParser.

 - clang::AArch64TargetInfo ArchInfo is initialised to Armv8a not INVALID.

 - AArch64::ArchProfile which is distinct from ARM::ArchProfile

 - Give things sensible names and add some comments.

Differential Revision: https://reviews.llvm.org/D138792

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/AArch64.h
clang/lib/Driver/ToolChains/Arch/AArch64.cpp
llvm/include/llvm/Support/AArch64TargetParser.def
llvm/include/llvm/Support/AArch64TargetParser.h
llvm/include/llvm/Support/VersionTuple.h
llvm/lib/Support/AArch64TargetParser.cpp
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index c36e942cf46ac..edc4fdca26378 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -45,28 +45,6 @@ const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
 #include "clang/Basic/BuiltinsAArch64.def"
 };
 
-static StringRef getArchVersionString(llvm::AArch64::ArchKind Kind) {
-  switch (Kind) {
-  case llvm::AArch64::ArchKind::ARMV9A:
-  case llvm::AArch64::ArchKind::ARMV9_1A:
-  case llvm::AArch64::ArchKind::ARMV9_2A:
-  case llvm::AArch64::ArchKind::ARMV9_3A:
-  case llvm::AArch64::ArchKind::ARMV9_4A:
-return "9";
-  default:
-return "8";
-  }
-}
-
-StringRef AArch64TargetInfo::getArchProfile() const {
-  switch (ArchKind) {
-  case llvm::AArch64::ArchKind::ARMV8R:
-return "R";
-  default:
-return "A";
-  }
-}
-
 AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
  const TargetOptions &Opts)
 : TargetInfo(Triple), ABI("aapcs") {
@@ -170,7 +148,7 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 
 bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
   return Name == "generic" ||
- llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
+ llvm::AArch64::parseCpu(Name).Arch != llvm::AArch64::INVALID;
 }
 
 bool AArch64TargetInfo::setCPU(const std::string &Name) {
@@ -298,8 +276,10 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH", getArchVersionString(ArchKind));
-  Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + getArchProfile() + "'");
+  Builder.defineMacro("__ARM_ARCH",
+  std::to_string(ArchInfo->Version.getMajor()));
+  Builder.defineMacro("__ARM_ARCH_PROFILE",
+  std::string("'") + (char)ArchInfo->Profile + "'");
 
   Builder.defineMacro("__ARM_64BIT_STATE", "1");
   Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
@@ -464,52 +444,34 @@ void AArch64TargetInfo::getTargetDefines(const 
LangOptions &Opts,
   if (HasD128)
 Builder.defineMacro("__ARM_FEATURE_SYSREG128", "1");
 
-  switch (ArchKind) {
-  default:
-break;
-  case llvm::AArch64::ArchKind::ARMV8_1A:
+  if (*ArchInfo == llvm::AArch64::ARMV8_1A)
 getTargetDefinesARMV81A(Opts, Builder);
-  

[clang] d1ef4b0 - Revert "[AArch64] Improve TargetParser API"

2022-12-01 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-12-01T13:06:54Z
New Revision: d1ef4b0a8da152fe4282f97c7c49f4930a3c66a2

URL: 
https://github.com/llvm/llvm-project/commit/d1ef4b0a8da152fe4282f97c7c49f4930a3c66a2
DIFF: 
https://github.com/llvm/llvm-project/commit/d1ef4b0a8da152fe4282f97c7c49f4930a3c66a2.diff

LOG: Revert "[AArch64] Improve TargetParser API"

Buildbots unhappy about constexpr function.

This reverts commit 450de8008bb0ccb5dfc9dd69b6f5b434158772bd.

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/AArch64.h
clang/lib/Driver/ToolChains/Arch/AArch64.cpp
llvm/include/llvm/Support/AArch64TargetParser.def
llvm/include/llvm/Support/AArch64TargetParser.h
llvm/include/llvm/Support/VersionTuple.h
llvm/lib/Support/AArch64TargetParser.cpp
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index edc4fdca26378..c36e942cf46ac 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -45,6 +45,28 @@ const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
 #include "clang/Basic/BuiltinsAArch64.def"
 };
 
+static StringRef getArchVersionString(llvm::AArch64::ArchKind Kind) {
+  switch (Kind) {
+  case llvm::AArch64::ArchKind::ARMV9A:
+  case llvm::AArch64::ArchKind::ARMV9_1A:
+  case llvm::AArch64::ArchKind::ARMV9_2A:
+  case llvm::AArch64::ArchKind::ARMV9_3A:
+  case llvm::AArch64::ArchKind::ARMV9_4A:
+return "9";
+  default:
+return "8";
+  }
+}
+
+StringRef AArch64TargetInfo::getArchProfile() const {
+  switch (ArchKind) {
+  case llvm::AArch64::ArchKind::ARMV8R:
+return "R";
+  default:
+return "A";
+  }
+}
+
 AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
  const TargetOptions &Opts)
 : TargetInfo(Triple), ABI("aapcs") {
@@ -148,7 +170,7 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 
 bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
   return Name == "generic" ||
- llvm::AArch64::parseCpu(Name).Arch != llvm::AArch64::INVALID;
+ llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
 }
 
 bool AArch64TargetInfo::setCPU(const std::string &Name) {
@@ -276,10 +298,8 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH",
-  std::to_string(ArchInfo->Version.getMajor()));
-  Builder.defineMacro("__ARM_ARCH_PROFILE",
-  std::string("'") + (char)ArchInfo->Profile + "'");
+  Builder.defineMacro("__ARM_ARCH", getArchVersionString(ArchKind));
+  Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + getArchProfile() + "'");
 
   Builder.defineMacro("__ARM_64BIT_STATE", "1");
   Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
@@ -444,34 +464,52 @@ void AArch64TargetInfo::getTargetDefines(const 
LangOptions &Opts,
   if (HasD128)
 Builder.defineMacro("__ARM_FEATURE_SYSREG128", "1");
 
-  if (*ArchInfo == llvm::AArch64::ARMV8_1A)
+  switch (ArchKind) {
+  default:
+break;
+  case llvm::AArch64::ArchKind::ARMV8_1A:
 getTargetDefinesARMV81A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_2A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_2A:
 getTargetDefinesARMV82A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_3A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_3A:
 getTargetDefinesARMV83A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_4A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_4A:
 getTargetDefinesARMV84A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_5A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_5A:
 getTargetDefinesARMV85A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_6A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_6A:
 getTargetDefinesARMV86A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_7A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_7A:
 getTargetDefinesARMV87A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_8A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_8A:
 getTargetDefinesARMV88A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_9A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_9A:
 getTargetDefinesARMV89A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV9A)
+break;
+  case llvm::AArch64::ArchKind::ARMV9A:
 getTargetDefinesARMV9A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV9_1A)
+break;
+  case llvm::AArch64::ArchKind::ARMV9_1A:
 getTargetDefinesARMV91A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV9_2A)
+break;

[clang] e83f150 - [AArch64] Improve TargetParser API

2022-12-01 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-12-01T15:30:07Z
New Revision: e83f1502f1be7a2a3b9a33f5a73867767e78ba6b

URL: 
https://github.com/llvm/llvm-project/commit/e83f1502f1be7a2a3b9a33f5a73867767e78ba6b
DIFF: 
https://github.com/llvm/llvm-project/commit/e83f1502f1be7a2a3b9a33f5a73867767e78ba6b.diff

LOG: [AArch64] Improve TargetParser API

Re-land with constexpr StringRef::substr():

The TargetParser depends heavily on a collection of macros and enums to tie
together information about architectures, CPUs and extensions. Over time this
has led to some pretty awkward API choices. For example, recently a custom
operator-- has been added to the enum, which effectively turns iteration into
a graph traversal and makes the ordering of the macro calls in the header
significant. More generally there is a lot of string <-> enum conversion
going on. I think this shows the extent to which the current data structures
are constraining us, and the need for a rethink.

Key changes:

 - Get rid of Arch enum, which is used to bind fields together. Instead of
   passing around ArchKind, use the named ArchInfo objects directly or via
   references.

 - The list of all known ArchInfo becomes an array of pointers.

 - ArchKind::operator-- is replaced with ArchInfo::implies(), which defines
   which architectures are predecessors to each other. This allows features
   from predecessor architectures to be added in a more intuitive way.

 - Free functions of the form f(ArchKind) are converted to ArchInfo::f(). Some
   functions become unnecessary and are deleted.

 - Version number and profile are added to the ArchInfo. This makes comparison
   of architectures easier and moves a couple of functions out of clang and
   into AArch64TargetParser.

 - clang::AArch64TargetInfo ArchInfo is initialised to Armv8a not INVALID.

 - AArch64::ArchProfile which is distinct from ARM::ArchProfile

 - Give things sensible names and add some comments.

Differential Revision: https://reviews.llvm.org/D138792

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/AArch64.h
clang/lib/Driver/ToolChains/Arch/AArch64.cpp
llvm/include/llvm/ADT/StringRef.h
llvm/include/llvm/Support/AArch64TargetParser.def
llvm/include/llvm/Support/AArch64TargetParser.h
llvm/include/llvm/Support/VersionTuple.h
llvm/lib/Support/AArch64TargetParser.cpp
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index c36e942cf46ac..edc4fdca26378 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -45,28 +45,6 @@ const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
 #include "clang/Basic/BuiltinsAArch64.def"
 };
 
-static StringRef getArchVersionString(llvm::AArch64::ArchKind Kind) {
-  switch (Kind) {
-  case llvm::AArch64::ArchKind::ARMV9A:
-  case llvm::AArch64::ArchKind::ARMV9_1A:
-  case llvm::AArch64::ArchKind::ARMV9_2A:
-  case llvm::AArch64::ArchKind::ARMV9_3A:
-  case llvm::AArch64::ArchKind::ARMV9_4A:
-return "9";
-  default:
-return "8";
-  }
-}
-
-StringRef AArch64TargetInfo::getArchProfile() const {
-  switch (ArchKind) {
-  case llvm::AArch64::ArchKind::ARMV8R:
-return "R";
-  default:
-return "A";
-  }
-}
-
 AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
  const TargetOptions &Opts)
 : TargetInfo(Triple), ABI("aapcs") {
@@ -170,7 +148,7 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 
 bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
   return Name == "generic" ||
- llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
+ llvm::AArch64::parseCpu(Name).Arch != llvm::AArch64::INVALID;
 }
 
 bool AArch64TargetInfo::setCPU(const std::string &Name) {
@@ -298,8 +276,10 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH", getArchVersionString(ArchKind));
-  Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + getArchProfile() + "'");
+  Builder.defineMacro("__ARM_ARCH",
+  std::to_string(ArchInfo->Version.getMajor()));
+  Builder.defineMacro("__ARM_ARCH_PROFILE",
+  std::string("'") + (char)ArchInfo->Profile + "'");
 
   Builder.defineMacro("__ARM_64BIT_STATE", "1");
   Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
@@ -464,52 +444,34 @@ void AArch64TargetInfo::getTargetDefines(const 
LangOptions &Opts,
   if (HasD128)
 Builder.defineMacro("__ARM_FEATURE_SYSREG128", "1");
 
-  switch (ArchKind) {
-  default:
-break;
-  case llvm::AArch64::ArchKind::ARMV8_1A:
+  if (*Ar

[clang] 541a137 - Revert "[AArch64] Improve TargetParser API"

2022-12-05 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2022-12-05T11:09:03Z
New Revision: 541a1371c05d77bb70a6173127d6544b9571dbab

URL: 
https://github.com/llvm/llvm-project/commit/541a1371c05d77bb70a6173127d6544b9571dbab
DIFF: 
https://github.com/llvm/llvm-project/commit/541a1371c05d77bb70a6173127d6544b9571dbab.diff

LOG: Revert "[AArch64] Improve TargetParser API"

This reverts commit e83f1502f1be7a2a3b9a33f5a73867767e78ba6b.

Did not build with C++20 and caused problems with dynamic libs.

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/AArch64.h
clang/lib/Driver/ToolChains/Arch/AArch64.cpp
llvm/include/llvm/ADT/StringRef.h
llvm/include/llvm/Support/AArch64TargetParser.def
llvm/include/llvm/Support/AArch64TargetParser.h
llvm/include/llvm/Support/VersionTuple.h
llvm/lib/Support/AArch64TargetParser.cpp
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/unittests/Support/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 476bfcf9c41f6..c5fce62bc501f 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -45,6 +45,28 @@ const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
 #include "clang/Basic/BuiltinsAArch64.def"
 };
 
+static StringRef getArchVersionString(llvm::AArch64::ArchKind Kind) {
+  switch (Kind) {
+  case llvm::AArch64::ArchKind::ARMV9A:
+  case llvm::AArch64::ArchKind::ARMV9_1A:
+  case llvm::AArch64::ArchKind::ARMV9_2A:
+  case llvm::AArch64::ArchKind::ARMV9_3A:
+  case llvm::AArch64::ArchKind::ARMV9_4A:
+return "9";
+  default:
+return "8";
+  }
+}
+
+StringRef AArch64TargetInfo::getArchProfile() const {
+  switch (ArchKind) {
+  case llvm::AArch64::ArchKind::ARMV8R:
+return "R";
+  default:
+return "A";
+  }
+}
+
 AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
  const TargetOptions &Opts)
 : TargetInfo(Triple), ABI("aapcs") {
@@ -148,7 +170,7 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef 
Spec, StringRef,
 
 bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
   return Name == "generic" ||
- llvm::AArch64::parseCpu(Name).Arch != llvm::AArch64::INVALID;
+ llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
 }
 
 bool AArch64TargetInfo::setCPU(const std::string &Name) {
@@ -276,10 +298,8 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH",
-  std::to_string(ArchInfo->Version.getMajor()));
-  Builder.defineMacro("__ARM_ARCH_PROFILE",
-  std::string("'") + (char)ArchInfo->Profile + "'");
+  Builder.defineMacro("__ARM_ARCH", getArchVersionString(ArchKind));
+  Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + getArchProfile() + "'");
 
   Builder.defineMacro("__ARM_64BIT_STATE", "1");
   Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
@@ -444,34 +464,52 @@ void AArch64TargetInfo::getTargetDefines(const 
LangOptions &Opts,
   if (HasD128)
 Builder.defineMacro("__ARM_FEATURE_SYSREG128", "1");
 
-  if (*ArchInfo == llvm::AArch64::ARMV8_1A)
+  switch (ArchKind) {
+  default:
+break;
+  case llvm::AArch64::ArchKind::ARMV8_1A:
 getTargetDefinesARMV81A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_2A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_2A:
 getTargetDefinesARMV82A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_3A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_3A:
 getTargetDefinesARMV83A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_4A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_4A:
 getTargetDefinesARMV84A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_5A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_5A:
 getTargetDefinesARMV85A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_6A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_6A:
 getTargetDefinesARMV86A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_7A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_7A:
 getTargetDefinesARMV87A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_8A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_8A:
 getTargetDefinesARMV88A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV8_9A)
+break;
+  case llvm::AArch64::ArchKind::ARMV8_9A:
 getTargetDefinesARMV89A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV9A)
+break;
+  case llvm::AArch64::ArchKind::ARMV9A:
 getTargetDefinesARMV9A(Opts, Builder);
-  if (*ArchInfo == llvm::AArch64::ARMV9_1A)
+break;
+  case llvm::AArch64::ArchKind::ARMV9_1A:
 getTargetDefinesARMV91A(Opts, Builder);

[clang] d022f32 - Revert "[ARM] __ARM_ARCH macro definition fix (#81493)"

2024-02-19 Thread Tomas Matheson via cfe-commits

Author: Tomas Matheson
Date: 2024-02-19T12:19:16Z
New Revision: d022f32c73c57b59a9121eba909f5034e89c628e

URL: 
https://github.com/llvm/llvm-project/commit/d022f32c73c57b59a9121eba909f5034e89c628e
DIFF: 
https://github.com/llvm/llvm-project/commit/d022f32c73c57b59a9121eba909f5034e89c628e.diff

LOG: Revert "[ARM] __ARM_ARCH macro definition fix (#81493)"

This reverts commit 89c1bf1230e011f2f0e43554c278205fa1819de5.

This has been unimplemenented for a while, and GCC does not implement
it, therefore we need to consider whether we should just deprecate it
in the ACLE instead.

Added: 


Modified: 
clang/docs/ReleaseNotes.rst
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/ARM.cpp
clang/lib/Basic/Targets/ARM.h
clang/test/Preprocessor/arm-target-features.c
llvm/include/llvm/TargetParser/ARMTargetParser.h
llvm/lib/TargetParser/ARMTargetParser.cpp
llvm/unittests/TargetParser/TargetParserTest.cpp

Removed: 




diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 45ace4191592d3..649ad655905af2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -292,8 +292,6 @@ X86 Support
 Arm and AArch64 Support
 ^^^
 
-- Fixed the incorrect definition of the __ARM_ARCH macro for architectures 
greater than or equal to v8.1.
-
 Android Support
 ^^^
 

diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index dd0218e6ebed81..68032961451d90 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -367,20 +367,8 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-
-  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
-  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
-  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
-  // minor version number, e.g. for ARM architecture ARMvX.Y:
-  // __ARM_ARCH = X * 100 + Y.
-  if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0)
-Builder.defineMacro("__ARM_ARCH",
-std::to_string(ArchInfo->Version.getMajor()));
-  else
-Builder.defineMacro("__ARM_ARCH",
-std::to_string(ArchInfo->Version.getMajor() * 100 +
-   ArchInfo->Version.getMinor().value()));
-
+  Builder.defineMacro("__ARM_ARCH",
+  std::to_string(ArchInfo->Version.getMajor()));
   Builder.defineMacro("__ARM_ARCH_PROFILE",
   std::string("'") + (char)ArchInfo->Profile + "'");
 

diff  --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index cd7fb95259d9db..55b71557452fa0 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -130,7 +130,6 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
   SubArch = llvm::ARM::getSubArch(ArchKind);
   ArchProfile = llvm::ARM::parseArchProfile(SubArch);
   ArchVersion = llvm::ARM::parseArchVersion(SubArch);
-  ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch);
 
   // cache CPU related strings
   CPUAttr = getCPUAttr();
@@ -737,16 +736,9 @@ void ARMTargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (!CPUAttr.empty())
 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
 
-  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
-  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
-  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
-  // minor version number, e.g. for ARM architecture ARMvX.Y:
-  // __ARM_ARCH = X * 100 + Y.
-  if (ArchVersion >= 9 || ArchMinorVersion != 0)
-Builder.defineMacro("__ARM_ARCH",
-Twine(ArchVersion * 100 + ArchMinorVersion));
-  else
-Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
+  // ACLE 6.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
+  Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
 
   if (ArchVersion >= 8) {
 // ACLE 6.5.7 Crypto Extension

diff  --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index df06e4d120637a..71322a094f5edb 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -60,7 +60,6 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public 
TargetInfo {
   llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
   llvm::ARM::ProfileKind ArchProfile;
   unsigned ArchVersion;
-  unsigned ArchMinorVersion;
 
   LLVM_PREFERRED_TYPE(FPUMode)
   unsigned FPU : 5;

diff  --git a/clang/test/Preprocessor/arm-target-features.c 
b/clang/test/Preprocessor/arm-target-

[clang] [clang][FMV] Do not omit explicit default target_version attribute. (PR #96628)

2024-07-01 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.


https://github.com/llvm/llvm-project/pull/96628
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Bring initFeatureMap back to AArch64TargetInfo. (PR #96832)

2024-07-01 Thread Tomas Matheson via cfe-commits

tmatheson-arm wrote:

Thank you for the example, I understand what is happening how.

- Before #94279, we used to add CPU features in `AArch64::initFeatureMap`.
- In #94279, we decided that actually you should do that in the Driver, which 
should put all `-target-features` it wants on the -cc1 command line. The Driver 
is responsible for expanding the CPU (and architecture) feature dependencies 
and their interaction with any modifiers on the command line.
- This means that when `initFeatureMap` runs in `clang`, `FeaturesAsWritten` is 
populated with the CPU features and is used to initialise the `FeatureMap`.
- In contrast, you are not using the `Driver`, and do not populate 
`FeaturesAsWritten` with the CPU features.
- Instead, you expect `initFeatureMap` to add CPU features. This is not 
unreasonable, given that the CPU is passed the function and several other 
backends add CPU features at this stage.

[This bit of 
code](https://github.com/llvm/llvm-project/pull/94279/files#diff-2ccae12096c75c4b8422ea0d2fdf6b195896d2554d62cce604e8fcb56a78ef62L1057-L1067)
 used to crudely add the CPU features to the end of the feature list. However 
there are some problems with that approach, which we attempted to rectify in 
#94279:
- CPU features that were explicitly disabled on the command line could actually 
end up enabled in the backend
- The architecture features (i.e. implied by `-march`) were not treated the 
same way as the CPU features (`-mcpu`)

For example, if you wrote: `clang -mcpu=cortex-a75+norcpc -###`, you would see 
all the Cortex-A75 features expanded on the `-cc1` command line, but with RCPC 
disabled: `-target-feature -rcpc`. But in this case, `AArch64::initFeatureMap` 
would have re-added `+rcpc`, overriding the command line. (This is technically 
not the case after [this 
line](https://github.com/llvm/llvm-project/pull/94279/files#diff-2ccae12096c75c4b8422ea0d2fdf6b195896d2554d62cce604e8fcb56a78ef62L1092)
 was added, but the general point is that `initFeatureMap` broke feature 
dependency resolution in ways that are difficult to reason about).

There doesn't seem to be a way to specify an architecture in `TargetOptions`, 
which looks odd to me. That means there is no way to select e.g. `armv9.4-a` in 
your example, except by manually adding the features in 
`TargetOptions::Features` or `TargetOptions::FeaturesAsWritten`.

So the way that we set up the AArch64 backend in #94279 is to require you to 
calculate your feature set up front, which are then trivially passed through by 
the default `TargetInfo::initFeatureMap`.

I'm not sure there is a clear answer on this one. I can't see a way to easily 
let `AArch64:: initFeatureMap` add CPU features again without breaking the 
dependency resolution. I am open to suggestions though.

If you wanted to go the route of building the feature list before calling 
`initFeatureMap`, the functions `tools::getTargetFeatures` and 
`aarch64::getAArch64TargetFeatures` can do that for you. Currently they require 
a `const Driver &D`, but fundamentally I think they just need a 
`DiagnosticsEngine&` so that could be changed.

I'm open to other suggestions too.


https://github.com/llvm/llvm-project/pull/96832
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] Add getHostCPUFeatures to query for enabled features in cpu info (PR #97749)

2024-07-05 Thread Tomas Matheson via cfe-commits


@@ -445,4 +445,21 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
 
   if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
 Features.push_back("+no-bti-at-return-twice");
+
+  // Parse AArch64 CPU Features
+  const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);

tmatheson-arm wrote:

Feels like this should be done in 
`getAArch64ArchFeaturesFromMcpu`/`DecodeAArch64Mcpu`

https://github.com/llvm/llvm-project/pull/97749
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] Add getHostCPUFeatures to query for enabled features in cpu info (PR #97749)

2024-07-05 Thread Tomas Matheson via cfe-commits


@@ -445,4 +445,21 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
 
   if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
 Features.push_back("+no-bti-at-return-twice");
+
+  // Parse AArch64 CPU Features
+  const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
+  StringRef CPUName;
+
+  if (CPUArg) {
+CPUName = CPUArg->getValue();
+if (CPUName == "native") {
+  llvm::StringMap HostFeatures;
+  if (llvm::sys::getHostCPUFeatures(HostFeatures)) {
+for (auto &F : HostFeatures) {
+  Features.push_back(
+Args.MakeArgString((F.second ? "+" : "-") + F.first()));
+}

tmatheson-arm wrote:

```suggestion
for (auto &[Name, Enabled] : HostFeatures) {
  Features.push_back(
Args.MakeArgString((Enabled ? "+" : "-") + Name));
}
```


https://github.com/llvm/llvm-project/pull/97749
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] Add getHostCPUFeatures to query for enabled features in cpu info (PR #97749)

2024-07-05 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/97749
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lldb] [llvm] [llvm][TargetParser] Return optional from getHostCPUFeatures (PR #97824)

2024-07-05 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/97824
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lldb] [llvm] [llvm][TargetParser] Return optional from getHostCPUFeatures (PR #97824)

2024-07-05 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.


https://github.com/llvm/llvm-project/pull/97824
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lldb] [llvm] [llvm][TargetParser] Return optional from getHostCPUFeatures (PR #97824)

2024-07-05 Thread Tomas Matheson via cfe-commits


@@ -15,22 +15,23 @@
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/TargetParser/Host.h"
 
+#include 
+
 using namespace llvm;
 
 int main(int argc, char **argv) {
 #if defined(__i386__) || defined(_M_IX86) || \
 defined(__x86_64__) || defined(_M_X64)
-  StringMap features;
-
-  if (!sys::getHostCPUFeatures(features))
+  if (std::optional> features =
+  sys::getHostCPUFeatures(features)) {
+if ((*features)["sse"])

tmatheson-arm wrote:

Maybe
```suggestion
if (features->lookup("sse"))
```
which does the same, but doesn't insert the default entry into the map.

https://github.com/llvm/llvm-project/pull/97824
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lldb] [llvm] [llvm][TargetParser] Return optional from getHostCPUFeatures (PR #97824)

2024-07-05 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/97824
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lldb] [llvm] [llvm][TargetParser] Return optional from getHostCPUFeatures (PR #97824)

2024-07-05 Thread Tomas Matheson via cfe-commits


@@ -22,13 +22,13 @@ using namespace llvm;
 int main(int argc, char **argv) {
 #if defined(__i386__) || defined(_M_IX86) || \
 defined(__x86_64__) || defined(_M_X64)
-  if (std::optional> features =
+  if (const std::optional> features =
   sys::getHostCPUFeatures(features)) {
-if ((*features)["sse"])
+if (features->contains("sse"))

tmatheson-arm wrote:

`contains` will only check if the key exists in the map, but you want to 
actually get the `bool` if it exists and default to `false` if it doesn't. I 
think `lookup` fits better.

https://github.com/llvm/llvm-project/pull/97824
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64][RISCV] Improve the tests for --print-enabled-extensions and --print-supported-extensions (PR #97829)

2024-07-05 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/97829
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [PAC][ELF][AArch64] Encode signed GOT flag in PAuth core info (PR #96159)

2024-07-05 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.

LGTM, just based on what I can see from implementation of the existing bits in 
the version field.

https://github.com/llvm/llvm-project/pull/96159
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64][RISCV] Improve the tests for --print-enabled-extensions and --print-supported-extensions (PR #97829)

2024-07-08 Thread Tomas Matheson via cfe-commits

tmatheson-arm wrote:

> Mind sticking it in a gist at least so folks can use it for downstream 
> subtargets?

[Here you 
go](https://gist.github.com/tmatheson-arm/333dd14cc1c95ab4ac563ed615add95d)

https://github.com/llvm/llvm-project/pull/97829
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64][RISCV] Improve the tests for --print-enabled-extensions and --print-supported-extensions (PR #97829)

2024-07-08 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm closed 
https://github.com/llvm/llvm-project/pull/97829
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64][RISCV] Improve the tests for --print-enabled-extensions and --print-supported-extensions (PR #97829)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -0,0 +1,24 @@
+// REQUIRES: aarch64-registered-target

tmatheson-arm wrote:

I've kept them as-is so that they still correspond to the [generating 
script](https://gist.github.com/tmatheson-arm/333dd14cc1c95ab4ac563ed615add95d).

https://github.com/llvm/llvm-project/pull/97829
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -261,9 +261,9 @@ __attribute__((target_version("jscvt"))) int 
default_def_with_version_decls(void
 // CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+lse,-v9.5a" }
 // CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+fp-armv8,+neon,+rdm,-v9.5a" }
 // CHECK: attributes #[[ATTR5:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" 
"target-features"="+dotprod,+fp-armv8,+neon,-v9.5a" }
-// CHECK: attributes #[[ATTR6:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" 
"target-features"="+fp-armv8,+jsconv,+neon,-v9.5a" }
-// CHECK: attributes #[[ATTR7:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" "target-features"="-v9.5a" }
-// CHECK: attributes #[[ATTR8:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" "target-features"="+lse,-v9.5a" }
+// CHECK: attributes #[[ATTR6:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" "target-features"="-v9.5a" }
+// CHECK: attributes #[[ATTR7:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" "target-features"="+lse,-v9.5a" }
+// CHECK: attributes #[[ATTR8:[0-9]+]] = { "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" 
"target-features"="+fp-armv8,+jsconv,+neon,-v9.5a" }

tmatheson-arm wrote:

These attributes are not actually matched against anything, is there any point 
testing them?

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm commented:

It's really hard to tell what is changing here because the existing tests are 
so non-specific.

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -4210,9 +4192,7 @@ void CodeGenModule::emitMultiVersionFunctions() {
   return cast(Func);
 };
 
-bool HasDefaultDecl = !FD->isTargetVersionMultiVersion();
-bool ShouldEmitResolver =
-!getContext().getTargetInfo().getTriple().isAArch64();
+bool ShouldEmitResolver = !getTarget().getTriple().isAArch64();

tmatheson-arm wrote:

```suggestion
// For AArch64, a resolver is only emitted if a function marked 
target(default))
// is present and defined in this TU. For other architectures it is always 
emitted.
bool ShouldEmitResolver = !getTarget().getTriple().isAArch64();
```

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -59,15 +59,22 @@ int bar() {
   return m.goo(1) + foo(1) + foo();
 }
 
+// Example to demonstrate that at the point of use we haven't yet seen the 
default.
+// At that point a declaration for the unmangled symbol is emitted, which is 
later
+// replaced by the ifunc symbol (once we have seen the default definition).
+__attribute__((target_version("aes"))) void fmv(void) {}
+void caller(void) { fmv(); }
+__attribute__((target_version("default"))) void fmv(void) {}

tmatheson-arm wrote:

How does it demonstrate this? The unmangled symbol doesn't appear in the 
output, as far as I can see.

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -4224,10 +4204,8 @@ void CodeGenModule::emitMultiVersionFunctions() {
 llvm::Function *Func = createFunction(CurFD);
 Options.emplace_back(Func, TA->getArchitecture(), Feats);
   } else if (const auto *TVA = CurFD->getAttr()) {
-bool HasDefaultDef = TVA->isDefaultVersion() &&
- CurFD->doesThisDeclarationHaveABody();
-HasDefaultDecl |= TVA->isDefaultVersion();
-ShouldEmitResolver |= (CurFD->isUsed() || HasDefaultDef);
+ShouldEmitResolver |= (TVA->isDefaultVersion() &&
+   CurFD->doesThisDeclarationHaveABody());

tmatheson-arm wrote:

```suggestion
if (TVA->isDefaultVersion() && 
CurFD->doesThisDeclarationHaveABody())
  ShouldEmitResolver = true;
```

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -59,15 +59,22 @@ int bar() {
   return m.goo(1) + foo(1) + foo();
 }
 
+// Example to demonstrate that at the point of use we haven't yet seen the 
default.
+// At that point a declaration for the unmangled symbol is emitted, which is 
later
+// replaced by the ifunc symbol (once we have seen the default definition).
+__attribute__((target_version("aes"))) void fmv(void) {}
+void caller(void) { fmv(); }
+__attribute__((target_version("default"))) void fmv(void) {}

tmatheson-arm wrote:

I think we want to test the observable behaviour, not whatever is happening 
internally. The test doesn't actually check the internals anyway, besides that 
it doesn't crash. i.e. I would expect the comment to be something like:
> Test that an ifunc is generated and used when `default` is defined after the 
> first use of the function

If we want to check the other case you mentioned, and 
`update_cc_test_checks.py` can't generate a test for it automatically, it 
should still be tested but it will have to be manually written.

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [FMV][AArch64] Do not emit ifunc resolver on use. (PR #97761)

2024-07-08 Thread Tomas Matheson via cfe-commits


@@ -11,7 +11,7 @@ int __attribute__((target_version("fp+aes"))) fmv(void) { 
return 6; }
 int __attribute__((target_version("crc+ls64_v"))) fmv(void) { return 7; }
 int __attribute__((target_version("bti"))) fmv(void) { return 8; }
 int __attribute__((target_version("sme2"))) fmv(void) { return 9; }
-int __attribute__((target_version("default"))) fmv(void);
+int __attribute__((target_version("default"))) fmv(void) { return 0; }

tmatheson-arm wrote:

I think `fmv_one` and `fmv_too` should be defined too, to keep the original 
behaviour of this test unchanged, and then add a new, separate test for 
checking the various behaviours of `default`

https://github.com/llvm/llvm-project/pull/97761
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Attempt to further split the arch default and implied exts. (PR #106304)

2024-09-10 Thread Tomas Matheson via cfe-commits

tmatheson-arm wrote:

Are you planning to follow through with this?

https://github.com/llvm/llvm-project/pull/106304
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-15 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm created 
https://github.com/llvm/llvm-project/pull/104435

This adds a check that all ExtensionWithMArch which are marked as implied 
features for an architecture are also present in the list of default features. 
It doesn't make sense to have something mandatory but not on by default.

There were a number of existing cases that violated this rule, and some changes 
to which features are mandatory (indicated by the Implies field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM. FeatureSSBS is removed from Implied and added to 
HasV8_5aOps.DefaultExts. Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
 Removed from the Cortex-A710 and Oryon print-supported-extensions tests. 
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/ 
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts. FIXME what about nofp 
here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed: 
https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llv

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-15 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-15 Thread Tomas Matheson via cfe-commits

tmatheson-arm wrote:

> > Cortex-A710 does not appear to have SSBS
> I believe this says it should be present: 

You're right, I'll fix that.

I will also actually remove FeatureCCIDX from the 8.3 mandatory features.

https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/104435

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH 1/9] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llvm/test/MC/AArch64/armv8.5a-ssbs-error.s|  2 +-
 llvm/test/MC/AArch64/armv8.5a-ssbs.s  |  2 +-
 .../MC/Disassembler/AArch64/armv8.5a-ssbs.txt |  2 +-
 .../TargetParser/TargetParserTest.cpp | 21 ++--
 llvm/utils/TableGen/ARMTargetDefEmitter.cpp   | 32 +--
 14 files changed, 67 insertions(+), 41 deletions(-)

diff --git a/clang/test/CodeGen/aarch64-targetattr.c 
b/clang/test/CodeGen/aarch64-targetattr.c
index 4f891f938b6186..d6227be2ebef83 100644
--- a/clang/test/CodeGen/aarch64-targetattr.c
+++ b/clang/test/CodeGen/aarch64-targetattr.c
@@ -195,19 +195,19 @@ void minusarch() {}
 // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+lse,+neon,+ras,+rdm,+v8.1a,+v8.2a,+v8a" }
 // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+v8.1a,+v8.2a,+v8a"
 }
 // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8a"
 }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+ras,+rcpc,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a"
 }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-cpu"="cortex-a710" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+ete,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+mte,+neon,+pauth,+perfmon,+ras,+rcpc,+rdm,+sb,+sve,+sve2,+sve2-bitperm,+trbe,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+v9a"
 }
+// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/104435

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH 01/10] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llvm/test/MC/AArch64/armv8.5a-ssbs-error.s|  2 +-
 llvm/test/MC/AArch64/armv8.5a-ssbs.s  |  2 +-
 .../MC/Disassembler/AArch64/armv8.5a-ssbs.txt |  2 +-
 .../TargetParser/TargetParserTest.cpp | 21 ++--
 llvm/utils/TableGen/ARMTargetDefEmitter.cpp   | 32 +--
 14 files changed, 67 insertions(+), 41 deletions(-)

diff --git a/clang/test/CodeGen/aarch64-targetattr.c 
b/clang/test/CodeGen/aarch64-targetattr.c
index 4f891f938b6186..d6227be2ebef83 100644
--- a/clang/test/CodeGen/aarch64-targetattr.c
+++ b/clang/test/CodeGen/aarch64-targetattr.c
@@ -195,19 +195,19 @@ void minusarch() {}
 // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+lse,+neon,+ras,+rdm,+v8.1a,+v8.2a,+v8a" }
 // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+v8.1a,+v8.2a,+v8a"
 }
 // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8a"
 }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+ras,+rcpc,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a"
 }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-cpu"="cortex-a710" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+ete,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+mte,+neon,+pauth,+perfmon,+ras,+rcpc,+rdm,+sb,+sve,+sve2,+sve2-bitperm,+trbe,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+v9a"
 }
+// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-siz

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/104435

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH 01/11] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llvm/test/MC/AArch64/armv8.5a-ssbs-error.s|  2 +-
 llvm/test/MC/AArch64/armv8.5a-ssbs.s  |  2 +-
 .../MC/Disassembler/AArch64/armv8.5a-ssbs.txt |  2 +-
 .../TargetParser/TargetParserTest.cpp | 21 ++--
 llvm/utils/TableGen/ARMTargetDefEmitter.cpp   | 32 +--
 14 files changed, 67 insertions(+), 41 deletions(-)

diff --git a/clang/test/CodeGen/aarch64-targetattr.c 
b/clang/test/CodeGen/aarch64-targetattr.c
index 4f891f938b6186..d6227be2ebef83 100644
--- a/clang/test/CodeGen/aarch64-targetattr.c
+++ b/clang/test/CodeGen/aarch64-targetattr.c
@@ -195,19 +195,19 @@ void minusarch() {}
 // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+lse,+neon,+ras,+rdm,+v8.1a,+v8.2a,+v8a" }
 // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+v8.1a,+v8.2a,+v8a"
 }
 // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8a"
 }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+ras,+rcpc,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a"
 }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-cpu"="cortex-a710" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+ete,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+mte,+neon,+pauth,+perfmon,+ras,+rcpc,+rdm,+sb,+sve,+sve2,+sve2-bitperm,+trbe,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+v9a"
 }
+// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-siz

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

tmatheson-arm wrote:

Fixed SSBS and CCIDX.

> Does this also fix the "+nossbs" issue we saw earlier this week?

Yes, added a test 
https://github.com/llvm/llvm-project/pull/104435/files#diff-e355e3951d191d3a32265d9bdeb101e4f49ddfa6049ef058cf9e1dfdf7c19ef3

https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/104435

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH 01/12] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llvm/test/MC/AArch64/armv8.5a-ssbs-error.s|  2 +-
 llvm/test/MC/AArch64/armv8.5a-ssbs.s  |  2 +-
 .../MC/Disassembler/AArch64/armv8.5a-ssbs.txt |  2 +-
 .../TargetParser/TargetParserTest.cpp | 21 ++--
 llvm/utils/TableGen/ARMTargetDefEmitter.cpp   | 32 +--
 14 files changed, 67 insertions(+), 41 deletions(-)

diff --git a/clang/test/CodeGen/aarch64-targetattr.c 
b/clang/test/CodeGen/aarch64-targetattr.c
index 4f891f938b6186..d6227be2ebef83 100644
--- a/clang/test/CodeGen/aarch64-targetattr.c
+++ b/clang/test/CodeGen/aarch64-targetattr.c
@@ -195,19 +195,19 @@ void minusarch() {}
 // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+lse,+neon,+ras,+rdm,+v8.1a,+v8.2a,+v8a" }
 // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+v8.1a,+v8.2a,+v8a"
 }
 // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8a"
 }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+ras,+rcpc,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a"
 }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-cpu"="cortex-a710" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+ete,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+mte,+neon,+pauth,+perfmon,+ras,+rcpc,+rdm,+sb,+sve,+sve2,+sve2-bitperm,+trbe,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+v9a"
 }
+// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-siz

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits


@@ -283,9 +311,7 @@ static void EmitARMTargetDef(RecordKeeper &RK, raw_ostream 
&OS) {
 auto Profile = Arch->getValueAsString("Profile");
 auto ArchInfo = ArchInfoName(Major, Minor, Profile);
 
-// The apple-latest alias is backend only, do not expose it to -mcpu.
-if (Name == "apple-latest")
-  continue;

tmatheson-arm wrote:

This check is duplicated at line 260, unrelated to this change.

https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/104435

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH 01/16] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llvm/test/MC/AArch64/armv8.5a-ssbs-error.s|  2 +-
 llvm/test/MC/AArch64/armv8.5a-ssbs.s  |  2 +-
 .../MC/Disassembler/AArch64/armv8.5a-ssbs.txt |  2 +-
 .../TargetParser/TargetParserTest.cpp | 21 ++--
 llvm/utils/TableGen/ARMTargetDefEmitter.cpp   | 32 +--
 14 files changed, 67 insertions(+), 41 deletions(-)

diff --git a/clang/test/CodeGen/aarch64-targetattr.c 
b/clang/test/CodeGen/aarch64-targetattr.c
index 4f891f938b6186..d6227be2ebef83 100644
--- a/clang/test/CodeGen/aarch64-targetattr.c
+++ b/clang/test/CodeGen/aarch64-targetattr.c
@@ -195,19 +195,19 @@ void minusarch() {}
 // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+lse,+neon,+ras,+rdm,+v8.1a,+v8.2a,+v8a" }
 // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+v8.1a,+v8.2a,+v8a"
 }
 // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8a"
 }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+ras,+rcpc,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a"
 }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-cpu"="cortex-a710" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+ete,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+mte,+neon,+pauth,+perfmon,+ras,+rcpc,+rdm,+sb,+sve,+sve2,+sve2-bitperm,+trbe,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+v9a"
 }
+// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-siz

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/104435

>From f79eb28441491f1625691886cc92bd05d3b3cb6a Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Thu, 15 Aug 2024 13:41:31 +0100
Subject: [PATCH 01/17] [AArch64] Add a check for invalid default features

This adds a check that all ExtensionWithMArch which are marked as
implied features for an architecture are also present in the list of
default features. It doesn't make sense to have something mandatory but
not on by default.

There were a number of existing cases that violated this rule, and some
changes to which features are mandatory (indicated by the Implies
field):

> FEAT_SPECRES is mandatory from Armv8.5.
FeaturePredRes is added to the HasV8_5aOps.DefaultExts.

> FEAT_DIT is mandatory from Armv8.4.
FeatureDIT is added to the HasV8_4aOps.DefaultExts.

FEAT_SSBS is not mandatory for any architecture.
https://reviews.llvm.org/D54629 says it is mandatory for 8.5-a but I can't see 
that in the Arm ARM.
FeatureSSBS is removed from Implied and added to HasV8_5aOps.DefaultExts.
Cortex-A710 does not appear to have SSBS
https://developer.arm.com/documentation/101800/0201/The-Cortex-A710--core/Cortex-A710--core-features?lang=en
Removed from the Cortex-A710 and Oryon print-supported-extensions tests.
https://developer.apple.com/download/apple-silicon-cpu-optimization-guide/
Added to Apple A15/A16/A17 and (presumably?) M4 processor features.

> FEAT_BTI is mandatory from Armv8.5.
FeatureBranchTargetId is added to the DefaultExts

> FEAT_FlagM is mandatory from Armv8.4.
FeatureFlagM is added to the DefaultExts

> In an Armv8.4 implementation, if FEAT_AdvSIMD is implemented, FEAT_DotProd is 
> implemented.
FeatureDotProd is added to the HasV8_4aOps.DefaultExts.
FIXME what about nofp here?

> FEAT_SB is mandatory from Armv8.5.
FeatureSB is added to HasV8_5aOps.DefaultExts.
Therefore it appears on the `-cc1` command line for `-march=armv8.5a+nosb`.

> FEAT_WFxT is mandatory from Armv8.7.
FeatureWFxT is added to HasV8_7aOps.DefaultExts and HasV9_2aOps.DefaultExts.

> FEAT_CCIDX is OPTIONAL from Armv8.2.
Removed from Implies and added to HasV8_3aOps.DefaultExts and 
HasV8_0rOps.DefaultExts.

For v8-R, FEAT_CCIDX is not mandatory, removed.
 - Not implemented by cortex-r82, removed:
   https://developer.arm.com/documentation/102670/0300/?lang=en
 - Ditto cortex-r82ae
---
 clang/test/CodeGen/aarch64-targetattr.c   | 12 +++
 clang/test/Driver/arm-sb.c|  2 +-
 .../aarch64-cortex-a710.c |  1 -
 .../aarch64-cortex-r82.c  |  1 -
 .../aarch64-cortex-r82ae.c|  1 -
 .../aarch64-oryon-1.c |  1 -
 .../Preprocessor/aarch64-target-features.c|  4 +--
 llvm/lib/Target/AArch64/AArch64Features.td| 16 +-
 llvm/lib/Target/AArch64/AArch64Processors.td  | 11 ---
 llvm/test/MC/AArch64/armv8.5a-ssbs-error.s|  2 +-
 llvm/test/MC/AArch64/armv8.5a-ssbs.s  |  2 +-
 .../MC/Disassembler/AArch64/armv8.5a-ssbs.txt |  2 +-
 .../TargetParser/TargetParserTest.cpp | 21 ++--
 llvm/utils/TableGen/ARMTargetDefEmitter.cpp   | 32 +--
 14 files changed, 67 insertions(+), 41 deletions(-)

diff --git a/clang/test/CodeGen/aarch64-targetattr.c 
b/clang/test/CodeGen/aarch64-targetattr.c
index 4f891f938b6186..d6227be2ebef83 100644
--- a/clang/test/CodeGen/aarch64-targetattr.c
+++ b/clang/test/CodeGen/aarch64-targetattr.c
@@ -195,19 +195,19 @@ void minusarch() {}
 // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+lse,+neon,+ras,+rdm,+v8.1a,+v8.2a,+v8a" }
 // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+v8.1a,+v8.2a,+v8a"
 }
 // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+crc,+fp-armv8,+fullfp16,+lse,+neon,+ras,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8a"
 }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+ras,+rcpc,+rdm,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a"
 }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-cpu"="cortex-a710" 
"target-features"="+bf16,+complxnum,+crc,+dotprod,+ete,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+mte,+neon,+pauth,+perfmon,+ras,+rcpc,+rdm,+sb,+sve,+sve2,+sve2-bitperm,+trbe,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+v9a"
 }
+// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-siz

[clang] [llvm] [AArch64] Add a check for invalid default features (PR #104435)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm milestoned 
https://github.com/llvm/llvm-project/pull/104435
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][test] Split invalid-cpu-note tests (PR #104601)

2024-08-16 Thread Tomas Matheson via cfe-commits


@@ -0,0 +1,382 @@
+// Use --implicit-check-not={{[a-zA-Z0-9]}} to ensure no additional CPUs are 
in these lists
+
+// RUN: not %clang_cc1 -triple i386--- -target-cpu not-a-cpu -fsyntax-only %s 
2>&1 | FileCheck %s --check-prefix X86 --implicit-check-not={{[a-zA-Z0-9]}}
+// X86: error: unknown target CPU 'not-a-cpu'
+// X86-NEXT: note: valid target CPU values are:
+// X86-SAME: i386,
+// X86-SAME: i486,
+// X86-SAME: winchip-c6,
+// X86-SAME: winchip2,
+// X86-SAME: c3,
+// X86-SAME: i586,
+// X86-SAME: pentium,
+// X86-SAME: pentium-mmx,
+// X86-SAME: pentiumpro,
+// X86-SAME: i686,
+// X86-SAME: pentium2,
+// X86-SAME: pentium3,
+// X86-SAME: pentium3m,
+// X86-SAME: pentium-m,
+// X86-SAME: c3-2,
+// X86-SAME: yonah,
+// X86-SAME: pentium4,
+// X86-SAME: pentium4m,
+// X86-SAME: prescott,
+// X86-SAME: nocona,
+// X86-SAME: core2,
+// X86-SAME: penryn,
+// X86-SAME: bonnell,
+// X86-SAME: atom,
+// X86-SAME: silvermont,
+// X86-SAME: slm,
+// X86-SAME: goldmont,
+// X86-SAME: goldmont-plus,
+// X86-SAME: tremont,
+// X86-SAME: nehalem,
+// X86-SAME: corei7,
+// X86-SAME: westmere,
+// X86-SAME: sandybridge,
+// X86-SAME: corei7-avx,
+// X86-SAME: ivybridge,
+// X86-SAME: core-avx-i,
+// X86-SAME: haswell,
+// X86-SAME: core-avx2,
+// X86-SAME: broadwell,
+// X86-SAME: skylake,
+// X86-SAME: skylake-avx512,
+// X86-SAME: skx,
+// X86-SAME: cascadelake,
+// X86-SAME: cooperlake,
+// X86-SAME: cannonlake,
+// X86-SAME: icelake-client,
+// X86-SAME: rocketlake,
+// X86-SAME: icelake-server,
+// X86-SAME: tigerlake,
+// X86-SAME: sapphirerapids,
+// X86-SAME: alderlake,
+// X86-SAME: raptorlake,
+// X86-SAME: meteorlake,
+// X86-SAME: arrowlake,
+// X86-SAME: arrowlake-s,
+// X86-SAME: lunarlake,
+// X86-SAME: gracemont,
+// X86-SAME: pantherlake,
+// X86-SAME: sierraforest,
+// X86-SAME: grandridge,
+// X86-SAME: graniterapids,
+// X86-SAME: graniterapids-d,
+// X86-SAME: emeraldrapids,
+// X86-SAME: clearwaterforest,
+// X86-SAME: knl,
+// X86-SAME: knm,
+// X86-SAME: lakemont,
+// X86-SAME: k6,
+// X86-SAME: k6-2,
+// X86-SAME: k6-3,
+// X86-SAME: athlon,
+// X86-SAME: athlon-tbird,
+// X86-SAME: athlon-xp,
+// X86-SAME: athlon-mp,
+// X86-SAME: athlon-4,
+// X86-SAME: k8,
+// X86-SAME: athlon64,
+// X86-SAME: athlon-fx,
+// X86-SAME: opteron,
+// X86-SAME: k8-sse3,
+// X86-SAME: athlon64-sse3,
+// X86-SAME: opteron-sse3,
+// X86-SAME: amdfam10,
+// X86-SAME: barcelona,
+// X86-SAME: btver1,
+// X86-SAME: btver2,
+// X86-SAME: bdver1,
+// X86-SAME: bdver2,
+// X86-SAME: bdver3,
+// X86-SAME: bdver4,
+// X86-SAME: znver1,
+// X86-SAME: znver2,
+// X86-SAME: znver3,
+// X86-SAME: znver4,
+// X86-SAME: x86-64,
+// X86-SAME: x86-64-v2,
+// X86-SAME: x86-64-v3,
+// X86-SAME: x86-64-v4,
+// X86-SAME: geode
+// X86-SAME: {{$}}
+
+// RUN: not %clang_cc1 -triple x86_64--- -target-cpu not-a-cpu -fsyntax-only 
%s 2>&1 | FileCheck %s --check-prefix=X86_64  
--implicit-check-not={{[a-zA-Z0-9]}}

tmatheson-arm wrote:

nit: Should we keep all run lines at the top of the file?

https://github.com/llvm/llvm-project/pull/104601
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][test] Split invalid-cpu-note tests (PR #104601)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm approved this pull request.

Thanks. This will make downstream maintenance much easier after the initial 
merge.

https://github.com/llvm/llvm-project/pull/104601
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][test] Split invalid-cpu-note tests (PR #104601)

2024-08-16 Thread Tomas Matheson via cfe-commits

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/104601
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] set AppleA14 architecture version to v8.4-a (PR #92600)

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


@@ -718,12 +718,16 @@ def ProcessorFeatures {
   list AppleA13 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFullFP16,
  FeatureFP16FML, FeatureSHA3];
+  // Apple A14 and M1 chips are based on Armv8.5-a but without BTI. Since there

tmatheson-arm wrote:

As you point out, the only publicly available documentation is the optimization 
guide, and lists these cores as "8.5 without BTI". Here in the tablegen file it 
is written as 8.4 plus all of the features from 8.5 which are supported. A 
comment explaining the discrepancy seems reasonable to me. It also alerts 
people that if any new backend feature is introduced that models something in 
8.5, they need to manually add it to the list for these cores.

https://github.com/llvm/llvm-project/pull/92600
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] set AppleA14 architecture version to v8.4-a (PR #92600)

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


@@ -286,7 +286,6 @@ void AArch64TargetInfo::getTargetDefinesARMV84A(const 
LangOptions &Opts,
 void AArch64TargetInfo::getTargetDefinesARMV85A(const LangOptions &Opts,
 MacroBuilder &Builder) const {
   Builder.defineMacro("__ARM_FEATURE_FRINT", "1");
-  Builder.defineMacro("__ARM_FEATURE_BTI", "1");

tmatheson-arm wrote:

Maybe in a separate PR.

https://github.com/llvm/llvm-project/pull/92600
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] set AppleA14 architecture version to v8.4-a (PR #92600)

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

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/92600

>From 518b83ab69c4852f7e7ea71c17df3f58e8ff50ef Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Fri, 17 May 2024 21:39:17 +0100
Subject: [PATCH 1/4] [AArch64] set AppleA14 architecture version to 8.5

---
 llvm/lib/Target/AArch64/AArch64Processors.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AArch64/AArch64Processors.td 
b/llvm/lib/Target/AArch64/AArch64Processors.td
index f2286ae17dba5..96422758bc618 100644
--- a/llvm/lib/Target/AArch64/AArch64Processors.td
+++ b/llvm/lib/Target/AArch64/AArch64Processors.td
@@ -718,7 +718,7 @@ def ProcessorFeatures {
   list AppleA13 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFullFP16,
  FeatureFP16FML, FeatureSHA3];
-  list AppleA14 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
+  list AppleA14 = [HasV8_5aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFRInt3264,
  FeatureSpecRestrict, FeatureSSBS, 
FeatureSB,
  FeaturePredRes, FeatureCacheDeepPersist,

>From 74f6d426fa67b1f794a8ba2ac7c864830ee9c2b2 Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Mon, 20 May 2024 12:38:52 +0100
Subject: [PATCH 2/4] make m1+a14 v8.4 instead

---
 clang/lib/Basic/Targets/AArch64.cpp|  4 +++-
 clang/test/Driver/aarch64-mac-cpus.c   |  2 +-
 clang/test/Preprocessor/aarch64-target-features.c  |  8 +++-
 .../llvm/TargetParser/AArch64TargetParser.h|  4 ++--
 llvm/lib/Target/AArch64/AArch64Processors.td   | 14 +-
 llvm/test/DebugInfo/debug_frame_symbol.ll  |  2 +-
 .../AddressSanitizer/calls-only-smallfn.ll |  2 +-
 .../Instrumentation/AddressSanitizer/calls-only.ll |  2 +-
 llvm/unittests/TargetParser/TargetParserTest.cpp   |  8 
 9 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 5db1ce78c657f..692ec58235efe 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -286,7 +286,6 @@ void AArch64TargetInfo::getTargetDefinesARMV84A(const 
LangOptions &Opts,
 void AArch64TargetInfo::getTargetDefinesARMV85A(const LangOptions &Opts,
 MacroBuilder &Builder) const {
   Builder.defineMacro("__ARM_FEATURE_FRINT", "1");
-  Builder.defineMacro("__ARM_FEATURE_BTI", "1");
   // Also include the Armv8.4 defines
   getTargetDefinesARMV84A(Opts, Builder);
 }
@@ -499,6 +498,9 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (HasPAuthLR)
 Builder.defineMacro("__ARM_FEATURE_PAUTH_LR", "1");
 
+  if (HasBTI)
+Builder.defineMacro("__ARM_FEATURE_BTI", "1");
+
   if (HasUnalignedAccess)
 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
 
diff --git a/clang/test/Driver/aarch64-mac-cpus.c 
b/clang/test/Driver/aarch64-mac-cpus.c
index 5179731268950..488298cfd2d24 100644
--- a/clang/test/Driver/aarch64-mac-cpus.c
+++ b/clang/test/Driver/aarch64-mac-cpus.c
@@ -16,7 +16,7 @@
 // RUN: %clang --target=arm64-apple-macos -mcpu=apple-m1 -### -c %s 2>&1 | 
FileCheck --check-prefix=EXPLICIT-M1 %s
 
 // CHECK: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-m1"
-// CHECK-SAME: "-target-feature" "+v8.5a"
+// CHECK-SAME: "-target-feature" "+v8.4a"
 
 // EXPLICIT-A11: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a11"
 // EXPLICIT-A7: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a7"
diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index 82304a15a04a3..3f2c2929c7129 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -335,7 +335,7 @@
 // CHECK-MCPU-CARMEL: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" 
"+v8.2a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" 
"+fp-armv8" "-target-feature" "+fullfp16" "-target-feature" "+lse" 
"-target-feature" "+ras" "-target-feature" "+rdm" "-target-feature" "+sha2" 
"-target-feature" "+neon"
 
 // RUN: %clang -target x86_64-apple-macosx -arch arm64 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ARCH-ARM64 %s
-// CHECK-ARCH-ARM64: "-target-cpu" "apple-m1" "-target-feature" "+zcm" 
"-target-feature" "+zcz" "-target-feature" "+v8.5a" "-target-feature" "+aes" 
"-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" 
"+complxnum" "-target-feature" "+fp-armv8" "-target-feature" "+fullfp16" 
"-target-feature" "+fp16fml" "-target-feature" "+jsconv" "-target-feature" 
"+lse" "-target-feature" "+pauth" "-target-feature" "+ras" "-target-feature" 
"+rcpc" "-target-feature" "+rdm" "-target-feature" "+sha2" "-

[clang] [llvm] [AArch64] set AppleA14 architecture version to v8.4-a (PR #92600)

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

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/92600

>From 518b83ab69c4852f7e7ea71c17df3f58e8ff50ef Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Fri, 17 May 2024 21:39:17 +0100
Subject: [PATCH 1/5] [AArch64] set AppleA14 architecture version to 8.5

---
 llvm/lib/Target/AArch64/AArch64Processors.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AArch64/AArch64Processors.td 
b/llvm/lib/Target/AArch64/AArch64Processors.td
index f2286ae17dba5..96422758bc618 100644
--- a/llvm/lib/Target/AArch64/AArch64Processors.td
+++ b/llvm/lib/Target/AArch64/AArch64Processors.td
@@ -718,7 +718,7 @@ def ProcessorFeatures {
   list AppleA13 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFullFP16,
  FeatureFP16FML, FeatureSHA3];
-  list AppleA14 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
+  list AppleA14 = [HasV8_5aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFRInt3264,
  FeatureSpecRestrict, FeatureSSBS, 
FeatureSB,
  FeaturePredRes, FeatureCacheDeepPersist,

>From 74f6d426fa67b1f794a8ba2ac7c864830ee9c2b2 Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Mon, 20 May 2024 12:38:52 +0100
Subject: [PATCH 2/5] make m1+a14 v8.4 instead

---
 clang/lib/Basic/Targets/AArch64.cpp|  4 +++-
 clang/test/Driver/aarch64-mac-cpus.c   |  2 +-
 clang/test/Preprocessor/aarch64-target-features.c  |  8 +++-
 .../llvm/TargetParser/AArch64TargetParser.h|  4 ++--
 llvm/lib/Target/AArch64/AArch64Processors.td   | 14 +-
 llvm/test/DebugInfo/debug_frame_symbol.ll  |  2 +-
 .../AddressSanitizer/calls-only-smallfn.ll |  2 +-
 .../Instrumentation/AddressSanitizer/calls-only.ll |  2 +-
 llvm/unittests/TargetParser/TargetParserTest.cpp   |  8 
 9 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 5db1ce78c657f..692ec58235efe 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -286,7 +286,6 @@ void AArch64TargetInfo::getTargetDefinesARMV84A(const 
LangOptions &Opts,
 void AArch64TargetInfo::getTargetDefinesARMV85A(const LangOptions &Opts,
 MacroBuilder &Builder) const {
   Builder.defineMacro("__ARM_FEATURE_FRINT", "1");
-  Builder.defineMacro("__ARM_FEATURE_BTI", "1");
   // Also include the Armv8.4 defines
   getTargetDefinesARMV84A(Opts, Builder);
 }
@@ -499,6 +498,9 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (HasPAuthLR)
 Builder.defineMacro("__ARM_FEATURE_PAUTH_LR", "1");
 
+  if (HasBTI)
+Builder.defineMacro("__ARM_FEATURE_BTI", "1");
+
   if (HasUnalignedAccess)
 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
 
diff --git a/clang/test/Driver/aarch64-mac-cpus.c 
b/clang/test/Driver/aarch64-mac-cpus.c
index 5179731268950..488298cfd2d24 100644
--- a/clang/test/Driver/aarch64-mac-cpus.c
+++ b/clang/test/Driver/aarch64-mac-cpus.c
@@ -16,7 +16,7 @@
 // RUN: %clang --target=arm64-apple-macos -mcpu=apple-m1 -### -c %s 2>&1 | 
FileCheck --check-prefix=EXPLICIT-M1 %s
 
 // CHECK: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-m1"
-// CHECK-SAME: "-target-feature" "+v8.5a"
+// CHECK-SAME: "-target-feature" "+v8.4a"
 
 // EXPLICIT-A11: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a11"
 // EXPLICIT-A7: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a7"
diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index 82304a15a04a3..3f2c2929c7129 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -335,7 +335,7 @@
 // CHECK-MCPU-CARMEL: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" 
"+v8.2a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" 
"+fp-armv8" "-target-feature" "+fullfp16" "-target-feature" "+lse" 
"-target-feature" "+ras" "-target-feature" "+rdm" "-target-feature" "+sha2" 
"-target-feature" "+neon"
 
 // RUN: %clang -target x86_64-apple-macosx -arch arm64 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ARCH-ARM64 %s
-// CHECK-ARCH-ARM64: "-target-cpu" "apple-m1" "-target-feature" "+zcm" 
"-target-feature" "+zcz" "-target-feature" "+v8.5a" "-target-feature" "+aes" 
"-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" 
"+complxnum" "-target-feature" "+fp-armv8" "-target-feature" "+fullfp16" 
"-target-feature" "+fp16fml" "-target-feature" "+jsconv" "-target-feature" 
"+lse" "-target-feature" "+pauth" "-target-feature" "+ras" "-target-feature" 
"+rcpc" "-target-feature" "+rdm" "-target-feature" "+sha2" "-

[clang] [llvm] [AArch64] Decouple feature dependency expansion. (PR #94279)

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

https://github.com/tmatheson-arm approved this pull request.

LGTM. The main change to point out is that the target attribute will no longer 
accept internal feature names. I don't think it should ever have done so, but 
we should get input from others. @davemgreen? There are references to existing 
code in [D137617](https://reviews.llvm.org/D137617) but no details. If this has 
been used for e.g. intrinsics definitions, I am surprised there are not more 
test failures.

https://github.com/llvm/llvm-project/pull/94279
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Decouple feature dependency expansion. (PR #94279)

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

https://github.com/tmatheson-arm edited 
https://github.com/llvm/llvm-project/pull/94279
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Decouple feature dependency expansion. (PR #94279)

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


@@ -13665,9 +13665,9 @@ QualType 
ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
 }
 
 // Given a list of FMV features, add each of their backend features to the 
list.

tmatheson-arm wrote:

```suggestion
// Given a list of FMV features, return a concatenated list of the corresponding
// backend features (which might contain duplicates).
```

https://github.com/llvm/llvm-project/pull/94279
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Decouple feature dependency expansion. (PR #94279)

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


@@ -48,5 +48,5 @@ int test_versions() {
 return code();
 }
 // CHECK: attributes #0 = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" }
-// CHECK: attributes #1 = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+neon" }
-// CHECK: attributes #2 = { noinline nounwind optnone 
"no-trapping-math"="true" "stack-protector-buffer-size"="8" 
"target-features"="+fp-armv8,+fullfp16,+neon,+sve" }

tmatheson-arm wrote:

I think this is ok. `-march=armv8-a+nosimd+sve` gives `-target-feature -neon`, 
i.e. `+sve` does not imply `+simd`. The reason we don't see `+neon` here is 
because the test uses a `-cc1` command line and does not specify 
`-target-feature +neon`, as the driver would for the same triple. So the test 
is maybe not actually representative of what would be done if going through the 
driver, but the changes here look correct given that nothing asks for `+neon`.

`+simd` now implies `+fp-armv8` because `def FeatureNEON` says it does.

https://github.com/llvm/llvm-project/pull/94279
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] set AppleA14 architecture version to v8.4-a (PR #92600)

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

https://github.com/tmatheson-arm updated 
https://github.com/llvm/llvm-project/pull/92600

>From 518b83ab69c4852f7e7ea71c17df3f58e8ff50ef Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Fri, 17 May 2024 21:39:17 +0100
Subject: [PATCH 1/5] [AArch64] set AppleA14 architecture version to 8.5

---
 llvm/lib/Target/AArch64/AArch64Processors.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AArch64/AArch64Processors.td 
b/llvm/lib/Target/AArch64/AArch64Processors.td
index f2286ae17dba5..96422758bc618 100644
--- a/llvm/lib/Target/AArch64/AArch64Processors.td
+++ b/llvm/lib/Target/AArch64/AArch64Processors.td
@@ -718,7 +718,7 @@ def ProcessorFeatures {
   list AppleA13 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFullFP16,
  FeatureFP16FML, FeatureSHA3];
-  list AppleA14 = [HasV8_4aOps, FeatureCrypto, 
FeatureFPARMv8,
+  list AppleA14 = [HasV8_5aOps, FeatureCrypto, 
FeatureFPARMv8,
  FeatureNEON, FeaturePerfMon, 
FeatureFRInt3264,
  FeatureSpecRestrict, FeatureSSBS, 
FeatureSB,
  FeaturePredRes, FeatureCacheDeepPersist,

>From 74f6d426fa67b1f794a8ba2ac7c864830ee9c2b2 Mon Sep 17 00:00:00 2001
From: Tomas Matheson 
Date: Mon, 20 May 2024 12:38:52 +0100
Subject: [PATCH 2/5] make m1+a14 v8.4 instead

---
 clang/lib/Basic/Targets/AArch64.cpp|  4 +++-
 clang/test/Driver/aarch64-mac-cpus.c   |  2 +-
 clang/test/Preprocessor/aarch64-target-features.c  |  8 +++-
 .../llvm/TargetParser/AArch64TargetParser.h|  4 ++--
 llvm/lib/Target/AArch64/AArch64Processors.td   | 14 +-
 llvm/test/DebugInfo/debug_frame_symbol.ll  |  2 +-
 .../AddressSanitizer/calls-only-smallfn.ll |  2 +-
 .../Instrumentation/AddressSanitizer/calls-only.ll |  2 +-
 llvm/unittests/TargetParser/TargetParserTest.cpp   |  8 
 9 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 5db1ce78c657f..692ec58235efe 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -286,7 +286,6 @@ void AArch64TargetInfo::getTargetDefinesARMV84A(const 
LangOptions &Opts,
 void AArch64TargetInfo::getTargetDefinesARMV85A(const LangOptions &Opts,
 MacroBuilder &Builder) const {
   Builder.defineMacro("__ARM_FEATURE_FRINT", "1");
-  Builder.defineMacro("__ARM_FEATURE_BTI", "1");
   // Also include the Armv8.4 defines
   getTargetDefinesARMV84A(Opts, Builder);
 }
@@ -499,6 +498,9 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (HasPAuthLR)
 Builder.defineMacro("__ARM_FEATURE_PAUTH_LR", "1");
 
+  if (HasBTI)
+Builder.defineMacro("__ARM_FEATURE_BTI", "1");
+
   if (HasUnalignedAccess)
 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
 
diff --git a/clang/test/Driver/aarch64-mac-cpus.c 
b/clang/test/Driver/aarch64-mac-cpus.c
index 5179731268950..488298cfd2d24 100644
--- a/clang/test/Driver/aarch64-mac-cpus.c
+++ b/clang/test/Driver/aarch64-mac-cpus.c
@@ -16,7 +16,7 @@
 // RUN: %clang --target=arm64-apple-macos -mcpu=apple-m1 -### -c %s 2>&1 | 
FileCheck --check-prefix=EXPLICIT-M1 %s
 
 // CHECK: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-m1"
-// CHECK-SAME: "-target-feature" "+v8.5a"
+// CHECK-SAME: "-target-feature" "+v8.4a"
 
 // EXPLICIT-A11: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a11"
 // EXPLICIT-A7: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a7"
diff --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index 82304a15a04a3..3f2c2929c7129 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -335,7 +335,7 @@
 // CHECK-MCPU-CARMEL: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" 
"+v8.2a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" 
"+fp-armv8" "-target-feature" "+fullfp16" "-target-feature" "+lse" 
"-target-feature" "+ras" "-target-feature" "+rdm" "-target-feature" "+sha2" 
"-target-feature" "+neon"
 
 // RUN: %clang -target x86_64-apple-macosx -arch arm64 -### -c %s 2>&1 | 
FileCheck --check-prefix=CHECK-ARCH-ARM64 %s
-// CHECK-ARCH-ARM64: "-target-cpu" "apple-m1" "-target-feature" "+zcm" 
"-target-feature" "+zcz" "-target-feature" "+v8.5a" "-target-feature" "+aes" 
"-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" 
"+complxnum" "-target-feature" "+fp-armv8" "-target-feature" "+fullfp16" 
"-target-feature" "+fp16fml" "-target-feature" "+jsconv" "-target-feature" 
"+lse" "-target-feature" "+pauth" "-target-feature" "+ras" "-target-feature" 
"+rcpc" "-target-feature" "+rdm" "-target-feature" "+sha2" "-

[clang] 1b13bc0 - [AArch64] fix Windows buildbot failure

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

Author: Tomas Matheson
Date: 2024-06-10T14:47:23+01:00
New Revision: 1b13bc05fe4a3b7b4916387543f0a64d41909e83

URL: 
https://github.com/llvm/llvm-project/commit/1b13bc05fe4a3b7b4916387543f0a64d41909e83
DIFF: 
https://github.com/llvm/llvm-project/commit/1b13bc05fe4a3b7b4916387543f0a64d41909e83.diff

LOG: [AArch64] fix Windows buildbot failure

Introduced by 2cf14398c9341feddb419e7ff9c8c5623a3da3db (#94279).
See also 6c369cf937b7d9acb98a1fc46b1340cef7703e12.
The build system cannot track transitive dependencies on generated
headers for some reason.

Added: 


Modified: 
clang/lib/AST/CMakeLists.txt

Removed: 




diff  --git a/clang/lib/AST/CMakeLists.txt b/clang/lib/AST/CMakeLists.txt
index a5d3dacfc1a84..0328666d59b1f 100644
--- a/clang/lib/AST/CMakeLists.txt
+++ b/clang/lib/AST/CMakeLists.txt
@@ -139,4 +139,6 @@ add_clang_library(clangAST
   omp_gen
   ClangDriverOptions
   intrinsics_gen
+  # These generated headers are included transitively.
+  AArch64TargetParserTableGen
   )



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] set AppleA14 architecture version to v8.4-a (PR #92600)

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

https://github.com/tmatheson-arm closed 
https://github.com/llvm/llvm-project/pull/92600
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] Reland "[AArch64] Decouple feature dependency expansion. (#94279)" (PR #95231)

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

https://github.com/tmatheson-arm approved this pull request.


https://github.com/llvm/llvm-project/pull/95231
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [AArch64] Add support for Cortex-A725 and Cortex-X925 (PR #95214)

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

https://github.com/tmatheson-arm approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/95214
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [llvm][AArch64] Support -mcpu=apple-m4 (PR #95478)

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


@@ -521,7 +521,14 @@ inline constexpr CpuInfo CpuInfos[] = {
  AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
AArch64::AEK_SHA3, AArch64::AEK_FP16,
AArch64::AEK_FP16FML})},
-
+// Technically apple-m4 is ARMv9.2a, but a quirk of LLVM defines v9.0 as
+// requiring SVE, which is optional according to the Arm ARM and not
+// supported by the core. ARMv8.7a is the next closest choice.

tmatheson-arm wrote:

>From the Arm ARM: 
> FEAT_SVE2 is OPTIONAL from Armv9.0.

In LLVM, SVE2 is an `Implied` (read: mandatory) feature of 9.0-a (wrong), and 
SVE and SVE2 are both on by default for the architecture:
```
def HasV9_0aOps : Architecture64<9, 0, "a", "v9a",
  [HasV8_5aOps, FeatureMEC, FeatureSVE2],
  !listconcat(HasV8_5aOps.DefaultExts, [FeatureFullFP16, FeatureSVE,
FeatureSVE2])>;
```

It should be possible to remove SVE2 from the `Implied` list while keeping it 
in the list of default extensions, which would avoid any user-facing changes.

I'm not sure why FEAT_MEC is enabled there either.
> FEAT_MEC is OPTIONAL from Armv9.2.


https://github.com/llvm/llvm-project/pull/95478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


  1   2   3   4   >