[PATCH 1/4] gas: sframe: avoid creating more symbols than necessary for FRE offset

Indu Bhagat indu.bhagat@oracle.com
Sun May 11 07:35:35 GMT 2025


Each SFrame FDE contains an offset to the start of its respective SFrame
FREs in the sfde_func_start_fre_off field.  To generate this offset,
fre_symbols[] array is being used.  The number of elements of this array
is currently set to the total number of SFrame FREs in the entire SFrame
section.  This is more than the minimum unnecessary.  We only need to
track as many points as the number of SFrame FDEs.

gas/
	* gen-sframe.c (output_sframe_internal):  Size fre_symbols with
	the number of SFrame FDEs.
---
 gas/gen-sframe.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index 5c8c7ebb175..62bbfb45b1e 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -688,8 +688,8 @@ output_sframe_internal (void)
 
   unsigned int num_fdes = get_num_sframe_fdes ();
   unsigned int num_fres = get_num_sframe_fres ();
-  symbolS **fre_symbols = XNEWVEC (symbolS *, num_fres);
-  for (i = 0; i < num_fres; i++)
+  symbolS **fre_symbols = XNEWVEC (symbolS *, num_fdes);
+  for (i = 0; i < num_fdes; i++)
     fre_symbols[i] = symbol_temp_make ();
 
   end_of_frame_hdr = symbol_temp_make ();
@@ -765,7 +765,7 @@ output_sframe_internal (void)
     {
       output_sframe_funcdesc (start_of_fre_section,
 			      fre_symbols[i], sframe_fde);
-      i += sframe_fde->num_fres;
+      i++;
     }
 
   symbol_set_value_now (start_of_fre_section);
@@ -776,16 +776,16 @@ output_sframe_internal (void)
 
   for (sframe_fde = all_sframe_fdes; sframe_fde; sframe_fde = sframe_fde_next)
     {
+      symbol_set_value_now (fre_symbols[i]);
       for (sframe_fre = sframe_fde->sframe_fres;
 	   sframe_fre;
 	   sframe_fre = sframe_fre->next)
 	{
-	  symbol_set_value_now (fre_symbols[i]);
 	  output_sframe_row_entry (get_dw_fde_start_addrS (sframe_fde->dw_fde),
 				   get_dw_fde_end_addrS (sframe_fde->dw_fde),
 				   sframe_fre);
-	  i++;
 	}
+      i++;
       sframe_fde_next = sframe_fde->next;
       sframe_fde_free (sframe_fde);
     }
@@ -794,7 +794,7 @@ output_sframe_internal (void)
 
   symbol_set_value_now (end_of_frame_section);
 
-  gas_assert (i == num_fres);
+  gas_assert (i == num_fdes);
 
   free (fre_symbols);
   fre_symbols = NULL;
-- 
2.43.0



More information about the Binutils mailing list