sdbout.c (preinit_symbols, [...]): New statics.
authorZack Weinberg <zack@codesourcery.com>
Thu, 19 Feb 2004 17:21:14 +0000 (17:21 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Thu, 19 Feb 2004 17:21:14 +0000 (17:21 +0000)
* sdbout.c (preinit_symbols, sdbout_initialized): New statics.
(sdbout_symbol): If called before sdbout_init, queue DECL for
later and return.
(sdbout_init): Set sdbout_initialized true, process decls
queued earlier by sdbout_symbol.
(sdbout_finish): Use size_t for index variable.

From-SVN: r78109

gcc/ChangeLog
gcc/sdbout.c

index f9fa2d3dd2c781a5579641bf434ddca6f1e9821a..7641ecefba99059cb1acc2396f402e9655068446 100644 (file)
@@ -1,5 +1,14 @@
+2004-02-19  Zack Weinberg  <zack@codesourcery.com>
+
+       * sdbout.c (preinit_symbols, sdbout_initialized): New statics.
+       (sdbout_symbol): If called before sdbout_init, queue DECL for
+       later and return.
+       (sdbout_init): Set sdbout_initialized true, process decls
+       queued earlier by sdbout_symbol.
+       (sdbout_finish): Use size_t for index variable.
+
 2004-02-19  Jeff Law  <law@redhat.com>
+
        * fold-const.c (invert_truthvalue): Do not call invert_tree_comparison
        for unordered comparison codes.
 
        defined.  Instead use REAL_LIBGCC_SPEC, unmodifed, as the libgcc
        spec string.
        * doc/tm.texi (REAL_LIBGCC_SPEC): Document.
-       
+
 2004-02-18  Zack Weinberg  <zack@codesourcery.com>
 
        * dwarf2out.c (loclabel_num): Move outside #ifdef
index ed6b46861ba992a497d6da3f5f0f2123503fd823..7f6a398edcc93607ad9345606787434457db1736 100644 (file)
@@ -64,6 +64,13 @@ static GTY(()) int unnamed_struct_number;
 
 static GTY(()) varray_type deferred_global_decls;
 
+/* The C front end may call sdbout_symbol before sdbout_init runs.
+   We save all such decls in this list and output them when we get
+   to sdbout_init.  */
+
+static GTY(()) tree preinit_symbols;
+static GTY(()) bool sdbout_initialized;
+
 #ifdef SDB_DEBUGGING_INFO
 
 #include "rtl.h"
@@ -699,6 +706,14 @@ sdbout_symbol (tree decl, int local)
   int regno = -1;
   const char *name;
 
+  /* If we are called before sdbout_init is run, just save the symbol
+     for later.  */
+  if (!sdbout_initialized)
+    {
+      preinit_symbols = tree_cons (0, decl, preinit_symbols);
+      return;
+    }
+
   sdbout_one_type (type);
 
   switch (TREE_CODE (decl))
@@ -1460,7 +1475,7 @@ sdbout_global_decl (tree decl)
 static void
 sdbout_finish (const char *main_filename ATTRIBUTE_UNUSED)
 {
-  int i;
+  size_t i;
 
   for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_global_decls); i++)
     sdbout_symbol (VARRAY_TREE (deferred_global_decls, i), 0);
@@ -1663,6 +1678,8 @@ sdbout_end_source_file (unsigned int line ATTRIBUTE_UNUSED)
 static void
 sdbout_init (const char *input_file_name ATTRIBUTE_UNUSED)
 {
+  tree t;
+
 #ifdef MIPS_DEBUGGING_INFO
   current_file = xmalloc (sizeof *current_file);
   current_file->next = NULL;
@@ -1670,6 +1687,14 @@ sdbout_init (const char *input_file_name ATTRIBUTE_UNUSED)
 #endif
 
   VARRAY_TREE_INIT (deferred_global_decls, 12, "deferred_global_decls");
+
+  /* Emit debug information which was queued by sdbout_symbol before
+     we got here.  */
+  sdbout_initialized = true;
+
+  for (t = nreverse (preinit_symbols); t; t = TREE_CHAIN (t))
+    sdbout_symbol (TREE_VALUE (t), 0);
+  preinit_symbols = 0;
 }
 
 #else  /* SDB_DEBUGGING_INFO */