aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndu Bhagat <indu.bhagat@oracle.com>2025-07-14 17:01:53 -0700
committerIndu Bhagat <indu.bhagat@oracle.com>2025-07-14 17:08:21 -0700
commit387efef5fef727cbe52099dcd5012905c4205be3 (patch)
tree6dacad8f8cd78f31ad0f6a0773cd4bf5eabd043a
parent6deec80629d1b72f19ad7dc59e3e94caf1c59501 (diff)
downloadbinutils-387efef5fef727cbe52099dcd5012905c4205be3.zip
binutils-387efef5fef727cbe52099dcd5012905c4205be3.tar.gz
binutils-387efef5fef727cbe52099dcd5012905c4205be3.tar.bz2
libsframe: relax the assertion limit for fre_start_addr
Fix PR ld/33131 Failed assertion when linking gccgo Make amendments in both sframe_decoder_get_fre and sframe_encoder_add_fre. Since GNU as and the dw2gencfi code generally accepts such CFI, its best to allow in SFrame FREs too. libsframe/ PR ld/33131. * sframe.c (sframe_decoder_get_fre): Relax the assertion a bit. (sframe_encoder_add_fre): Likewise.
-rw-r--r--libsframe/sframe.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index 7357fc1..824d1fd 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -1328,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;
}
@@ -1587,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);