mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user