diff options
Diffstat (limited to 'libsframe/sframe-dump.c')
-rw-r--r-- | libsframe/sframe-dump.c | 28 |
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"); |