aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNeil Booth <neil@daikokuya.demon.co.uk>2001-07-21 23:17:26 +0000
committerNeil Booth <neil@gcc.gnu.org>2001-07-21 23:17:26 +0000
commitf7e105877784980691334a21d667c0200444238a (patch)
tree5b537e53e04060c14d960db72d22049d2492c1c0 /gcc
parent919b1aecc79318a3b85d77938abc429e0eb40b28 (diff)
downloadgcc-f7e105877784980691334a21d667c0200444238a.zip
gcc-f7e105877784980691334a21d667c0200444238a.tar.gz
gcc-f7e105877784980691334a21d667c0200444238a.tar.bz2
dbxout.c (dbxout_global_decl): New.
* 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: r44232
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/dbxout.c14
-rw-r--r--gcc/sdbout.c74
-rw-r--r--gcc/varasm.c89
4 files changed, 84 insertions, 105 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eb09a38..66107b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2001-07-21 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-21 H.J. Lu (hjl@gnu.org)
* config/mips/mips.c (mips_cpu): Moved into ...
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index e7c2c54..183a65f 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -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));
/* 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,15 @@ 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;
+{
+ 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)
diff --git a/gcc/sdbout.c b/gcc/sdbout.c
index accd9ed..5ec4b23 100644
--- a/gcc/sdbout.c
+++ b/gcc/sdbout.c
@@ -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));
/* 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);
+}
/* Describe the beginning of an internal block within a function.
Also output descriptions of variables defined in this block.
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 630dad0..7adae8e 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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)