[binutils-gdb] gas: sframe: avoid creating more symbols than necessary for FRE offset

Indu Bhagat ibhagat@sourceware.org
Thu May 15 19:27:19 GMT 2025


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

commit 150a9ef22c4ef46a0001156e258a7772bb64cf89
Author: Indu Bhagat <indu.bhagat@oracle.com>
Date:   Thu May 15 12:21:05 2025 -0700

    gas: sframe: avoid creating more symbols than necessary for FRE offset
    
    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 unnecessary.  We only need to track as many
    points as the number of SFrame FDEs.
    
    gas/
            * gen-sframe.c (output_sframe_internal):  Size fde_fre_symbols
            with the number of SFrame FDEs.

Diff:
---
 gas/gen-sframe.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index 5c8c7ebb175..aa46b9cb0b6 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -688,9 +688,9 @@ 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++)
-    fre_symbols[i] = symbol_temp_make ();
+  symbolS **fde_fre_symbols = XNEWVEC (symbolS *, num_fdes);
+  for (i = 0; i < num_fdes; i++)
+    fde_fre_symbols[i] = symbol_temp_make ();
 
   end_of_frame_hdr = symbol_temp_make ();
   start_of_fre_section = symbol_temp_make ();
@@ -764,8 +764,8 @@ output_sframe_internal (void)
   for (sframe_fde = all_sframe_fdes; sframe_fde; sframe_fde = sframe_fde->next)
     {
       output_sframe_funcdesc (start_of_fre_section,
-			      fre_symbols[i], sframe_fde);
-      i += sframe_fde->num_fres;
+			      fde_fre_symbols[i], sframe_fde);
+      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 (fde_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,10 +794,10 @@ 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;
+  free (fde_fre_symbols);
+  fde_fre_symbols = NULL;
 }
 
 static unsigned int


More information about the Binutils-cvs mailing list