On 7/29/25 8:16 AM, Jens Remus wrote:
> SFrame FREs without any offsets will later be used to represent an
> undefined return address (RA) in SFrame. This API can then be used,
> for instance by libsframe when dumping SFrame stack trace information
> (e.g. in objdump and readelf), to test for RA undefined. Other users
> of libsframe need the same capability.
>
> include/
> * sframe-api.h (sframe_fre_get_ra_undefined_p): New declaration.
>
> libsframe/
> * libsframe.ver (sframe_fre_get_ra_undefined_p): List new API.
> * sframe.c (sframe_fre_get_ra_undefined_p): New definition.
>
> Signed-off-by: Jens Remus <jremus@linux.ibm.com>
Reviewed-by: Indu Bhagat <indu.bhagat@oracle.com>
> ---
>
> Notes (jremus):
> Changes in V5:
> - Make this a preparatory patch for the next one. Instead of using
> SFRAME_V2_FRE_RA_UNDEFINED_P test FRE offset count for zero.
> - Reword commit message.
>
> Changes in V4:
> - New patch. Alternative to adding an API to get the FRE offset count.
>
> include/sframe-api.h | 6 ++++++
> libsframe/libsframe.ver | 5 +++++
> libsframe/sframe.c | 18 ++++++++++++++++++
> 3 files changed, 29 insertions(+)
>
> diff --git a/include/sframe-api.h b/include/sframe-api.h
> index 8c26257fb643..507f806ab4c4 100644
> --- a/include/sframe-api.h
> +++ b/include/sframe-api.h
> @@ -230,6 +230,12 @@ extern bool
> sframe_fre_get_ra_mangled_p (sframe_decoder_ctx *dctx,
> sframe_frame_row_entry *fre, int *errp);
>
> +/* Get whether the RA is undefined (i.e. outermost frame). */
> +
> +bool
> +sframe_fre_get_ra_undefined_p (const sframe_decoder_ctx *dctx ATTRIBUTE_UNUSED,
> + const sframe_frame_row_entry *fre, int *errp);
> +
> /* The SFrame Encoder. */
>
> /* Create an encoder context with the given SFrame format version VER, FLAGS
> diff --git a/libsframe/libsframe.ver b/libsframe/libsframe.ver
> index 8cc80da2f26a..4286a72b93bc 100644
> --- a/libsframe/libsframe.ver
> +++ b/libsframe/libsframe.ver
> @@ -41,3 +41,8 @@ LIBSFRAME_2.0 {
> local:
> *;
> } LIBSFRAME_0.0;
> +
> +LIBSFRAME_2.1 {
> + global:
> + sframe_fre_get_ra_undefined_p;
> +} LIBSFRAME_2.0;
> diff --git a/libsframe/sframe.c b/libsframe/sframe.c
> index 2bd9da573f00..e4ef22720924 100644
> --- a/libsframe/sframe.c
> +++ b/libsframe/sframe.c
> @@ -131,6 +131,12 @@ sframe_get_fre_ra_mangled_p (uint8_t fre_info)
> return SFRAME_V1_FRE_MANGLED_RA_P (fre_info);
> }
>
> +static bool
> +sframe_get_fre_ra_undefined_p (uint8_t fre_info)
> +{
> + return SFRAME_V1_FRE_OFFSET_COUNT (fre_info) == 0;
> +}
> +
> /* Access functions for info from function descriptor entry. */
>
> static uint32_t
> @@ -777,6 +783,18 @@ sframe_fre_get_ra_mangled_p (sframe_decoder_ctx *dctx ATTRIBUTE_UNUSED,
> return sframe_get_fre_ra_mangled_p (fre->fre_info);
> }
>
> +/* Get whether the RA is undefined (i.e. outermost frame). */
> +
> +bool
> +sframe_fre_get_ra_undefined_p (const sframe_decoder_ctx *dctx ATTRIBUTE_UNUSED,
> + const sframe_frame_row_entry *fre, int *errp)
> +{
> + if (fre == NULL || !sframe_fre_sanity_check_p (fre))
> + return sframe_set_errno (errp, SFRAME_ERR_FRE_INVAL);
> +
> + return sframe_get_fre_ra_undefined_p (fre->fre_info);
> +}
> +
> static int
> sframe_frame_row_entry_copy (sframe_frame_row_entry *dst,
> sframe_frame_row_entry *src)