From: Jens Remus Date: Thu, 4 Jul 2024 08:34:12 +0000 (+0200) Subject: readelf/objdump: Display SFrame fixed RA offset as 'f' in dump X-Git-Tag: binutils-2_43~214 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5c7f6da4323c6e7c74ad2b89c92794438a2c0e13;p=thirdparty%2Fbinutils-gdb.git 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 --- 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 ca559bd0a02..8632613f532 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 ee82053e13d..dd2c32d3d9f 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 9d54b98552b..34390c46a07 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 2b7fe3aec8f..61efb9c4ed1 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 d654e1d0bcd..d77645636b3 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 c8b5e6adfea..88b4cc63dba 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 c45933b72ed..7c247e33a6e 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 6cd0484d579..c6a9b53f4e0 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 6aea5f42469..52bca18d4c0 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 5ffd0ca7818..7d88419226f 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 493d052ce91..69633d53a33 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. */