[PATCH, V3 5/6] libsframe: stop search for SFrame FRE if its start IP is greater than PC

Indu Bhagat indu.bhagat@oracle.com
Mon May 26 05:08:35 GMT 2025


From: Jens Remus <jremus@linux.ibm.com>

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>

---
[No changes in V3]
[New in V2]
---
 libsframe/sframe.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

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))
-- 
2.43.0



More information about the Binutils mailing list