]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libsframe: relax the assertion limit for fre_start_addr
authorIndu Bhagat <indu.bhagat@oracle.com>
Tue, 15 Jul 2025 00:01:53 +0000 (17:01 -0700)
committerIndu Bhagat <indu.bhagat@oracle.com>
Tue, 15 Jul 2025 00:08:21 +0000 (17:08 -0700)
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.

libsframe/sframe.c

index 7357fc15abc9313954542f0c9e2f168720bdfa06..824d1fd7ed99e28f07f2e3f935080228efa38b24 100644 (file)
@@ -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);