aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndu Bhagat <indu.bhagat@oracle.com>2025-07-06 12:46:33 -0700
committerIndu Bhagat <indu.bhagat@oracle.com>2025-07-06 12:53:03 -0700
commit72dac98050ee1a8333ec03c9f60e68e327913ec2 (patch)
tree78ce9d6d9dbb8b546055c1d2b673a3b31bf7e012
parentef5573ced1794dd66aea10fc6678c0c6c149da6a (diff)
downloadbinutils-72dac98050ee1a8333ec03c9f60e68e327913ec2.zip
binutils-72dac98050ee1a8333ec03c9f60e68e327913ec2.tar.gz
binutils-72dac98050ee1a8333ec03c9f60e68e327913ec2.tar.bz2
include: libsframe: add APIs for offsetof FDE func start addr field
These APIs will be later used by the linker to arrange SFrame FDEs in the output SFrame section. include/ * sframe-api.h (sframe_decoder_get_offsetof_fde_start_addr): New declaration. (sframe_encoder_get_offsetof_fde_start_addr): Likewise. libsframe/ * libsframe.ver: List the new APIs. * sframe.c (sframe_decoder_get_offsetof_fde_start_addr): New definition. (sframe_encoder_get_offsetof_fde_start_addr): Likewise.
-rw-r--r--include/sframe-api.h24
-rw-r--r--libsframe/libsframe.ver2
-rw-r--r--libsframe/sframe.c47
3 files changed, 73 insertions, 0 deletions
diff --git a/include/sframe-api.h b/include/sframe-api.h
index e5262ae..3dc18b6 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -128,6 +128,18 @@ sframe_decoder_get_version (sframe_decoder_ctx *dctx);
extern uint8_t
sframe_decoder_get_flags (sframe_decoder_ctx *dctx);
+/* Get the offset of the sfde_func_start_address field (from the start of the
+ on-disk layout of the SFrame section) of the FDE at FUNC_IDX in the decoder
+ context DCTX.
+
+ If FUNC_IDX is more than the number of SFrame FDEs in the section, sets
+ error code in ERRP, but returns the (hypothetical) offset. This is useful
+ for the linker when arranging input FDEs into the output section to be
+ emitted. */
+uint32_t
+sframe_decoder_get_offsetof_fde_start_addr (sframe_decoder_ctx *dctx,
+ uint32_t func_idx, int *errp);
+
/* Return the number of function descriptor entries in the SFrame decoder
DCTX. */
extern uint32_t
@@ -246,6 +258,18 @@ sframe_encoder_get_version (sframe_encoder_ctx *encoder);
extern uint8_t
sframe_encoder_get_flags (sframe_encoder_ctx *encoder);
+/* Get the offset of the sfde_func_start_address field (from the start of the
+ on-disk layout of the SFrame section) of the FDE at FUNC_IDX in the encoder
+ context ENCODER.
+
+ If FUNC_IDX is more than the number of SFrame FDEs in the section, sets
+ error code in ERRP, but returns the (hypothetical) offset. This is useful
+ for the linker when arranging input FDEs into the output section to be
+ emitted. */
+uint32_t
+sframe_encoder_get_offsetof_fde_start_addr (sframe_encoder_ctx *encoder,
+ uint32_t func_idx, int *errp);
+
/* 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 7038d69..06324ee 100644
--- a/libsframe/libsframe.ver
+++ b/libsframe/libsframe.ver
@@ -41,5 +41,7 @@ LIBSFRAME_1.0 {
LIBSFRAME_1.1 {
sframe_decoder_get_flags;
+ sframe_decoder_get_offsetof_fde_start_addr;
sframe_encoder_get_flags;
+ sframe_encoder_get_offsetof_fde_start_addr;
} LIBSFRAME_1.0;
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index fcc2660..963c343 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
+#include <stddef.h>
#include "sframe-impl.h"
#include "swap.h"
@@ -1015,6 +1016,29 @@ sframe_decoder_get_fixed_ra_offset (sframe_decoder_ctx *ctx)
return dhp->sfh_cfa_fixed_ra_offset;
}
+/* Get the offset of the sfde_func_start_address field (from the start of the
+ on-disk layout of the SFrame section) of the FDE at FUNC_IDX in the decoder
+ context DCTX.
+
+ If FUNC_IDX is more than the number of SFrame FDEs in the section, sets
+ error code in ERRP, but returns the (hypothetical) offset. This is useful
+ for the linker when arranging input FDEs into the output section to be
+ emitted. */
+
+uint32_t
+sframe_decoder_get_offsetof_fde_start_addr (sframe_decoder_ctx *dctx,
+ uint32_t func_idx, int *errp)
+{
+ if (func_idx >= sframe_decoder_get_num_fidx (dctx))
+ sframe_ret_set_errno (errp, SFRAME_ERR_FDE_NOTFOUND);
+ else if (errp)
+ *errp = 0;
+
+ return (sframe_decoder_get_hdr_size (dctx)
+ + func_idx * sizeof (sframe_func_desc_entry)
+ + offsetof (sframe_func_desc_entry, sfde_func_start_address));
+}
+
/* Find the function descriptor entry which contains the specified address
ADDR.
This function is deprecated and will be removed from libsframe.so.2. */
@@ -1434,6 +1458,29 @@ sframe_encoder_get_num_fidx (sframe_encoder_ctx *encoder)
return num_fdes;
}
+/* Get the offset of the sfde_func_start_address field (from the start of the
+ on-disk layout of the SFrame section) of the FDE at FUNC_IDX in the encoder
+ context ENCODER.
+
+ If FUNC_IDX is more than the number of SFrame FDEs in the section, sets
+ error code in ERRP, but returns the (hypothetical) offset. This is useful
+ for the linker when arranging input FDEs into the output section to be
+ emitted. */
+
+uint32_t
+sframe_encoder_get_offsetof_fde_start_addr (sframe_encoder_ctx *encoder,
+ uint32_t func_idx, int *errp)
+{
+ if (func_idx >= sframe_encoder_get_num_fidx (encoder))
+ sframe_ret_set_errno (errp, SFRAME_ERR_FDE_INVAL);
+ else if (errp)
+ *errp = 0;
+
+ return (sframe_encoder_get_hdr_size (encoder)
+ + func_idx * sizeof (sframe_func_desc_entry)
+ + offsetof (sframe_func_desc_entry, sfde_func_start_address));
+}
+
/* Add an FRE to function at FUNC_IDX'th function descriptor entry in
the encoder context. */