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
|
extern uint8_t
|
||||||
sframe_decoder_get_flags (sframe_decoder_ctx *dctx);
|
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
|
/* Return the number of function descriptor entries in the SFrame decoder
|
||||||
DCTX. */
|
DCTX. */
|
||||||
extern uint32_t
|
extern uint32_t
|
||||||
@@ -246,6 +258,18 @@ sframe_encoder_get_version (sframe_encoder_ctx *encoder);
|
|||||||
extern uint8_t
|
extern uint8_t
|
||||||
sframe_encoder_get_flags (sframe_encoder_ctx *encoder);
|
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
|
/* Return the number of function descriptor entries in the SFrame encoder
|
||||||
ENCODER. */
|
ENCODER. */
|
||||||
extern uint32_t
|
extern uint32_t
|
||||||
|
|||||||
@@ -41,5 +41,7 @@ LIBSFRAME_1.0 {
|
|||||||
|
|
||||||
LIBSFRAME_1.1 {
|
LIBSFRAME_1.1 {
|
||||||
sframe_decoder_get_flags;
|
sframe_decoder_get_flags;
|
||||||
|
sframe_decoder_get_offsetof_fde_start_addr;
|
||||||
sframe_encoder_get_flags;
|
sframe_encoder_get_flags;
|
||||||
|
sframe_encoder_get_offsetof_fde_start_addr;
|
||||||
} LIBSFRAME_1.0;
|
} LIBSFRAME_1.0;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include "sframe-impl.h"
|
#include "sframe-impl.h"
|
||||||
#include "swap.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;
|
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
|
/* Find the function descriptor entry which contains the specified address
|
||||||
ADDR.
|
ADDR.
|
||||||
This function is deprecated and will be removed from libsframe.so.2. */
|
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;
|
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
|
/* Add an FRE to function at FUNC_IDX'th function descriptor entry in
|
||||||
the encoder context. */
|
the encoder context. */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user