aboutsummaryrefslogtreecommitdiff
path: root/libsframe
diff options
context:
space:
mode:
Diffstat (limited to 'libsframe')
-rw-r--r--libsframe/doc/sframe-spec.texi27
-rw-r--r--libsframe/libsframe.ver14
-rw-r--r--libsframe/libtool-version2
-rw-r--r--libsframe/sframe.c42
4 files changed, 37 insertions, 48 deletions
diff --git a/libsframe/doc/sframe-spec.texi b/libsframe/doc/sframe-spec.texi
index ecc333d..f25791e 100644
--- a/libsframe/doc/sframe-spec.texi
+++ b/libsframe/doc/sframe-spec.texi
@@ -20,7 +20,7 @@ License''.
@titlepage
@title The SFrame Format
-@subtitle Version 2
+@subtitle Version 2 (Errata 1)
@sp 15
@center @today{}
@author Indu Bhagat
@@ -35,9 +35,9 @@ License''.
@node Top
@top The SFrame format
-This manual describes version 2 of the SFrame file format. SFrame stands for
-Simple Frame. The SFrame format keeps track of the minimal necessary
-information needed for generating stack traces:
+This manual describes version 2 (errata 1) of the SFrame file format. SFrame
+stands for Simple Frame. The SFrame format keeps track of the minimal
+necessary information needed for generating stack traces:
@itemize @minus
@item
@@ -77,9 +77,10 @@ Appendices
@section Overview
@cindex Overview
-The SFrame stack trace information is provided in a loaded section, known as the
-@code{.sframe} section. When available, the @code{.sframe} section appears in
-a new segment of its own, PT_GNU_SFRAME.
+The SFrame stack trace information is provided in a loaded section, known as
+the @code{.sframe} section. When available, the @code{.sframe} section appears
+in segment of type PT_GNU_SFRAME. An ELF SFrame section will have the type
+SHT_GNU_SFRAME.
The SFrame format is currently supported only for select ABIs, namely, AMD64,
AAPCS64, and s390x.
@@ -129,9 +130,9 @@ the data structure.
The above two imply that each SFrame function descriptor entry has a fixed size
of 20 bytes instead of its size of 17 bytes in SFrame format version 1.
@item
-Add a new flag SFRAME_F_FDE_FUNC_START_PCREL, as an erratum to SFrame
-Version 2, to indicate the encoding of the SFrame FDE function start address
-field:
+[Errata 1] Add a new flag SFRAME_F_FDE_FUNC_START_PCREL, as an erratum to
+SFrame Version 2, to indicate the encoding of the SFrame FDE function start
+address field:
@itemize @minus
@item if set, @code{sfde_func_start_address} field contains the offset in
bytes to the start PC of the associated function from the field itself.
@@ -140,8 +141,8 @@ bytes to the start PC of the associated function from the start of the SFrame
section.
@end itemize
@item
-Add a new ABI/arch identifier SFRAME_ABI_S390X_ENDIAN_BIG for the s390
-architecture (64-bit) s390x ABI. Other s390x-specific backward compatible
+[Errata 1] Add a new ABI/arch identifier SFRAME_ABI_S390X_ENDIAN_BIG for the
+s390 architecture (64-bit) s390x ABI. Other s390x-specific backward compatible
changes including the following helper definitions have been incrementally
added to SFrame version 2 only:
@itemize @minus
@@ -164,6 +165,8 @@ CFA offset adjustment and then scale down by CFA offset alignment factor).
@item SFRAME_V2_S390X_CFA_OFFSET_DECODE: Decode CFA offset (i.e., scale up
by CFA offset alignment factor and then revert CFA offset adjustment).
@end itemize
+@item
+[Errata 1] An ELF SFrame section has the type SHT_GNU_SFRAME.
@end itemize
SFrame version 1 is now obsolete and should not be used.
diff --git a/libsframe/libsframe.ver b/libsframe/libsframe.ver
index 06324ee..8cc80da 100644
--- a/libsframe/libsframe.ver
+++ b/libsframe/libsframe.ver
@@ -1,6 +1,6 @@
LIBSFRAME_0.0 { };
-LIBSFRAME_1.0 {
+LIBSFRAME_2.0 {
global:
sframe_decoder_free;
sframe_fde_create_func_info;
@@ -11,12 +11,13 @@ LIBSFRAME_1.0 {
sframe_fre_get_ra_offset;
sframe_fre_get_ra_mangled_p;
sframe_decode;
+ sframe_decoder_get_flags;
sframe_decoder_get_hdr_size;
sframe_decoder_get_abi_arch;
sframe_decoder_get_version;
+ sframe_decoder_get_offsetof_fde_start_addr;
sframe_decoder_get_fixed_fp_offset;
sframe_decoder_get_fixed_ra_offset;
- sframe_get_funcdesc_with_addr;
sframe_find_fre;
sframe_decoder_get_num_fidx;
sframe_decoder_get_funcdesc;
@@ -24,9 +25,11 @@ LIBSFRAME_1.0 {
sframe_decoder_get_fre;
sframe_encode;
sframe_encoder_free;
+ sframe_encoder_get_flags;
sframe_encoder_get_hdr_size;
sframe_encoder_get_abi_arch;
sframe_encoder_get_version;
+ sframe_encoder_get_offsetof_fde_start_addr;
sframe_encoder_get_num_fidx;
sframe_encoder_add_fre;
sframe_encoder_add_funcdesc;
@@ -38,10 +41,3 @@ LIBSFRAME_1.0 {
local:
*;
} LIBSFRAME_0.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/libtool-version b/libsframe/libtool-version
index 9dcbe48..e06835d 100644
--- a/libsframe/libtool-version
+++ b/libsframe/libtool-version
@@ -27,4 +27,4 @@
# then set age to 0.
#
# CURRENT:REVISION:AGE
-1:0:0
+2:0:0
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index d482d58..824d1fd 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -876,7 +876,7 @@ sframe_decode_fre (const char *fre_buf, sframe_frame_row_entry *fre,
return 0;
}
-/* Decode the specified SFrame buffer CF_BUF of size CF_SIZE and return the
+/* Decode the specified SFrame buffer SF_BUF of size SF_SIZE and return the
new SFrame decoder context.
Sets ERRP for the caller if any error. Frees up the allocated memory in
@@ -1079,18 +1079,6 @@ sframe_decoder_get_offsetof_fde_start_addr (sframe_decoder_ctx *dctx,
+ 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. */
-
-void *
-sframe_get_funcdesc_with_addr (sframe_decoder_ctx *ctx __attribute__ ((unused)),
- int32_t addr __attribute__ ((unused)),
- int *errp)
-{
- return sframe_ret_set_errno (errp, SFRAME_ERR_INVAL);
-}
-
/* Find the function descriptor entry starting which contains the specified
address ADDR. */
@@ -1340,13 +1328,14 @@ sframe_decoder_get_fre (sframe_decoder_ctx *ctx,
if (!sframe_fre_sanity_check_p (&ifre))
return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
- sframe_frame_row_entry_copy (fre, &ifre);
+ /* Although a stricter sanity check on fre_start_addr like:
+ if (fdep->sfde_func_size)
+ sframe_assert (frep->fre_start_addr < fdep->sfde_func_size);
+ is more suitable, some code has been seen to not abide by it. See
+ PR libsframe/33131. */
+ sframe_assert (ifre.fre_start_addr <= fdep->sfde_func_size);
- if (fdep->sfde_func_size)
- sframe_assert (fre->fre_start_addr < fdep->sfde_func_size);
- else
- /* A SFrame FDE with func size equal to zero is possible. */
- sframe_assert (fre->fre_start_addr == fdep->sfde_func_size);
+ sframe_frame_row_entry_copy (fre, &ifre);
return 0;
}
@@ -1599,11 +1588,12 @@ sframe_encoder_add_fre (sframe_encoder_ctx *encoder,
= frep->fre_start_addr;
ectx_frep->fre_info = frep->fre_info;
- if (fdep->sfde_func_size)
- sframe_assert (frep->fre_start_addr < fdep->sfde_func_size);
- else
- /* A SFrame FDE with func size equal to zero is possible. */
- sframe_assert (frep->fre_start_addr == fdep->sfde_func_size);
+ /* Although a stricter sanity check on fre_start_addr like:
+ if (fdep->sfde_func_size)
+ sframe_assert (frep->fre_start_addr < fdep->sfde_func_size);
+ is more suitable, some code has been seen to not abide by it. See PR
+ libsframe/33131. */
+ sframe_assert (frep->fre_start_addr <= fdep->sfde_func_size);
/* frep has already been sanity check'd. Get offsets size. */
offsets_sz = sframe_fre_offset_bytes_size (frep->fre_info);
@@ -1639,7 +1629,7 @@ sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder,
int32_t start_addr,
uint32_t func_size,
unsigned char func_info,
- uint32_t num_fres __attribute__ ((unused)))
+ uint32_t num_fres ATTRIBUTE_UNUSED)
{
sframe_header *ehp;
sf_fde_tbl *fd_info;
@@ -1721,7 +1711,7 @@ sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder,
uint32_t func_size,
unsigned char func_info,
uint8_t rep_block_size,
- uint32_t num_fres __attribute__ ((unused)))
+ uint32_t num_fres ATTRIBUTE_UNUSED)
{
sf_fde_tbl *fd_info;
int err;