diff options
-rw-r--r-- | include/sframe-api.h | 24 | ||||
-rw-r--r-- | libsframe/libsframe.ver | 2 | ||||
-rw-r--r-- | libsframe/sframe.c | 47 |
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. */ |