readelf/objdump: Display SFrame fixed RA offset as 'f' in dump

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>
This commit is contained in:
Jens Remus 2024-07-04 10:34:12 +02:00
parent 76f05e1dfb
commit 5c7f6da432
11 changed files with 40 additions and 38 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 +
#...

View File

@ -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 +

View File

@ -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. */