gas: set up notes obstack earlier
authorAlan Modra <amodra@gmail.com>
Thu, 7 Jul 2022 04:02:30 +0000 (13:32 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 9 Jul 2022 11:52:51 +0000 (21:22 +0930)
So that the notes obstack can be used for persistent storage in
parse_args.

* as.c (parse_args): Use notes_alloc and notes_strdup.
(free_notes): New function.
(main): Init notes obstack, and arrange to be freed on exit.
* read.c (read_begin): Don't init notes obstack.
(read_end): Free cond_obstack.
* subsegs.c (subsegs_end): Don't free cond_obstack or notes.

gas/as.c
gas/read.c
gas/subsegs.c

index 8b2b3e8d33f0fb4f52b6d53d51a5149400371a68..2b8886e8b54aa3b208d912ca2b752615061d38d2 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -588,7 +588,7 @@ parse_args (int * pargc, char *** pargv)
   old_argv = *pargv;
 
   /* Initialize a new argv that contains no options.  */
-  new_argv = XNEWVEC (char *, old_argc + 1);
+  new_argv = notes_alloc (sizeof (char *) * (old_argc + 1));
   new_argv[0] = old_argv[0];
   new_argc = 1;
   new_argv[new_argc] = NULL;
@@ -996,7 +996,7 @@ This program has absolutely no warranty.\n"));
        case OPTION_AL:
          listing |= LISTING_LISTING;
          if (optarg)
-           listing_filename = xstrdup (optarg);
+           listing_filename = notes_strdup (optarg);
          break;
 
        case OPTION_ALTERNATE:
@@ -1050,7 +1050,7 @@ This program has absolutely no warranty.\n"));
                      listing |= LISTING_SYMBOLS;
                      break;
                    case '=':
-                     listing_filename = xstrdup (optarg + 1);
+                     listing_filename = notes_strdup (optarg + 1);
                      optarg += strlen (listing_filename);
                      break;
                    default:
@@ -1076,14 +1076,14 @@ This program has absolutely no warranty.\n"));
 
        case 'I':
          {                     /* Include file directory.  */
-           char *temp = xstrdup (optarg);
+           char *temp = notes_strdup (optarg);
 
            add_include_dir (temp);
            break;
          }
 
        case 'o':
-         out_file_name = xstrdup (optarg);
+         out_file_name = notes_strdup (optarg);
          break;
 
        case 'w':
@@ -1231,7 +1231,12 @@ perform_an_assembly_pass (int argc, char ** argv)
   if (!saw_a_file)
     read_a_source_file ("");
 }
-\f
+
+static void
+free_notes (void)
+{
+  _obstack_free (&notes, NULL);
+}
 
 int
 main (int argc, char ** argv)
@@ -1280,6 +1285,9 @@ main (int argc, char ** argv)
   select_emulation_mode (argc, argv);
 #endif
 
+  obstack_begin (&notes, chunksize);
+  xatexit (free_notes);
+
   PROGRESS (1);
   /* Call parse_args before any of the init/begin functions
      so that switches like --hash-size can be honored.  */
index edf3f2a788199e52fe804f6ff1e0105664906707..6f3a51df761a5fb53ec9b8787938b7dced1ea886 100644 (file)
@@ -261,9 +261,6 @@ read_begin (void)
   pobegin ();
   obj_read_begin_hook ();
 
-  /* Something close -- but not too close -- to a multiple of 1024.
-     The debugging malloc I'm using has 24 bytes of overhead.  */
-  obstack_begin (&notes, chunksize);
   obstack_begin (&cond_obstack, chunksize);
 
 #ifndef tc_line_separator_chars
@@ -282,6 +279,7 @@ void
 read_end (void)
 {
   poend ();
+  _obstack_free (&cond_obstack, NULL);
 }
 \f
 #ifndef TC_ADDRESS_BYTES
index 1776511a9b8c6ebc29766578d7a3a45ab6d97469..b1a85d3d6c74077bfd0ff3874e53fe3a8d5c8b9e 100644 (file)
@@ -50,8 +50,6 @@ subsegs_end (struct obstack **obs)
   for (; *obs; obs++)
     _obstack_free (*obs, NULL);
   _obstack_free (&frchains, NULL);
-  _obstack_free (&cond_obstack, NULL);
-  _obstack_free (&notes, NULL);
 }
 \f
 static void