aboutsummaryrefslogtreecommitdiff
path: root/libsframe/sframe-dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsframe/sframe-dump.c')
-rw-r--r--libsframe/sframe-dump.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c
index 47ac00e..d55d384 100644
--- a/libsframe/sframe-dump.c
+++ b/libsframe/sframe-dump.c
@@ -38,6 +38,14 @@ is_sframe_abi_arch_aarch64 (sframe_decoder_ctx *sfd_ctx)
return aarch64_p;
}
+/* Return TRUE if the SFrame section is associated with the s390x ABI. */
+
+static bool
+is_sframe_abi_arch_s390x (sframe_decoder_ctx *sfd_ctx)
+{
+ return sframe_decoder_get_abi_arch (sfd_ctx) == SFRAME_ABI_S390X_ENDIAN_BIG;
+}
+
static void
dump_sframe_header_flags (sframe_decoder_ctx *sfd_ctx)
{
@@ -186,7 +194,13 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx,
/* Dump SP/FP info. */
if (err[1] == 0)
- sprintf (temp, "c%+d", fp_offset);
+ {
+ if (is_sframe_abi_arch_s390x (sfd_ctx)
+ && SFRAME_V2_S390X_OFFSET_IS_REGNUM (fp_offset))
+ sprintf (temp, "r%d", SFRAME_V2_S390X_OFFSET_DECODE_REGNUM (fp_offset));
+ else
+ sprintf (temp, "c%+d", fp_offset);
+ }
else
strcpy (temp, "u");
printf ("%-10s", temp);
@@ -197,8 +211,18 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx,
if (sframe_decoder_get_fixed_ra_offset (sfd_ctx)
!= SFRAME_CFA_FIXED_RA_INVALID)
strcpy (temp, "f");
+ /* If an ABI does track RA offset, e.g. s390x, it can be a padding
+ to represent FP without RA being saved on stack. */
+ else if (err[2] == 0 && ra_offset == SFRAME_FRE_RA_OFFSET_INVALID)
+ sprintf (temp, "U");
else if (err[2] == 0)
- sprintf (temp, "c%+d", ra_offset);
+ {
+ if (is_sframe_abi_arch_s390x (sfd_ctx)
+ && SFRAME_V2_S390X_OFFSET_IS_REGNUM (ra_offset))
+ sprintf (temp, "r%d", SFRAME_V2_S390X_OFFSET_DECODE_REGNUM (ra_offset));
+ else
+ sprintf (temp, "c%+d", ra_offset);
+ }
else
strcpy (temp, "u");