]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
include: libsframe: add APIs for SFrame header flags
authorIndu Bhagat <indu.bhagat@oracle.com>
Fri, 25 Apr 2025 00:36:54 +0000 (17:36 -0700)
committerIndu Bhagat <indu.bhagat@oracle.com>
Wed, 25 Jun 2025 19:56:19 +0000 (12:56 -0700)
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.

---
Notes:
  V2 was OK'd with some suggested changes which were done in V3.

[No changes in V4]
[Changes in V3]
  - Use const sframe_header * where applicable.
  - Revert the change of local variable from 'unsigned char all_flags'
    to 'uint8_t all_flags'.
[End of changes in V3]
[Changes in V2]
  - Amend function level comments and keep them in sync between decl and
    def.
[End of changes in V2]

include/sframe-api.h
libsframe/libsframe.ver
libsframe/sframe.c

index 77ba32b0f4b90f52107bd0f9fd19f959ae22f493..e5262ae6251eec00fdb1e47f223a9107d7a3ed0f 100644 (file)
@@ -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
index 57f5fb6c3786ec6cc6496871efcd4210048e0e37..7038d6947041195c964b777a40350d31dd8bd152 100644 (file)
@@ -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;
index d38a61dbd636384d6110046fcc1e7c493b03e060..fadc33b75bb2ddef4d349bf00f51a61db4c90a9b 100644 (file)
@@ -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);