[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