[binutils-gdb] s390: gas: Support access register names in CFI directives
Jens Remus
jremus@sourceware.org
Tue Jan 20 09:34:36 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=645c27b9076a9e4a0f466aee923f4d2c881e2d71
commit 645c27b9076a9e4a0f466aee923f4d2c881e2d71
Author: Jens Remus <jremus@linux.ibm.com>
Date: Tue Jan 20 10:33:56 2026 +0100
s390: gas: Support access register names in CFI directives
Convert access register (AR) names a0-a15 to DWARF register numbers when
used in CFI directives. Convert an access register number (0..15) to
its corresponding DWARF register number (48..63) as specified in the
s390 64-bit (s390x) ELF ABI [1] by adding 48.
[1]: s390x ELF ABI, https://github.com/IBM/s390x-abi/releases
gas/
* config/tc-s390.c (tc_s390_regname_to_dw2regnum): Convert
access register names (a0..a15) to DWARF register numbers.
gas/testsuite/
* gas/s390/cfi-regnames.d: Add test for AR names in in CFI
directives.
* gas/s390/cfi-regnames.s: Likewise.
* gas/s390/cfi-regnames-err.l: Likewise.
* gas/s390/cfi-regnames-err.s: Likewise.
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
Diff:
---
gas/config/tc-s390.c | 6 +++++-
gas/testsuite/gas/s390/cfi-regnames-err.l | 3 +++
gas/testsuite/gas/s390/cfi-regnames-err.s | 3 +++
gas/testsuite/gas/s390/cfi-regnames.d | 16 +++++++++++++---
gas/testsuite/gas/s390/cfi-regnames.s | 16 ++++++++++++++++
5 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index 09f43e836b9..bcbe5c52f3a 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -2875,7 +2875,7 @@ tc_s390_regname_to_dw2regnum (char *regname)
{
int regnum = -1;
- if (regname[0] != 'c' && regname[0] != 'a')
+ if (regname[0] != 'c')
{
regnum = reg_name_search (regname);
if ((regname[0] == 'f' || regname[0] == 'v') && regnum != -1)
@@ -2892,6 +2892,10 @@ tc_s390_regname_to_dw2regnum (char *regname)
dw2_regnum += (regnum < 16) ? 16 : 68;
regnum = dw2_regnum;
}
+ else if (regname[0] == 'a' && regnum != -1)
+ {
+ regnum += 48;
+ }
}
else if (strcmp (regname, "ap") == 0)
regnum = 32;
diff --git a/gas/testsuite/gas/s390/cfi-regnames-err.l b/gas/testsuite/gas/s390/cfi-regnames-err.l
index 3cc4998e0ef..43a8abe766b 100644
--- a/gas/testsuite/gas/s390/cfi-regnames-err.l
+++ b/gas/testsuite/gas/s390/cfi-regnames-err.l
@@ -9,3 +9,6 @@
# Invalid vector register names
.*:10: Error: bad register expression
.*:11: Error: bad register expression
+# Invalid access register names
+.*:13: Error: bad register expression
+.*:14: Error: bad register expression
diff --git a/gas/testsuite/gas/s390/cfi-regnames-err.s b/gas/testsuite/gas/s390/cfi-regnames-err.s
index 02cca7878aa..1766a116096 100644
--- a/gas/testsuite/gas/s390/cfi-regnames-err.s
+++ b/gas/testsuite/gas/s390/cfi-regnames-err.s
@@ -9,4 +9,7 @@
# Invalid vector register names
.cfi_register v0, v32
.cfi_register %v0, %v32
+# Invalid access register names
+ .cfi_register a0, a16
+ .cfi_register %a0, %a16
.cfi_endproc
diff --git a/gas/testsuite/gas/s390/cfi-regnames.d b/gas/testsuite/gas/s390/cfi-regnames.d
index cb5efeab364..d1d0d5f4a69 100644
--- a/gas/testsuite/gas/s390/cfi-regnames.d
+++ b/gas/testsuite/gas/s390/cfi-regnames.d
@@ -36,7 +36,7 @@ Contents of the .eh_frame section:
DW_CFA_nop
# Vector register (VR) names v0..v31
-00000070 0000000000000044 00000074 FDE cie=00000000 pc=0000000000000008..000000000000000c
+00000070 0000000000000040 00000074 FDE cie=00000000 pc=0000000000000008..000000000000000c
DW_CFA_advance_loc: 2 to 000000000000000a
DW_CFA_register: r16 \(f0\) in r20 \(f1\)
DW_CFA_register: r17 \(f2\) in r21 \(f3\)
@@ -56,7 +56,17 @@ Contents of the .eh_frame section:
DW_CFA_register: r79 \(v30\) in r83 \(v31\)
DW_CFA_nop
DW_CFA_nop
- DW_CFA_nop
- DW_CFA_nop
+
+# Access register (AR) names a0..a15
+000000b4 0000000000000028 000000b8 FDE cie=00000000 pc=000000000000000c..0000000000000010
+ DW_CFA_advance_loc: 2 to 000000000000000e
+ DW_CFA_register: r48 \(a0\) in r49 \(a1\)
+ DW_CFA_register: r50 \(a2\) in r51 \(a3\)
+ DW_CFA_register: r52 \(a4\) in r53 \(a5\)
+ DW_CFA_register: r54 \(a6\) in r55 \(a7\)
+ DW_CFA_register: r56 \(a8\) in r57 \(a9\)
+ DW_CFA_register: r58 \(a10\) in r59 \(a11\)
+ DW_CFA_register: r60 \(a12\) in r61 \(a13\)
+ DW_CFA_register: r62 \(a14\) in r63 \(a15\)
DW_CFA_nop
DW_CFA_nop
diff --git a/gas/testsuite/gas/s390/cfi-regnames.s b/gas/testsuite/gas/s390/cfi-regnames.s
index 86c67870d66..f58822b0128 100644
--- a/gas/testsuite/gas/s390/cfi-regnames.s
+++ b/gas/testsuite/gas/s390/cfi-regnames.s
@@ -55,3 +55,19 @@ vr:
.word 0
.cfi_endproc
.size vr, .-vr
+# Access register (AR) names a0..a15
+ .type ar, @function
+ar:
+ .cfi_startproc
+ .word 0
+ .cfi_register a0, a1
+ .cfi_register a2, a3
+ .cfi_register a4, a5
+ .cfi_register a6, a7
+ .cfi_register a8, a9
+ .cfi_register a10, a11
+ .cfi_register a12, a13
+ .cfi_register a14, a15
+ .word 0
+ .cfi_endproc
+ .size ar, .-ar
More information about the Binutils-cvs
mailing list