[PATCH v3 04/15] readelf/objdump: Display SFrame fixed RA offset as 'f' in dump
Indu Bhagat
indu.bhagat@oracle.com
Thu Apr 18 07:40:02 GMT 2024
On 4/12/24 07:47, Jens Remus wrote:
> For the SFrame FRE frame-pointer (FP) offset from CFA a 'u' is displayed
> if it is unavailable.
>
> For the SFrame FRE return-address (RA) offset from CFA a 'u' was
> displayed if the ABI uses a fixed RA offset from CFA. By chance a
> 'u' was also displayed if the RA offset is unavailable, as the string
> buffer was not initialized after formatting the FP offset. Note that it
> could not occur that the FP offset was erroneously displayed as RA
> offset, as the SFrame format cannot have a FRE with FP offset without
> RA offset.
>
> For the FRE RA offset display 'f' if the ABI uses a fixed RA offset
> from CFA. Display a 'u' if it is unavailable.
>
> libsframe/
> * sframe-dump.c: Display SFrame fixed RA offset as 'f' in dump.
>
> gas/testsuite/
> * gas/cfi-sframe/cfi-sframe-common-4.d: Test for RA displayed
> either as 'u' (if RA tracking) or as 'f' (fixed RA offset if no
> RA tracking).
> * gas/cfi-sframe/cfi-sframe-common-5.d: Likewise.
> * gas/cfi-sframe/cfi-sframe-common-6.d: Likewise.
> * gas/cfi-sframe/cfi-sframe-common-7.d: Likewise.
> * gas/cfi-sframe/cfi-sframe-common-8.d: Likewise.
> * gas/cfi-sframe/cfi-sframe-x86_64-1.d: Test for RA displayed
> as 'f' (fixed RA offset), as x86-64 does not use RA tracking.
> * gas/scfi/x86_64/scfi-cfi-sections-1.d: Likewise.
> * gas/scfi/x86_64/scfi-dyn-stack-1.d: Likewise.
>
> ld/testsuite/
> * ld-x86-64/sframe-plt-1.d: Test for RA displayed as 'f' (fixed
> RA offset), as x86-64 does not use RA tracking.
> * ld-x86-64/sframe-simple-1.d: Likewise.
>
> Signed-off-by: Jens Remus <jremus@linux.ibm.com>
LGTM.
Thanks for your patch.
> ---
>
> Notes (jremus):
> Changes v2 -> v3:
> - New patch. If the change in display of fixed RA offset as 'f' is
> undesired the patch can be reduced to fixing the logic to display the
> FP offset.
>
> .../gas/cfi-sframe/cfi-sframe-common-4.d | 4 ++--
> .../gas/cfi-sframe/cfi-sframe-common-5.d | 4 ++--
> .../gas/cfi-sframe/cfi-sframe-common-6.d | 4 ++--
> .../gas/cfi-sframe/cfi-sframe-common-7.d | 4 ++--
> .../gas/cfi-sframe/cfi-sframe-common-8.d | 2 +-
> .../gas/cfi-sframe/cfi-sframe-x86_64-1.d | 8 ++++----
> .../gas/scfi/x86_64/scfi-cfi-sections-1.d | 10 +++++-----
> gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d | 10 +++++-----
> ld/testsuite/ld-x86-64/sframe-plt-1.d | 8 ++++----
> ld/testsuite/ld-x86-64/sframe-simple-1.d | 16 ++++++++--------
> libsframe/sframe-dump.c | 8 +++++---
> 11 files changed, 40 insertions(+), 38 deletions(-)
>
> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d
> index ca559bd0a029..8632613f532f 100644
> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d
> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d
> @@ -17,7 +17,7 @@ Contents of the SFrame section .sframe:
> func idx \[0\]: pc = 0x0, size = 12 bytes
> STARTPC + CFA + FP + RA +
> #...
> - 0+0004 +sp\+16 +u +u +
> - 0+0008 +sp\+32 +u +u +
> + 0+0004 +sp\+16 +u +[uf] +
> + 0+0008 +sp\+32 +u +[uf] +
>
> #pass
> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d
> index ee82053e13db..dd2c32d3d9fc 100644
> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d
> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d
> @@ -17,7 +17,7 @@ Contents of the SFrame section .sframe:
> func idx \[0\]: pc = 0x0, size = 12 bytes
> STARTPC + CFA + FP + RA +
> #...
> - 0+0004 +sp\+16 +u +u +
> - 0+0008 +sp\+24 +u +u +
> + 0+0004 +sp\+16 +u +[uf] +
> + 0+0008 +sp\+24 +u +[uf] +
>
> #pass
> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d
> index 9d54b98552bf..34390c46a074 100644
> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d
> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d
> @@ -17,7 +17,7 @@ Contents of the SFrame section .sframe:
> func idx \[0\]: pc = 0x0, size = 12 bytes
> STARTPC + CFA + FP + RA +
> #...
> - 0+0004 +sp\+8 +u +u +
> - 0+0008 +sp\+8 +u +u +
> + 0+0004 +sp\+8 +u +[uf] +
> + 0+0008 +sp\+8 +u +[uf] +
>
> #pass
> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d
> index 2b7fe3aec8f4..61efb9c4ed12 100644
> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d
> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d
> @@ -17,7 +17,7 @@ Contents of the SFrame section .sframe:
> func idx \[0\]: pc = 0x0, size = 12 bytes
> STARTPC + CFA + FP + RA +
> #...
> - 0+0004 +sp\+8 +u +u +
> - 0+0008 +sp\+8 +u +u +
> + 0+0004 +sp\+8 +u +[uf] +
> + 0+0008 +sp\+8 +u +[uf] +
>
> #pass
> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d
> index d654e1d0bcd4..d77645636b36 100644
> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d
> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d
> @@ -17,6 +17,6 @@ Contents of the SFrame section .sframe:
> func idx \[0\]: pc = 0x0, size = 8 bytes
> STARTPC + CFA + FP + RA +
> #...
> - 0+0004 +sp\+16 +u +u +
> + 0+0004 +sp\+16 +u +[uf] +
>
> #pass
> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d
> index c8b5e6adfea0..88b4cc63dbaa 100644
> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d
> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d
> @@ -16,8 +16,8 @@ Contents of the SFrame section .sframe:
>
> func idx \[0\]: pc = 0x0, size = 25 bytes
> STARTPC +CFA +FP +RA +
> - 0+0000 +sp\+8 +u +u +
> - 0+0001 +sp\+16 +c\-16 +u +
> - 0+0004 +fp\+16 +c\-16 +u +
> - 0+0018 +sp\+8 +c\-16 +u +
> + 0+0000 +sp\+8 +u +f +
> + 0+0001 +sp\+16 +c\-16 +f +
> + 0+0004 +fp\+16 +c\-16 +f +
> + 0+0018 +sp\+8 +c\-16 +f +
> #pass
> diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cfi-sections-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-cfi-sections-1.d
> index c45933b72edc..7c247e33a6e8 100644
> --- a/gas/testsuite/gas/scfi/x86_64/scfi-cfi-sections-1.d
> +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cfi-sections-1.d
> @@ -16,10 +16,10 @@ Contents of the SFrame section .sframe:
>
> func idx \[0\]: pc = 0x0, size = 12 bytes
> STARTPC + CFA + FP + RA +
> - 0+0000 +sp\+8 +u +u +
> - 0+0001 +sp\+16 +c\-16 +u +
> - 0+0004 +fp\+16 +c-16 +u +
> - 0+000a +sp\+16 +c\-16 +u +
> - 0+000b +sp\+8 +u +u +
> + 0+0000 +sp\+8 +u +f +
> + 0+0001 +sp\+16 +c\-16 +f +
> + 0+0004 +fp\+16 +c-16 +f +
> + 0+000a +sp\+16 +c\-16 +f +
> + 0+000b +sp\+8 +u +f +
>
> #pass
> diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d
> index 6cd0484d5793..c6a9b53f4e09 100644
> --- a/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d
> +++ b/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d
> @@ -16,10 +16,10 @@ Contents of the SFrame section .sframe:
> Function Index :
>
> func idx \[0\]: pc = 0x0, size = 87 bytes
> - STARTPC + CFA + FP + RA
> - 0+0000 + sp\+8 + u + u
> - 0+0001 + sp\+16 + c-16 + u
> - 0+0004 + fp\+16 + c-16 + u
> - 0+0056 + sp\+8 + u + u
> + STARTPC + CFA + FP + RA +
> + 0+0000 + sp\+8 + u + f +
> + 0+0001 + sp\+16 + c-16 + f +
> + 0+0004 + fp\+16 + c-16 + f +
> + 0+0056 + sp\+8 + u + f +
>
> #pass
> diff --git a/ld/testsuite/ld-x86-64/sframe-plt-1.d b/ld/testsuite/ld-x86-64/sframe-plt-1.d
> index 9d123a73826d..617fb9950acc 100644
> --- a/ld/testsuite/ld-x86-64/sframe-plt-1.d
> +++ b/ld/testsuite/ld-x86-64/sframe-plt-1.d
> @@ -19,12 +19,12 @@ Contents of the SFrame section .sframe:
>
> func idx \[0\]: pc = 0x1000, size = 16 bytes
> STARTPC +CFA +FP +RA +
> - 0+1000 +sp\+16 +u +u +
> - 0+1006 +sp\+24 +u +u +
> + 0+1000 +sp\+16 +u +f +
> + 0+1006 +sp\+24 +u +f +
>
> func idx \[1\]: pc = 0x1010, size = 16 bytes
> STARTPC\[m\] +CFA +FP +RA +
> - 0+0000 +sp\+8 +u +u +
> - 0+000b +sp\+16 +u +u +
> + 0+0000 +sp\+8 +u +f +
> + 0+000b +sp\+16 +u +f +
>
> #...
> diff --git a/ld/testsuite/ld-x86-64/sframe-simple-1.d b/ld/testsuite/ld-x86-64/sframe-simple-1.d
> index ce5f94386ac2..18c863938d39 100644
> --- a/ld/testsuite/ld-x86-64/sframe-simple-1.d
> +++ b/ld/testsuite/ld-x86-64/sframe-simple-1.d
> @@ -23,14 +23,14 @@ Contents of the SFrame section .sframe:
>
> func idx \[2\]: pc = 0x1020, size = 53 bytes
> STARTPC +CFA +FP +RA +
> - 0+1020 +sp\+8 +u +u +
> - 0+1021 +sp\+16 +c-16 +u +
> - 0+1024 +fp\+16 +c-16 +u +
> - 0+1054 +sp\+8 +c-16 +u +
> + 0+1020 +sp\+8 +u +f +
> + 0+1021 +sp\+16 +c-16 +f +
> + 0+1024 +fp\+16 +c-16 +f +
> + 0+1054 +sp\+8 +c-16 +f +
>
> func idx \[3\]: pc = 0x1055, size = 37 bytes
> STARTPC +CFA +FP +RA +
> - 0+1055 +sp\+8 +u +u +
> - 0+1056 +sp\+16 +c-16 +u +
> - 0+1059 +fp\+16 +c-16 +u +
> - 0+1079 +sp\+8 +c-16 +u +
> + 0+1055 +sp\+8 +u +f +
> + 0+1056 +sp\+16 +c-16 +f +
> + 0+1059 +fp\+16 +c-16 +f +
> + 0+1079 +sp\+8 +c-16 +f +
> diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c
> index 493d052ce91f..69633d53a33a 100644
> --- a/libsframe/sframe-dump.c
> +++ b/libsframe/sframe-dump.c
> @@ -181,13 +181,15 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx,
> printf ("%-10s", temp);
>
> /* Dump RA info.
> - If an ABI does not track RA offset, e.g., AMD64, display a 'u',
> + If an ABI does not track RA offset, e.g., AMD64, display 'f',
> else display the offset d as 'c+-d'. */
> - if (sframe_decoder_get_fixed_ra_offset(sfd_ctx)
> + if (sframe_decoder_get_fixed_ra_offset (sfd_ctx)
> != SFRAME_CFA_FIXED_RA_INVALID)
> - strcpy (temp, "u");
> + strcpy (temp, "f");
> else if (err[2] == 0)
> sprintf (temp, "c%+d", ra_offset);
> + else
> + strcpy (temp, "u");
>
> /* Mark SFrame FRE's RA information with "[s]" if the RA is mangled
> with signature bits. */
More information about the Binutils
mailing list