[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