]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
include: libsframe: Add API to get RA undefined
authorJens Remus <jremus@linux.ibm.com>
Wed, 15 Oct 2025 15:45:48 +0000 (17:45 +0200)
committerJens Remus <jremus@linux.ibm.com>
Wed, 15 Oct 2025 15:45:48 +0000 (17:45 +0200)
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>
include/sframe-api.h
libsframe/libsframe.ver
libsframe/sframe.c

index 8c26257fb64399237c6873a119450c9e97ac19ee..507f806ab4c43f0475a491e59f957b0b5bef81eb 100644 (file)
@@ -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
index 8cc80da2f26ae566134b9ef98277bddc28be0d0b..4286a72b93bce970954e11dbc96b4af9a4595d0f 100644 (file)
@@ -41,3 +41,8 @@ LIBSFRAME_2.0 {
   local:
     *;
 } LIBSFRAME_0.0;
+
+LIBSFRAME_2.1 {
+  global:
+    sframe_fre_get_ra_undefined_p;
+} LIBSFRAME_2.0;
index f56742ee1a11504fabf1eba6c4229ad5f34d6957..bd39780a9135ae521a2c772f507ed40e6398e2e9 100644 (file)
@@ -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)