/* Copyright (C) 2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
#ifndef _SFRAME_API_H
#define _SFRAME_API_H
#include
#include
#include
#ifdef __cplusplus
extern "C"
{
#endif
typedef struct sframe_decoder_ctx
{
sframe_header sfd_header;
sframe_func_desc_entry *sfd_funcdesc;
/* SFrame FRE table. */
char *sfd_fres;
/* Number of bytes needed for SFrame FREs. */
int sfd_fre_nbytes;
} sframe_decoder_ctx;
#define MAX_NUM_STACK_OFFSETS 3
/* User interfacing SFrame Row Entry.
An abstraction provided by libsframe so the consumer is decoupled from
the binary format representation of the same.
The members are best ordered such that they are aligned at their natural
boundaries. This helps avoid usage of undesirable misaligned memory
accesses. See PR libsframe/29856. */
typedef struct sframe_frame_row_entry
{
uint32_t fre_start_addr;
const char *fre_offsets;
unsigned char fre_info;
} sframe_frame_row_entry;
/* The SFrame Decoder. */
/* Decode the specified SFrame buffer CF_BUF and return the new SFrame
decoder context. */
extern _Unwind_Reason_Code
__sframe_decode (sframe_decoder_ctx *dctx, const char *cf_buf);
/* Find the SFrame Frame Row Entry which contains the PC. Returns
_URC_END_OF_STACK if failure. */
extern _Unwind_Reason_Code
__sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc,
sframe_frame_row_entry *frep);
/* Get the base reg id from the FRE info. */
extern uint8_t
__sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre);
/* Get the CFA offset from the FRE. Sets ERRP if an error is
detected. */
extern int32_t
__sframe_fre_get_cfa_offset (sframe_decoder_ctx *dtcx,
sframe_frame_row_entry *fre,
_Unwind_Reason_Code *errp);
/* Get the FP offset from the FRE. If the offset is unavailable, sets
ERRP. */
extern int32_t
__sframe_fre_get_fp_offset (sframe_decoder_ctx *dctx,
sframe_frame_row_entry *fre,
_Unwind_Reason_Code *errp);
/* Get the RA offset from the FRE. Sets ERRP if ra offset is
unavailable. */
extern int32_t
__sframe_fre_get_ra_offset (sframe_decoder_ctx *dctx,
sframe_frame_row_entry *fre,
_Unwind_Reason_Code *errp);
#ifdef __cplusplus
}
#endif
#endif /* _SFRAME_API_H */