]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[SFrame-V3] libsframe: add V3 APIs for adding and getting SFrame FDE
authorIndu Bhagat <indu.bhagat@oracle.com>
Fri, 16 Jan 2026 00:41:50 +0000 (16:41 -0800)
committerIndu Bhagat <indu.bhagat@oracle.com>
Fri, 16 Jan 2026 01:02:24 +0000 (17:02 -0800)
(Similar to V2) Add two new APIs for adding and getting SFrame FDE:
 - sframe_encoder_add_funcdesc_v3
 - sframe_decoder_get_funcdesc_v3

Note the argument for the function start address is int64_t instead of
int32_t (the latter is used in sframe_encoder_add_funcdesc_v2 and
sframe_encoder_get_funcdesc_v2).  The new V3 APIs will be used in a
subsequent commit to extend SFrame V3 to support text > 2 GiB by
allowing int64_t offsets by default.

Similar to the analogous V2 APIs, they return 0 on success and
SFRAME_ERR (in case of sframe_decoder_get_funcdesc_v3) or error code (in
case of sframe_encoder_add_funcdesc_v3) on failure.

Reviewed-by: Jens Remus <jremus@linux.ibm.com>
include/
* sframe-api.h (sframe_decoder_get_funcdesc_v3): New
declaration.
(sframe_encoder_add_funcdesc_v3): Likewise.
libsframe/
* libsframe.ver: Add the new APIs.
* sframe.c (sframe_decoder_get_funcdesc_v3): New definition.
(sframe_encoder_add_funcdesc_v3): Likewise.

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

index 3b4edd9994baadabf7ceb716cd74e4cbf30bd0ef..3bcb92b06640023fade2bba4d0b91864967b57eb 100644 (file)
@@ -182,6 +182,18 @@ sframe_decoder_get_funcdesc_v2 (const sframe_decoder_ctx *ctx,
                                unsigned char *func_info,
                                uint8_t *rep_block_size);
 
+/* Get the data (NUM_FRES, FUNC_SIZE, START_PC_OFFSET, FUNC_INFO,
+   REP_BLOCK_SIZE) from the SFrame function descriptor entry at the I'th index
+   in the decoder object DCTX.  Return SFRAME_ERR on failure.  */
+extern int
+sframe_decoder_get_funcdesc_v3 (const sframe_decoder_ctx *dctx,
+                               unsigned int i,
+                               uint32_t *num_fres,
+                               uint32_t *func_size,
+                               int64_t *start_pc_offset,
+                               unsigned char *func_info,
+                               uint8_t *rep_block_size);
+
 /* SFrame textual dump.  */
 extern void
 dump_sframe (const sframe_decoder_ctx *decoder, uint64_t addr);
@@ -295,6 +307,17 @@ sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *ectx,
                                uint8_t rep_block_size,
                                uint32_t num_fres);
 
+/* Add a new SFrame function descriptor entry with START_PC_OFFSET, FUNC_SIZE,
+   FUNC_INFO and REP_BLOCK_SIZE to the encoder context ECTX.  Return error
+   code on failure.  */
+extern int
+sframe_encoder_add_funcdesc_v3 (sframe_encoder_ctx *ectx,
+                               int64_t start_pc_offset,
+                               uint32_t func_size,
+                               unsigned char func_info,
+                               uint8_t rep_block_size,
+                               uint32_t num_fres);
+
 /* Serialize the contents of the encoder context ECTX and return the buffer.
    Sort the SFrame FDEs on start PC if SORT_FDE_P is true.  ENCODED_SIZE is
    updated to the size of the buffer.  Sets ERRP if failure.  */
index 4086a397c891122eedff257947d46f5b9c30487e..990274974861116cf8395ce0ade99e0cb7d9d1d9 100644 (file)
@@ -22,6 +22,7 @@ LIBSFRAME_3.0 {
     sframe_find_fre;
     sframe_decoder_get_num_fidx;
     sframe_decoder_get_funcdesc_v2;
+    sframe_decoder_get_funcdesc_v3;
     sframe_decoder_get_fre;
     sframe_encode;
     sframe_encoder_free;
@@ -34,6 +35,7 @@ LIBSFRAME_3.0 {
     sframe_encoder_add_fre;
     sframe_encoder_add_funcdesc;
     sframe_encoder_add_funcdesc_v2;
+    sframe_encoder_add_funcdesc_v3;
     sframe_encoder_write;
     dump_sframe;
     sframe_errmsg;
index 0cf00ee7d08b8a94b048ff709ae0ef187ba2a6fb..7dccdc097d45161032a56d6d746e8e50e435de9c 100644 (file)
@@ -1525,6 +1525,43 @@ sframe_decoder_get_funcdesc_v2 (const sframe_decoder_ctx *dctx,
 
   return 0;
 }
+
+/* Get the data (NUM_FRES, FUNC_SIZE, START_PC_OFFSET, FUNC_INFO,
+   REP_BLOCK_SIZE) from the SFrame function descriptor entry at the I'th index
+   in the decoder object DCTX.  Return SFRAME_ERR on failure.  */
+
+int
+sframe_decoder_get_funcdesc_v3 (const sframe_decoder_ctx *dctx,
+                               unsigned int i,
+                               uint32_t *num_fres,
+                               uint32_t *func_size,
+                               int64_t *start_pc_offset,
+                               unsigned char *func_info,
+                               uint8_t *rep_block_size)
+{
+  int err = 0;
+  if (dctx == NULL || sframe_decoder_get_version (dctx) != SFRAME_VERSION_3)
+    return sframe_set_errno (&err, SFRAME_ERR_INVAL);
+
+  sframe_func_desc_entry_int *fdp
+    = sframe_decoder_get_funcdesc_at_index (dctx, i);
+  if (fdp == NULL)
+    return sframe_set_errno (&err, SFRAME_ERR_FDE_NOTFOUND);
+
+  if (num_fres)
+    *num_fres = fdp->func_num_fres;
+  if (start_pc_offset)
+    *start_pc_offset = fdp->func_start_pc_offset;
+  if (func_size)
+    *func_size = fdp->func_size;
+  if (func_info)
+    *func_info = fdp->func_info;
+  if (rep_block_size)
+    *rep_block_size = fdp->func_rep_size;
+
+  return 0;
+}
+
 /* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
    descriptor entry in the SFrame decoder CTX.  Returns error code as
    applicable.  */
@@ -1950,6 +1987,37 @@ sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *ectx,
   return 0;
 }
 
+/* Add a new SFrame function descriptor entry with START_PC_OFFSET, FUNC_SIZE,
+   FUNC_INFO and REP_BLOCK_SIZE to the encoder context ECTX.  Return error
+   code on failure.  */
+
+int
+sframe_encoder_add_funcdesc_v3 (sframe_encoder_ctx *ectx,
+                               int64_t start_pc_offset,
+                               uint32_t func_size,
+                               unsigned char func_info,
+                               uint8_t rep_block_size,
+                               uint32_t num_fres ATTRIBUTE_UNUSED)
+{
+  int err = 0;
+  if (ectx == NULL || sframe_encoder_get_version (ectx) != SFRAME_VERSION_3)
+    {
+      sframe_set_errno (&err, SFRAME_ERR_INVAL);
+      return err;
+    }
+
+  err = sframe_encoder_add_funcdesc_internal (ectx, start_pc_offset,
+                                             func_size);
+  if (err)
+    return err;
+
+  sf_fde_tbl *fd_info = ectx->sfe_funcdesc;
+  fd_info->entry[fd_info->count-1].func_info = func_info;
+  fd_info->entry[fd_info->count-1].func_rep_size = rep_block_size;
+
+  return 0;
+}
+
 static int
 sframe_sort_funcdesc (sframe_encoder_ctx *ectx)
 {