dbxout.c (dbxout_global_decl): New.
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sun, 22 Jul 2001 17:02:53 +0000 (17:02 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sun, 22 Jul 2001 17:02:53 +0000 (17:02 +0000)
* dbxout.c (dbxout_global_decl): New.
(xcoff_debug_hooks, dbx_debug_hooks): Use it.
* sdbout.c (sdbout_finish): New.
(sdbout_debug_hooks): Use it, add comments.
(sdbout_global_decl): Defer initialised public vars to
sdbout_finish.
* varasm.c (assemble_variable): Don't output debug information
for file-scope variables.

Co-Authored-By: Richard Henderson <rth@redhat.com>
From-SVN: r44243

gcc/ChangeLog
gcc/dbxout.c
gcc/sdbout.c
gcc/varasm.c

index 33f5f29ff5795d25337fe14448c7f0bf908bd2d4..ee0d352ce2139838cb006ec3fe6f91a42964a90a 100644 (file)
@@ -1,3 +1,15 @@
+2001-07-22 Neil Booth  <neil@daikokuya.demon.co.uk>
+          Richard Henderson  <rth@redhat.com>
+
+       * dbxout.c (dbxout_global_decl): New.
+       (xcoff_debug_hooks, dbx_debug_hooks): Use it.
+       * sdbout.c (sdbout_finish): New.
+       (sdbout_debug_hooks): Use it, add comments.
+       (sdbout_global_decl): Defer initialised public vars to
+       sdbout_finish.
+       * varasm.c (assemble_variable): Don't output debug information
+       for file-scope variables.
+
 2001-07-22  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (get_trap_mode_suffix): New.
index e7c2c546dcd6a9dbf916fab708c93b2db984dbda..b321cfce745b11103ed2300037cfe09b3547aa8d 100644 (file)
@@ -313,6 +313,7 @@ static void dbxout_prepare_symbol   PARAMS ((tree));
 static void dbxout_finish_symbol       PARAMS ((tree));
 static void dbxout_block               PARAMS ((tree, int, tree));
 static void dbxout_begin_function      PARAMS ((tree));
+static void dbxout_global_decl         PARAMS ((tree));
 \f
 /* The debug hooks structure.  */
 #if defined (DBX_DEBUGGING_INFO)
@@ -343,7 +344,7 @@ struct gcc_debug_hooks dbx_debug_hooks =
 #endif
   debug_nothing_int,           /* end_function */
   dbxout_function_decl,
-  debug_nothing_tree,          /* global_decl */
+  dbxout_global_decl,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
   debug_nothing_rtx            /* label */
@@ -369,7 +370,7 @@ struct gcc_debug_hooks xcoff_debug_hooks =
   debug_nothing_tree,          /* begin_function */
   xcoffout_end_function,
   debug_nothing_tree,          /* function_decl */
-  debug_nothing_tree,          /* global_decl */
+  dbxout_global_decl,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
   debug_nothing_rtx            /* label */
@@ -623,6 +624,18 @@ dbxout_end_block (line, n)
   ASM_OUTPUT_INTERNAL_LABEL (asmfile, "LBE", n);
 }
 
+/* Debug information for a global DECL.  Called from toplev.c after
+   compilation proper has finished.  */
+static void
+dbxout_global_decl (decl)
+     tree decl;
+{
+  if (TREE_CODE (decl) == VAR_DECL
+      && ! DECL_EXTERNAL (decl)
+      && DECL_RTL_SET_P (decl))        /* Not necessary?  */
+    dbxout_symbol (decl, 0);
+} 
+
 /* Output dbx data for a function definition.
    This includes a definition of the function name itself (a symbol),
    definitions of the parameters (locating them in the parameter list)
index accd9edb25976e44d6ee1415198ba10c179981fe..5ec4b2314d4b584db7c3cefaba561f7483715cab 100644 (file)
@@ -93,6 +93,7 @@ extern tree current_function_decl;
 #include "sdbout.h"
 
 static void sdbout_init                        PARAMS ((const char *));
+static void sdbout_finish              PARAMS ((const char *));
 static void sdbout_start_source_file   PARAMS ((unsigned, const char *));
 static void sdbout_end_source_file     PARAMS ((unsigned));
 static void sdbout_begin_block         PARAMS ((unsigned, unsigned));
@@ -124,6 +125,7 @@ static void sdbout_field_types              PARAMS ((tree));
 static void sdbout_one_type            PARAMS ((tree));
 static void sdbout_parms               PARAMS ((tree));
 static void sdbout_reg_parms           PARAMS ((tree));
+static void sdbout_global_decl         PARAMS ((tree));
 \f
 /* Random macros describing parts of SDB data.  */
 
@@ -298,16 +300,16 @@ static struct sdb_file *current_file;
 /* The debug hooks structure.  */
 struct gcc_debug_hooks sdb_debug_hooks =
 {
-  sdbout_init,
-  debug_nothing_charstar,
-  debug_nothing_int_charstar,
-  debug_nothing_int_charstar,
-  sdbout_start_source_file,
-  sdbout_end_source_file,
-  sdbout_begin_block,
-  sdbout_end_block,
+  sdbout_init,                 /* init */
+  sdbout_finish,               /* finish */
+  debug_nothing_int_charstar,  /* define */
+  debug_nothing_int_charstar,  /* undef */
+  sdbout_start_source_file,    /* start_source_file */
+  sdbout_end_source_file,      /* end_source_file */
+  sdbout_begin_block,          /* begin_block */
+  sdbout_end_block,            /* end_block */
   debug_true_tree,             /* ignore_block */
-  sdbout_source_line,
+  sdbout_source_line,          /* source_line */
 #ifdef MIPS_DEBUGGING_INFO
   /* Defer on MIPS systems so that parameter descriptions follow
      function entry.  */
@@ -317,11 +319,11 @@ struct gcc_debug_hooks sdb_debug_hooks =
   sdbout_begin_prologue,       /* begin_prologue */
   debug_nothing_int,           /* end_prologue */
 #endif
-  sdbout_end_epilogue,
-  sdbout_begin_function,
-  sdbout_end_function,
+  sdbout_end_epilogue,         /* end_epilogue */
+  sdbout_begin_function,       /* begin_function */
+  sdbout_end_function,         /* end_function */
   debug_nothing_tree,          /* function_decl */
-  sdbout_global_decl,
+  sdbout_global_decl,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
   sdbout_label
@@ -1489,23 +1491,53 @@ sdbout_global_decl (decl)
      tree decl;
 {
   if (TREE_CODE (decl) == VAR_DECL
-      && DECL_INITIAL (decl)
-      && ! DECL_EXTERNAL (decl)
-      && DECL_RTL (decl) != 0)
+      && !DECL_EXTERNAL (decl)
+      && DECL_RTL_SET_P (decl))
     {
       /* The COFF linker can move initialized global vars to the end.
-        And that can screw up the symbol ordering.  By putting the
-        symbols in that order to begin with, we avoid a problem.
-        mcsun!unido!fauern!tumuc!pes@uunet.uu.net.  */
-      if (TREE_PUBLIC (decl))
+        And that can screw up the symbol ordering.  Defer those for
+        sdbout_finish ().  */
+      if (!DECL_INITIAL (decl) || !TREE_PUBLIC (decl))
        sdbout_symbol (decl, 0);
 
       /* Output COFF information for non-global file-scope initialized
         variables.  */
-      if (GET_CODE (DECL_RTL (decl)) == MEM)
+      if (DECL_INITIAL (decl) && GET_CODE (DECL_RTL (decl)) == MEM)
        sdbout_toplevel_data (decl);
     }
 }
+
+/* Output initialized global vars at the end, in the order of
+   definition.  See comment in sdbout_global_decl.  */
+
+static void
+sdbout_finish (main_filename)
+     const char *main_filename ATTRIBUTE_UNUSED;
+{
+  tree decl = getdecls ();
+  unsigned int len = list_length (decl);
+  tree *vec = (tree *) xmalloc (sizeof (tree) * len);
+  unsigned int i;
+
+  /* Process the decls in reverse order--earliest first.  Put them
+     into VEC from back to front, then take out from front.  */
+
+  for (i = 0; i < len; i++, decl = TREE_CHAIN (decl))
+    vec[len - i - 1] = decl;
+
+  for (i = 0; i < len; i++)
+    {
+      decl = vec[i];
+      if (TREE_CODE (decl) == VAR_DECL
+         && ! DECL_EXTERNAL (decl)
+         && DECL_INITIAL (decl)
+         && TREE_PUBLIC (decl)
+         && DECL_RTL_SET_P (decl))
+       sdbout_symbol (decl, 0);
+    }
+
+  free (vec);
+}
 \f
 /* Describe the beginning of an internal block within a function.
    Also output descriptions of variables defined in this block.
index 630dad0465449029030aa514d279cbaaccd55f7c..7adae8eb4f67616494018243c1add49035077a14 100644 (file)
@@ -1232,44 +1232,6 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
 
   last_assemble_variable_decl = 0;
 
-  if (DECL_RTL_SET_P (decl) && GET_CODE (DECL_RTL (decl)) == REG)
-    {
-      /* Do output symbol info for global register variables, but do nothing
-        else for them.  */
-
-      if (TREE_ASM_WRITTEN (decl))
-       return;
-      TREE_ASM_WRITTEN (decl) = 1;
-
-      /* Do no output if -fsyntax-only.  */
-      if (flag_syntax_only)
-       return;
-
-#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
-      /* File-scope global variables are output here.  */
-      if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
-          && top_level)
-       dbxout_symbol (decl, 0);
-#endif
-#ifdef SDB_DEBUGGING_INFO
-      if (write_symbols == SDB_DEBUG && top_level
-         /* Leave initialized global vars for end of compilation;
-            see comment in compile_file.  */
-         && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
-       sdbout_symbol (decl, 0);
-#endif
-
-      /* Don't output any DWARF debugging information for variables here.
-        In the case of local variables, the information for them is output
-        when we do our recursive traversal of the tree representation for
-        the entire containing function.  In the case of file-scope variables,
-        we output information for all of them at the very end of compilation
-        while we are doing our final traversal of the chain of file-scope
-        declarations.  */
-
-      return;
-    }
-
   /* Normally no need to say anything here for external references,
      since assemble_external is called by the language-specific code
      when a declaration is first seen.  */
@@ -1283,6 +1245,13 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
   if (TREE_CODE (decl) == FUNCTION_DECL)
     return;
 
+  /* Do nothing for global register variables.  */
+  if (DECL_RTL_SET_P (decl) && GET_CODE (DECL_RTL (decl)) == REG)
+    {
+      TREE_ASM_WRITTEN (decl) = 1;
+      return;
+    }
+
   /* If type was incomplete when the variable was declared,
      see if it is complete now.  */
 
@@ -1411,27 +1380,6 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
            (decl, "requested alignment for %s is greater than implemented alignment of %d.",rounded);
 #endif
        
-#ifdef DBX_DEBUGGING_INFO
-      /* File-scope global variables are output here.  */
-      if (write_symbols == DBX_DEBUG && top_level)
-       dbxout_symbol (decl, 0);
-#endif
-#ifdef SDB_DEBUGGING_INFO
-      if (write_symbols == SDB_DEBUG && top_level
-         /* Leave initialized global vars for end of compilation;
-            see comment in compile_file.  */
-         && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
-       sdbout_symbol (decl, 0);
-#endif
-
-      /* Don't output any DWARF debugging information for variables here.
-        In the case of local variables, the information for them is output
-        when we do our recursive traversal of the tree representation for
-        the entire containing function.  In the case of file-scope variables,
-        we output information for all of them at the very end of compilation
-        while we are doing our final traversal of the chain of file-scope
-        declarations.  */
-
 #if 0 /* ??? We should either delete this or add a comment describing what
         it was intended to do and why we shouldn't delete it.  */
       if (flag_shared_data)
@@ -1494,29 +1442,6 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
   /* Record current section so we can restore it if dbxout.c clobbers it.  */
   saved_in_section = in_section;
 
-  /* Output the dbx info now that we have chosen the section.  */
-
-#ifdef DBX_DEBUGGING_INFO
-  /* File-scope global variables are output here.  */
-  if (write_symbols == DBX_DEBUG && top_level)
-    dbxout_symbol (decl, 0);
-#endif
-#ifdef SDB_DEBUGGING_INFO
-  if (write_symbols == SDB_DEBUG && top_level
-      /* Leave initialized global vars for end of compilation;
-        see comment in compile_file.  */
-      && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
-    sdbout_symbol (decl, 0);
-#endif
-
-  /* Don't output any DWARF debugging information for variables here.
-     In the case of local variables, the information for them is output
-     when we do our recursive traversal of the tree representation for
-     the entire containing function.  In the case of file-scope variables,
-     we output information for all of them at the very end of compilation
-     while we are doing our final traversal of the chain of file-scope
-     declarations.  */
-
   /* If the debugging output changed sections, reselect the section
      that's supposed to be selected.  */
   if (in_section != saved_in_section)