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.
This commit is contained in:
Indu Bhagat
2025-07-06 12:46:33 -07:00
parent ef5573ced1
commit 72dac98050
3 changed files with 73 additions and 0 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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. */