[binutils-gdb/jremus/sframe-v3-s390x] s390: gas: sframe: Represent .cfi_register FP/RA using FLEX_TOPMOST_FRAME

Jens Remus jremus@sourceware.org
Mon Dec 15 16:25:51 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4ff286f43adb5ed3d572db3f0979c5de77522846

commit 4ff286f43adb5ed3d572db3f0979c5de77522846
Author: Jens Remus <jremus@linux.ibm.com>
Date:   Fri Dec 12 16:05:01 2025 +0100

    s390: gas: sframe: Represent .cfi_register FP/RA using FLEX_TOPMOST_FRAME
    
    Signed-off-by: Jens Remus <jremus@linux.ibm.com>

Diff:
---
 gas/gen-sframe.c                                   | 40 ++--------------------
 .../cfi-sframe/cfi-sframe-s390x-fpra-register-1.d  |  8 ++---
 .../cfi-sframe/cfi-sframe-s390x-fpra-register-2.d  |  6 ++--
 include/sframe.h                                   | 13 -------
 libsframe/sframe-dump.c                            |  4 +--
 5 files changed, 11 insertions(+), 60 deletions(-)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index 36976353f99..f00811adfc3 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -1449,36 +1449,6 @@ sframe_xlate_do_val_offset (const struct sframe_xlate_ctx *xlate_ctx ATTRIBUTE_U
   return SFRAME_XLATE_OK;
 }
 
-/* S390-specific translate DW_CFA_register into SFrame context.
-   Return SFRAME_XLATE_OK if success.  */
-
-static int
-s390_sframe_xlate_do_register (struct sframe_xlate_ctx *xlate_ctx,
-			       const struct cfi_insn_data *cfi_insn)
-{
-  /* The scratchpad FRE currently being updated with each cfi_insn
-     being interpreted.  This FRE eventually gets linked in into the
-     list of FREs for the specific function.  */
-  struct sframe_row_entry *cur_fre = xlate_ctx->cur_fre;
-
-  gas_assert (cur_fre);
-
-  /* Change the rule for the register indicated by the register number to
-     be the specified register.  Encode the register number as offset by
-     shifting it to the left by one and setting the least-significant bit
-     (LSB).  The LSB can be used to differentiate offsets from register
-     numbers, as offsets from CFA are always a multiple of -8 on s390x.  */
-  if (cfi_insn->u.rr.reg1 == SFRAME_CFA_FP_REG)
-    sframe_fre_set_fp_track (cur_fre,
-			     SFRAME_V3_S390X_OFFSET_ENCODE_REGNUM (cfi_insn->u.rr.reg2));
-  else if (sframe_ra_tracking_p ()
-	   && cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG)
-    sframe_fre_set_ra_track (cur_fre,
-			     SFRAME_V3_S390X_OFFSET_ENCODE_REGNUM (cfi_insn->u.rr.reg2));
-
-  return SFRAME_XLATE_OK;
-}
-
 /* Translate DW_CFA_register into SFrame context.
 
    This opcode indicates: Previous value of register1 is register2.  This is
@@ -1487,9 +1457,7 @@ s390_sframe_xlate_do_register (struct sframe_xlate_ctx *xlate_ctx,
    while warning the user.
 
    Two exceptions apply though:
-     - for S390X, the stack offsets are used to carry register number in
-       default FDE types.  So invoke S390X specific handling.
-     - for AMD64, the flexible topmost frame encoding
+     - for AMD64 and s390x, the flexible topmost frame encoding
        SFRAME_FDE_TYPE_FLEX_TOPMOST_FRAME can be used for FP, RA registers.
 
    Return SFRAME_XLATE_OK if success.  */
@@ -1498,10 +1466,8 @@ static int
 sframe_xlate_do_register (struct sframe_xlate_ctx *xlate_ctx,
 			  const struct cfi_insn_data *cfi_insn)
 {
-  /* Conditionally invoke S390-specific implementation.  */
-  if (sframe_get_abi_arch () == SFRAME_ABI_S390X_ENDIAN_BIG)
-    return s390_sframe_xlate_do_register (xlate_ctx, cfi_insn);
-  else if (sframe_get_abi_arch () == SFRAME_ABI_AMD64_ENDIAN_LITTLE)
+  if (sframe_get_abi_arch () == SFRAME_ABI_AMD64_ENDIAN_LITTLE
+      || sframe_get_abi_arch () == SFRAME_ABI_S390X_ENDIAN_BIG)
     {
       struct sframe_row_entry *cur_fre = xlate_ctx->cur_fre;
 
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-1.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-1.d
index c53b2477cdc..bcec3403eec 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-1.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-1.d
@@ -1,4 +1,4 @@
-#name: SFrame generation on s390x - RA and then FP saved in registers
+#name: SFrame generation on s390x - RA and then FP saved in FPR registers
 #objdump: --sframe=.sframe
 #...
 Contents of the SFrame section .sframe:
@@ -15,8 +15,8 @@ Contents of the SFrame section .sframe:
     func idx \[0\]: pc = 0x0, size = 26 bytes
     STARTPC +CFA +FP +RA +
     0+0000 +sp\+160 +u +u +
-    0+0004 +sp\+160 +u +r16 +
-    0+0008 +sp\+160 +r17 +r16 +
-    0+0014 +sp\+160 +u +r16 +
+    0+0004 +sp\+160 +u +r16\+0 +
+    0+0008 +sp\+160 +r17\+0 +r16\+0 +
+    0+0014 +sp\+160 +u +r16\+0 +
     0+0018 +sp\+160 +u +u +
 #pass
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-2.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-2.d
index f781fb1dee9..699eb9a4f17 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-2.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-s390x-fpra-register-2.d
@@ -15,8 +15,8 @@ Contents of the SFrame section .sframe:
     func idx \[0\]: pc = 0x0, size = 26 bytes
     STARTPC +CFA +FP +RA +
     0+0000 +sp\+160 +u +u +
-    0+0004 +sp\+160 +r17 +U +
-    0+0008 +sp\+160 +r17 +r16 +
-    0+0014 +sp\+160 +r17 +U +
+    0+0004 +sp\+160 +r17\+0 +U +
+    0+0008 +sp\+160 +r17\+0 +r16\+0 +
+    0+0014 +sp\+160 +r17\+0 +U +
     0+0018 +sp\+160 +u +u +
 #pass
diff --git a/include/sframe.h b/include/sframe.h
index 0afe62d4310..12ec2ab41a7 100644
--- a/include/sframe.h
+++ b/include/sframe.h
@@ -509,19 +509,6 @@ typedef struct sframe_frame_row_entry_addr4
 #define SFRAME_V2_S390X_OFFSET_DECODE_REGNUM(offset) \
   ((offset) >> 1)
 
-/* In SFrame V3, change the encoding of register numbers in the SFrame offsets
-   on s390x by keeping the lower 3 bits aside.
-   - LSB=0: Stack offset.  The s390x ELF ABI mandates that stack register
-     slots must be 8-byte aligned.
-   - LSB=1: DWARF register number shifted to the left by three.
-   Bits 1 and 2 are currently unused.  */
-#define SFRAME_V3_S390X_OFFSET_IS_REGNUM(offset) \
-  ((offset) & 1)
-#define SFRAME_V3_S390X_OFFSET_ENCODE_REGNUM(regnum) \
-  (((regnum) << 3) | 1)
-#define SFRAME_V3_S390X_OFFSET_DECODE_REGNUM(offset) \
-  ((offset) >> 3)
-
 #ifdef	__cplusplus
 }
 #endif
diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c
index 20b6fcee3ff..b650720a6f9 100644
--- a/libsframe/sframe-dump.c
+++ b/libsframe/sframe-dump.c
@@ -123,7 +123,7 @@ sframe_s390x_offset_regnum_p (int32_t offset, uint8_t ver)
   if (ver == SFRAME_VERSION_2)
     return SFRAME_V2_S390X_OFFSET_IS_REGNUM (offset);
   else if (ver == SFRAME_VERSION_3)
-    return SFRAME_V3_S390X_OFFSET_IS_REGNUM (offset);
+    return false;
   else
     /* No other version is supported yet.  */
     sframe_assert (false);
@@ -134,8 +134,6 @@ sframe_s390x_offset_decode_regnum (int32_t offset, uint8_t ver)
 {
   if (ver == SFRAME_VERSION_2)
     return SFRAME_V2_S390X_OFFSET_DECODE_REGNUM (offset);
-  else if (ver == SFRAME_VERSION_3)
-    return SFRAME_V3_S390X_OFFSET_DECODE_REGNUM (offset);
   else
     /* No other version is supported yet.  */
     sframe_assert (false);


More information about the Binutils-cvs mailing list