From: Jens Remus Date: Mon, 26 May 2025 18:02:29 +0000 (-0700) Subject: libsframe: stop search for SFrame FRE if its start IP is greater than PC X-Git-Tag: binutils-2_45~486 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ada5c6fa081410fa41df67013f3c1eb6d64e0680;p=thirdparty%2Fbinutils-gdb.git libsframe: stop search for SFrame FRE if its start IP is greater than PC The SFrame FREs for an SFrame FDE are sorted on their start address. Therefore the linear search for a matching SFrame FRE can be stopped, if its start address is greater than the searched for PC. libsframe/ * sframe.c (sframe_find_fre): Stop search if FRE's start IP is greater than PC. Signed-off-by: Jens Remus --- diff --git a/libsframe/sframe.c b/libsframe/sframe.c index d16305d629b..d03dd5fc5fe 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -1096,14 +1096,13 @@ sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc, { sframe_frame_row_entry cur_fre; sframe_func_desc_entry *fdep; - uint32_t fre_type, fde_type, i; + uint32_t fre_type, i; int32_t start_ip_offset; int32_t func_start_addr; int32_t end_ip_offset; const char *fres; size_t size = 0; int err = 0; - bool mask_p; if ((ctx == NULL) || (frep == NULL)) return sframe_set_errno (&err, SFRAME_ERR_INVAL); @@ -1114,8 +1113,6 @@ sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc, return sframe_set_errno (&err, SFRAME_ERR_DCTX_INVAL); fre_type = sframe_get_fre_type (fdep); - fde_type = sframe_get_fde_type (fdep); - mask_p = (fde_type == SFRAME_FDE_TYPE_PCMASK); fres = ctx->sfd_fres + fdep->sfde_func_start_fre_off; func_start_addr = fdep->sfde_func_start_address; @@ -1129,8 +1126,8 @@ sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc, start_ip_offset = cur_fre.fre_start_addr; end_ip_offset = sframe_fre_get_end_ip_offset (fdep, i, fres + size); - /* First FRE's start_ip must be more than pc for regular SFrame FDEs. */ - if (i == 0 && !mask_p && (start_ip_offset + func_start_addr) > pc) + /* Stop search if FRE's start_ip is greater than pc. */ + if ((start_ip_offset + func_start_addr) > pc) return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); if (sframe_fre_check_range_p (fdep, start_ip_offset, end_ip_offset, pc))