aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Remus <jremus@linux.ibm.com>2025-05-26 11:02:29 -0700
committerIndu Bhagat <indu.bhagat@oracle.com>2025-05-26 11:02:29 -0700
commitada5c6fa081410fa41df67013f3c1eb6d64e0680 (patch)
treeff934bf79da04caac4ff2550d932f8deb9af914b
parent9d2a24349e23afe3ee5e6ac093ffca3901d39bc5 (diff)
downloadbinutils-ada5c6fa081410fa41df67013f3c1eb6d64e0680.zip
binutils-ada5c6fa081410fa41df67013f3c1eb6d64e0680.tar.gz
binutils-ada5c6fa081410fa41df67013f3c1eb6d64e0680.tar.bz2
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 <jremus@linux.ibm.com>
-rw-r--r--libsframe/sframe.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index d16305d..d03dd5f 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))