[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