include: libsframe: Add API to get RA undefined

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>
This commit is contained in:
Jens Remus
2025-10-15 17:45:48 +02:00
parent 52308aeca8
commit 6ca8915c61
3 changed files with 29 additions and 0 deletions

View File

@@ -230,6 +230,12 @@ extern bool
sframe_fre_get_ra_mangled_p (sframe_decoder_ctx *dctx, sframe_fre_get_ra_mangled_p (sframe_decoder_ctx *dctx,
sframe_frame_row_entry *fre, int *errp); 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. */ /* The SFrame Encoder. */
/* Create an encoder context with the given SFrame format version VER, FLAGS /* Create an encoder context with the given SFrame format version VER, FLAGS

View File

@@ -41,3 +41,8 @@ LIBSFRAME_2.0 {
local: local:
*; *;
} LIBSFRAME_0.0; } LIBSFRAME_0.0;
LIBSFRAME_2.1 {
global:
sframe_fre_get_ra_undefined_p;
} LIBSFRAME_2.0;

View File

@@ -131,6 +131,12 @@ sframe_get_fre_ra_mangled_p (uint8_t fre_info)
return SFRAME_V1_FRE_MANGLED_RA_P (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. */ /* Access functions for info from function descriptor entry. */
static uint32_t 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); 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 static int
sframe_frame_row_entry_copy (sframe_frame_row_entry *dst, sframe_frame_row_entry_copy (sframe_frame_row_entry *dst,
sframe_frame_row_entry *src) sframe_frame_row_entry *src)