]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
s390: gas: Support vector register names in CFI directives
authorJens Remus <jremus@linux.ibm.com>
Tue, 20 Jan 2026 09:33:56 +0000 (10:33 +0100)
committerJens Remus <jremus@linux.ibm.com>
Tue, 20 Jan 2026 09:33:56 +0000 (10:33 +0100)
Convert vector register names v0-v31 to DWARF register numbers when used
in CFI directives.  Convert a vector register number (0..31) to its
respective DWARF register number (16..31, 68..83) as specified in the
s390 64-bit (s390x) ELF ABI [1] as follows:
Right rotate the least significant three bits and add 16 for register
numbers 0..15 or 68 for register numbers 16..31.

Add a test case for the use of vector register (VR) names in CFI
directives.

[1]: s390x ELF ABI, https://github.com/IBM/s390x-abi/releases

gas/
* config/tc-s390.c (tc_s390_regname_to_dw2regnum): Convert
vector register names (v0..v31) to DWARF register numbers.

gas/testsuite/
* gas/s390/cfi-regnames.d: Add test for VR 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>
gas/config/tc-s390.c
gas/testsuite/gas/s390/cfi-regnames-err.l
gas/testsuite/gas/s390/cfi-regnames-err.s
gas/testsuite/gas/s390/cfi-regnames.d
gas/testsuite/gas/s390/cfi-regnames.s

index 9af835bb4b96707a44b0f258843ca37bd2ffd50c..09f43e836b943b1ae919fe93861a7217305e6f19 100644 (file)
@@ -2878,16 +2878,18 @@ tc_s390_regname_to_dw2regnum (char *regname)
   if (regname[0] != 'c' && regname[0] != 'a')
     {
       regnum = reg_name_search (regname);
-      if (regname[0] == 'f' && regnum != -1)
+      if ((regname[0] == 'f' || regname[0] == 'v') && regnum != -1)
        {
-         /* Convert from floating-point register number (0..15)
-          * to DWARF floating point register number (15..31):
-          * Right rotate the least significant three bits and add 16.  */
+         /* Convert from floating-point register number (0..15) and
+          * vector register number (0..31) to DWARF register number
+          * (15..31, 68..83):  Right rotate the least significant
+          * three bits.  For floating-point registers add 16.  For
+          * vector registers 0..15 add 16 and for 16..31 add 86.  */
          int dw2_regnum;
          dw2_regnum = (regnum & 0b110) >> 1;
          dw2_regnum |= (regnum & 0b1) << 2;
          dw2_regnum |= (regnum & 0b1000);
-         dw2_regnum += 16;
+         dw2_regnum += (regnum < 16) ? 16 : 68;
          regnum = dw2_regnum;
        }
     }
index 7944f9b78fcb862ca62b3120f62da72183258d9f..3cc4998e0efe1538f33893afe611dcac5f63191a 100644 (file)
@@ -6,3 +6,6 @@
 # Invalid floating-point register names
 .*:7: Error: bad register expression
 .*:8: Error: bad register expression
+# Invalid vector register names
+.*:10: Error: bad register expression
+.*:11: Error: bad register expression
index 55eae2cf1513b6e1d14cdbeccbd75bd8f3de795f..02cca7878aac500e8c3ad2f08614f53c1bb1553e 100644 (file)
@@ -6,4 +6,7 @@
 # Invalid floating-point register names
        .cfi_register f0, f16
        .cfi_register %f0, %f16
+# Invalid vector register names
+       .cfi_register v0, v32
+       .cfi_register %v0, %v32
        .cfi_endproc
index 8e4740587350dc3333e3ac267e8c56c693eb4f98..cb5efeab364ffdae5d0221486cda3496c494d8e5 100644 (file)
@@ -34,3 +34,29 @@ Contents of the .eh_frame section:
   DW_CFA_register: r27 \(f14\) in r31 \(f15\)
   DW_CFA_nop
   DW_CFA_nop
+
+# Vector register (VR) names v0..v31
+00000070 0000000000000044 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\)
+  DW_CFA_register: r18 \(f4\) in r22 \(f5\)
+  DW_CFA_register: r19 \(f6\) in r23 \(f7\)
+  DW_CFA_register: r24 \(f8\) in r28 \(f9\)
+  DW_CFA_register: r25 \(f10\) in r29 \(f11\)
+  DW_CFA_register: r26 \(f12\) in r30 \(f13\)
+  DW_CFA_register: r27 \(f14\) in r31 \(f15\)
+  DW_CFA_register: r68 \(v16\) in r72 \(v17\)
+  DW_CFA_register: r69 \(v18\) in r73 \(v19\)
+  DW_CFA_register: r70 \(v20\) in r74 \(v21\)
+  DW_CFA_register: r71 \(v22\) in r75 \(v23\)
+  DW_CFA_register: r76 \(v24\) in r80 \(v25\)
+  DW_CFA_register: r77 \(v26\) in r81 \(v27\)
+  DW_CFA_register: r78 \(v28\) in r82 \(v29\)
+  DW_CFA_register: r79 \(v30\) in r83 \(v31\)
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
index cd11d4da450ff9c780544984ef665a0773a76156..86c67870d66fd973c7b467f262b17b5288d62596 100644 (file)
@@ -31,3 +31,27 @@ fpr:
        .word 0
        .cfi_endproc
        .size fpr, .-fpr
+# Vector register (VR) names v0..v31
+       .type vr, @function
+vr:
+       .cfi_startproc
+       .word 0
+       .cfi_register v0, v1
+       .cfi_register v2, v3
+       .cfi_register v4, v5
+       .cfi_register v6, v7
+       .cfi_register v8, v9
+       .cfi_register v10, v11
+       .cfi_register v12, v13
+       .cfi_register v14, v15
+       .cfi_register v16, v17
+       .cfi_register v18, v19
+       .cfi_register v20, v21
+       .cfi_register v22, v23
+       .cfi_register v24, v25
+       .cfi_register v26, v27
+       .cfi_register v28, v29
+       .cfi_register v30, v31
+       .word 0
+       .cfi_endproc
+       .size vr, .-vr