gas obj_end
authorAlan Modra <amodra@gmail.com>
Wed, 1 Feb 2023 12:41:30 +0000 (23:11 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 1 Feb 2023 22:18:29 +0000 (08:48 +1030)
Provide a way for config/obj-* to clean up at end of assembly, and do
so for ELF.

* obj.h (struct format_ops): Add "end".
* config/obj-aout.c (aout_format_ops): Init new field.
* config/obj-coff.c (coff_format_ops): Likewise.
* config/obj-ecoff.c (ecoff_format_ops): Likewise.
* config/obj-elf.c (elf_format_ops): Likewise.
(elf_begin): Move later in file.  Clear some more variables.
(comment_section): Make file scope.
(free_section_idx): Rewrite.
(elf_adjust_symtab): Expand str_htab_create call and use
free_section_idx as delete function.
(elf_frob_file_after_relocs): Don't clean up groups.indexes here.
(elf_end): New function.
* config/obj-elf.h (obj_end): Define.
* config/obj-multi.h (obj_end): Define.
* output-file.c (output_file_close): Call obj_end.

gas/config/obj-aout.c
gas/config/obj-coff.c
gas/config/obj-ecoff.c
gas/config/obj-elf.c
gas/config/obj-elf.h
gas/config/obj-multi.h
gas/obj.h
gas/output-file.c

index f413e9139bb60a641fa52ae9db953ef8f201846f..14eb9f96aa680a396a4980de76518ca0440c8276 100644 (file)
@@ -297,6 +297,7 @@ const struct format_ops aout_format_ops =
   1,   /* dfl_leading_underscore.  */
   0,   /* emit_section_symbols.  */
   0,   /* begin.  */
+  0,   /* end.  */
   0,   /* app_file.  */
   obj_aout_frob_symbol,
   0,   /* frob_file.  */
index 5446beffb2e38820efbd2a0f400d466ffe0d6e70..465a990ec88c6c56f97d258d7df55fd66a1258c0 100644 (file)
@@ -1910,6 +1910,7 @@ const struct format_ops coff_format_ops =
   0,   /* dfl_leading_underscore */
   1,   /* emit_section_symbols */
   0,    /* begin */
+  0,   /* end.  */
   c_dot_file_symbol,
   coff_frob_symbol,
   0,   /* frob_file */
index f30e8c74d003e9e7738c0420fdf1d1a7e9440aa4..092f6f2c927cc454ff3cbc58a839c5559caef752 100644 (file)
@@ -290,6 +290,7 @@ const struct format_ops ecoff_format_ops =
      the single-format definition (0) would be in order.  */
   1,   /* emit_section_symbols.  */
   0,   /* begin.  */
+  0,   /* end.  */
   ecoff_new_file,
   obj_ecoff_frob_symbol,
   ecoff_frob_file,
index d3a54e8659f14d94e945e5aa93a3d682c70c14f2..a4cf12b144ab1e62670f24ee891f49e91e61873c 100644 (file)
@@ -188,25 +188,8 @@ static const pseudo_typeS ecoff_debug_pseudo_table[] =
 #undef NO_RELOC
 #include "aout/aout64.h"
 
-/* This is called when the assembler starts.  */
-
 asection *elf_com_section_ptr;
 
-void
-elf_begin (void)
-{
-  asection *s;
-
-  /* Add symbols for the known sections to the symbol table.  */
-  s = bfd_get_section_by_name (stdoutput, TEXT_SECTION_NAME);
-  symbol_table_insert (section_symbol (s));
-  s = bfd_get_section_by_name (stdoutput, DATA_SECTION_NAME);
-  symbol_table_insert (section_symbol (s));
-  s = bfd_get_section_by_name (stdoutput, BSS_SECTION_NAME);
-  symbol_table_insert (section_symbol (s));
-  elf_com_section_ptr = bfd_com_section_ptr;
-}
-
 void
 elf_pop_insert (void)
 {
@@ -2462,10 +2445,11 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED)
   demand_empty_rest_of_line ();
 }
 
+static segT comment_section;
+
 static void
 obj_elf_ident (int ignore ATTRIBUTE_UNUSED)
 {
-  static segT comment_section;
   segT old_section = now_seg;
   int old_subsection = now_subseg;
 
@@ -2813,12 +2797,11 @@ build_additional_section_info (bfd *abfd ATTRIBUTE_UNUSED,
   str_hash_insert (list->indexes, group_name, idx_ptr, 0);
 }
 
-static int
-free_section_idx (void **slot, void *arg ATTRIBUTE_UNUSED)
+static void
+free_section_idx (void *ent)
 {
-  string_tuple_t *tuple = *((string_tuple_t **) slot);
-  free ((char *)tuple->value);
-  return 1;
+  string_tuple_t *tuple = ent;
+  free ((char *) tuple->value);
 }
 
 /* Create symbols for group signature.  */
@@ -2831,7 +2814,8 @@ elf_adjust_symtab (void)
   /* Go find section groups.  */
   groups.num_group = 0;
   groups.head = NULL;
-  groups.indexes = str_htab_create ();
+  groups.indexes = htab_create_alloc (16, hash_string_tuple, eq_string_tuple,
+                                     free_section_idx, notes_calloc, NULL);
   bfd_map_over_sections (stdoutput, build_additional_section_info,
                         &groups);
 
@@ -3005,10 +2989,6 @@ elf_frob_file_after_relocs (void)
       frag_wane (frag_now);
     }
 
-  /* Cleanup hash.  */
-  htab_traverse_noresize (groups.indexes, free_section_idx, NULL);
-  htab_delete (groups.indexes);
-
 #ifdef NEED_ECOFF_DEBUG
   if (ECOFF_DEBUGGING)
     /* Generate the ECOFF debugging information.  */
@@ -3121,12 +3101,56 @@ elf_init_stab_section (segT seg)
     obj_elf_init_stab_section (seg);
 }
 
+/* This is called when the assembler starts.  */
+
+void
+elf_begin (void)
+{
+  asection *s;
+
+  /* Add symbols for the known sections to the symbol table.  */
+  s = bfd_get_section_by_name (stdoutput, TEXT_SECTION_NAME);
+  symbol_table_insert (section_symbol (s));
+  s = bfd_get_section_by_name (stdoutput, DATA_SECTION_NAME);
+  symbol_table_insert (section_symbol (s));
+  s = bfd_get_section_by_name (stdoutput, BSS_SECTION_NAME);
+  symbol_table_insert (section_symbol (s));
+  elf_com_section_ptr = bfd_com_section_ptr;
+  previous_section = NULL;
+  previous_subsection = 0;
+  comment_section = NULL;
+  memset (&groups, 0, sizeof (groups));
+}
+
+void
+elf_end (void)
+{
+  while (section_stack)
+    {
+      struct section_stack *top = section_stack;
+      section_stack = top->next;
+      free (top);
+    }
+  while (recorded_attributes)
+    {
+      struct recorded_attribute_info *rai = recorded_attributes;
+      recorded_attributes = rai->next;
+      free (rai);
+    }
+  if (groups.indexes)
+    {
+      htab_delete (groups.indexes);
+      free (groups.head);
+    }
+}
+
 const struct format_ops elf_format_ops =
 {
   bfd_target_elf_flavour,
   0,   /* dfl_leading_underscore */
   1,   /* emit_section_symbols */
   elf_begin,
+  elf_end,
   elf_file_symbol,
   elf_frob_symbol,
   elf_frob_file,
index c97d4fd04dd2203d89e47c17a9014f549442ab5d..727924ce2348c24dc31938af6468324c641d4533 100644 (file)
@@ -119,6 +119,11 @@ struct elf_section_match
 #endif
 extern void elf_begin (void);
 
+#ifndef obj_end
+#define obj_end() elf_end ()
+#endif
+extern void elf_end (void);
+
 #ifndef LOCAL_LABEL_PREFIX
 #define LOCAL_LABEL_PREFIX '.'
 #endif
index b88f81bc3ebd27ed479b54ca1edfa44e0f57513d..d4c94799edf0bcbb8c1291159fd9df80a059ff5d 100644 (file)
         ? (*this_format->begin) ()                     \
         : (void) 0)
 
+#define obj_end()                                      \
+       (this_format->end                               \
+        ? (*this_format->end) ()                       \
+        : (void) 0)
+
 #define obj_app_file(NAME)                             \
        (this_format->app_file                          \
         ? (*this_format->app_file) (NAME)              \
index 586ed2622c1742fa2c4cd3b977ea25ec0999183a..e1036928cc2e88597b67610b5b004561b97a24a9 100644 (file)
--- a/gas/obj.h
+++ b/gas/obj.h
@@ -42,6 +42,7 @@ struct format_ops {
   unsigned dfl_leading_underscore : 1;
   unsigned emit_section_symbols : 1;
   void (*begin) (void);
+  void (*end) (void);
   void (*app_file) (const char *);
   void (*frob_symbol) (symbolS *, int *);
   void (*frob_file) (void);
index 88f4011651395f3b82b6c048bdb23a5fb9badf66..664bc88e9c1ffcb88a4f196df16d39617c7615db 100644 (file)
@@ -109,6 +109,9 @@ output_file_close (void)
 
 #ifdef md_end
   md_end ();
+#endif
+#ifdef obj_end
+  obj_end ();
 #endif
   macro_end ();
   expr_end ();