[PATCH v5 3/4] include: libsframe: Add API to get RA undefined

Indu Bhagat indu.bhagat@oracle.com
Wed Jul 30 08:11:52 GMT 2025


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)



More information about the Binutils mailing list