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

Jens Remus jremus@linux.ibm.com
Fri Jul 25 16:23:33 GMT 2025


Use it in dumping SFrame stack trace information (e.g. in objdump and
readelf).

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>
---

Notes (jremus):
    Changes in V4:
    - New patch.  Alternative to adding an API to get the FRE offset count.

 include/sframe-api.h    |  6 ++++++
 libsframe/libsframe.ver |  1 +
 libsframe/sframe-dump.c |  8 ++++----
 libsframe/sframe.c      | 18 ++++++++++++++++++
 4 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/include/sframe-api.h b/include/sframe-api.h
index 02688e4edca4..a35c1604e9aa 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -236,6 +236,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 e02e29ae134f..9a301396f487 100644
--- a/libsframe/libsframe.ver
+++ b/libsframe/libsframe.ver
@@ -45,4 +45,5 @@ LIBSFRAME_2.0 {
 LIBSFRAME_2.1 {
   global:
     sframe_fre_get_offset_count;
+    sframe_fre_get_ra_undefined_p;
 } LIBSFRAME_2.0;
diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c
index bada1ee6c684..1290966439f2 100644
--- a/libsframe/sframe-dump.c
+++ b/libsframe/sframe-dump.c
@@ -130,7 +130,7 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx,
   uint64_t func_start_pc_vma = 0;
   uint64_t fre_start_pc_vma = 0;
   const char *base_reg_str[] = {"fp", "sp"};
-  int offset_count = 0;
+  bool ra_undefined_p = false;
   int32_t cfa_offset = 0;
   int32_t fp_offset = 0;
   int32_t ra_offset = 0;
@@ -181,9 +181,9 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx,
 			  : func_start_pc_vma + fre.fre_start_addr);
 
       /* FIXME - fixup the err caching in array.
-	 assert no error for base reg id and offset count.  */
+	 assert no error for base reg id and RA undefined.  */
       base_reg_id = sframe_fre_get_base_reg_id (&fre, &err[0]);
-      offset_count = sframe_fre_get_offset_count (sfd_ctx, &fre, &err[0]);
+      ra_undefined_p = sframe_fre_get_ra_undefined_p (sfd_ctx, &fre, &err[0]);
       cfa_offset = sframe_fre_get_cfa_offset (sfd_ctx, &fre, &err[0]);
       fp_offset = sframe_fre_get_fp_offset (sfd_ctx, &fre, &err[1]);
       ra_offset = sframe_fre_get_ra_offset (sfd_ctx, &fre, &err[2]);
@@ -193,7 +193,7 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx,
       printf ("    %016"PRIx64, fre_start_pc_vma);
 
       /* Dump RA undefined (FRE without any offsets).  */
-      if (offset_count == 0)
+      if (ra_undefined_p)
 	{
 	  printf ("  RA undefined");
 	  continue;
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index 108c2bf9d2a9..a2f882a5cb08 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_V2_FRE_RA_UNDEFINED_P (fre_info);
+}
+
 /* Access functions for info from function descriptor entry.  */
 
 static uint32_t
@@ -786,6 +792,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)
-- 
2.48.1



More information about the Binutils mailing list