aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndu Bhagat <indu.bhagat@oracle.com>2025-07-06 12:46:09 -0700
committerIndu Bhagat <indu.bhagat@oracle.com>2025-07-06 12:53:03 -0700
commit251c6789b37caebcaa7b29b5662fccd141f82027 (patch)
tree5fdbe5f115c39341a7ce36503af37888b2e71449
parent7030f7a0302182220866c5c512216062394b576e (diff)
downloadbinutils-251c6789b37caebcaa7b29b5662fccd141f82027.zip
binutils-251c6789b37caebcaa7b29b5662fccd141f82027.tar.gz
binutils-251c6789b37caebcaa7b29b5662fccd141f82027.tar.bz2
include: libsframe: add APIs for SFrame header flags
Add new APIs, one each for getting flags from the SFrame decoder and SFrame encoder context objects respectively. These will later be used by the linker to uniformly access the flags, given the SFrame decoder and SFrame encoder objects. Use the new API, where applicable, within libsframe. include/ * sframe-api.h (sframe_decoder_get_flags): New declaration. (sframe_encoder_get_flags): Likewise. libsframe/ * libsframe.ver: List new APIs. * sframe.c (sframe_decoder_get_flags): New definition. (sframe_encoder_get_flags): Likewise. (sframe_get_funcdesc_with_addr_internal): Use the new API. (sframe_encoder_get_flags): Likewise. (sframe_encoder_write_sframe): Likewise.
-rw-r--r--include/sframe-api.h8
-rw-r--r--libsframe/libsframe.ver5
-rw-r--r--libsframe/sframe.c24
3 files changed, 33 insertions, 4 deletions
diff --git a/include/sframe-api.h b/include/sframe-api.h
index 77ba32b..e5262ae 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -124,6 +124,10 @@ sframe_decoder_get_abi_arch (sframe_decoder_ctx *dctx);
extern uint8_t
sframe_decoder_get_version (sframe_decoder_ctx *dctx);
+/* Get the section flags from the SFrame decoder context DCTX. */
+extern uint8_t
+sframe_decoder_get_flags (sframe_decoder_ctx *dctx);
+
/* Return the number of function descriptor entries in the SFrame decoder
DCTX. */
extern uint32_t
@@ -238,6 +242,10 @@ sframe_encoder_get_abi_arch (sframe_encoder_ctx *encoder);
extern uint8_t
sframe_encoder_get_version (sframe_encoder_ctx *encoder);
+/* Get the section flags from the SFrame encoder context ENCODER. */
+extern uint8_t
+sframe_encoder_get_flags (sframe_encoder_ctx *encoder);
+
/* Return the number of function descriptor entries in the SFrame encoder
ENCODER. */
extern uint32_t
diff --git a/libsframe/libsframe.ver b/libsframe/libsframe.ver
index 57f5fb6..7038d69 100644
--- a/libsframe/libsframe.ver
+++ b/libsframe/libsframe.ver
@@ -38,3 +38,8 @@ LIBSFRAME_1.0 {
local:
*;
} LIBSFRAME_0.0;
+
+LIBSFRAME_1.1 {
+ sframe_decoder_get_flags;
+ sframe_encoder_get_flags;
+} LIBSFRAME_1.0;
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index 2894009..fcc2660 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -988,6 +988,15 @@ sframe_decoder_get_version (sframe_decoder_ctx *dctx)
return dhp->sfh_preamble.sfp_version;
}
+/* Get the section flags from the SFrame decoder context DCTX. */
+
+uint8_t
+sframe_decoder_get_flags (sframe_decoder_ctx *dctx)
+{
+ const sframe_header *dhp = sframe_decoder_get_header (dctx);
+ return dhp->sfh_preamble.sfp_flags;
+}
+
/* Get the SFrame's fixed FP offset given the decoder context CTX. */
int8_t
sframe_decoder_get_fixed_fp_offset (sframe_decoder_ctx *ctx)
@@ -1038,7 +1047,7 @@ sframe_get_funcdesc_with_addr_internal (sframe_decoder_ctx *ctx, int32_t addr,
return sframe_ret_set_errno (errp, SFRAME_ERR_DCTX_INVAL);
/* If the FDE sub-section is not sorted on PCs, skip the lookup because
binary search cannot be used. */
- if ((dhp->sfh_preamble.sfp_flags & SFRAME_F_FDE_SORTED) == 0)
+ if ((sframe_decoder_get_flags (ctx) & SFRAME_F_FDE_SORTED) == 0)
return sframe_ret_set_errno (errp, SFRAME_ERR_FDE_NOTSORTED);
/* Do the binary search. */
@@ -1402,6 +1411,15 @@ sframe_encoder_get_version (sframe_encoder_ctx *encoder)
return ehp->sfh_preamble.sfp_version;
}
+/* Get the section flags from the SFrame encoder context ENCODER. */
+
+uint8_t
+sframe_encoder_get_flags (sframe_encoder_ctx *encoder)
+{
+ const sframe_header *ehp = sframe_encoder_get_header (encoder);
+ return ehp->sfh_preamble.sfp_flags;
+}
+
/* Return the number of function descriptor entries in the SFrame encoder
ENCODER. */
@@ -1736,7 +1754,6 @@ sframe_encoder_write_sframe (sframe_encoder_ctx *encoder)
size_t fre_size;
size_t esz = 0;
sframe_header *ehp;
- unsigned char flags;
sf_fde_tbl *fd_info;
sf_fre_tbl *fr_info;
uint32_t i, num_fdes;
@@ -1806,8 +1823,7 @@ sframe_encoder_write_sframe (sframe_encoder_ctx *encoder)
/* Sanity checks:
- the FDE section must have been sorted by now on the start address
of each function. */
- flags = ehp->sfh_preamble.sfp_flags;
- if (!(flags & SFRAME_F_FDE_SORTED)
+ if (!(sframe_encoder_get_flags (encoder) & SFRAME_F_FDE_SORTED)
|| (fd_info == NULL))
return sframe_set_errno (&err, SFRAME_ERR_FDE_INVAL);