[binutils-gdb/binutils-2_45-branch] libsframe: relax the assertion limit for fre_start_addr

Indu Bhagat ibhagat@sourceware.org
Thu Jul 17 06:02:36 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9d3376031aef4ea56750b0b59c3a1e0c4e8e0403

commit 9d3376031aef4ea56750b0b59c3a1e0c4e8e0403
Author: Indu Bhagat <indu.bhagat@oracle.com>
Date:   Mon Jul 14 17:01:53 2025 -0700

    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.
    
    (cherry picked from commit 387efef5fef727cbe52099dcd5012905c4205be3)

Diff:
---
 libsframe/sframe.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index 7357fc15abc..824d1fd7ed9 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);


More information about the Binutils-cvs mailing list