summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog43
-rw-r--r--gcc/Makefile.in8
-rw-r--r--gcc/c-decl.c12
-rw-r--r--gcc/c-objc-common.c11
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-lang.c2
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/decl.c17
-rw-r--r--gcc/dbxout.c71
-rw-r--r--gcc/debug.c7
-rw-r--r--gcc/debug.h10
-rw-r--r--gcc/dwarf2out.c11
-rw-r--r--gcc/langhooks-def.h2
-rw-r--r--gcc/langhooks.h3
-rw-r--r--gcc/sdbout.c35
-rw-r--r--gcc/toplev.c53
-rw-r--r--gcc/vmsdbgout.c1
-rw-r--r--gcc/xcoffout.c94
-rw-r--r--gcc/xcoffout.h25
19 files changed, 219 insertions, 194 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d252e8ca512..9d75e321b45 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,46 @@
+2004-02-12 Zack Weinberg <zack@codesourcery.com>
+
+ * debug.h (struct gcc_debug_hooks): Add type_decl field.
+ (debug_nothing_tree_int): Prototype.
+ (dwarf_debug_hooks): Delete, unused.
+ * debug.c (do_nothing_debug_hooks): Update.
+ (debug_nothing_tree_int): New function.
+ * langhooks.h (struct lang_hooks_for_decls):
+ Remove builtin_type_decls field.
+ * langhooks-def.h (LANG_HOOKS_BUILTIN_TYPE_DECLS): Delete.
+ (LANG_HOOKS_DECLS): Update.
+ * toplev.c (rest_of_decl_compilation, rest_of_type_compilation):
+ Use debug_hooks->type_decl.
+ * dbxout.c (preinit_symbols): New static.
+ (dbx_debug_hooks, xcoff_debug_hooks): Update.
+ (dbxout_init): Don't call DBX_OUTPUT_STANDARD_TYPES or
+ lang_hooks.decls.builtin_type_decls. Do scan preinit_symbols
+ for symbols to output.
+ (dbxout_type_decl): New function.
+ (dbxout_symbol): If called before dbxout_init has run, queue
+ the symbol for later. Apply DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER
+ to TYPE_DECLs before emitting them.
+ * xcoffout.c (assign_type_number): Delete.
+ (xcoff_type_numbers): New static table.
+ (xcoff_assign_fundamental_type_number): New function.
+ * xcoffout.h: Define DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER, not
+ DBX_OUTPUT_STANDARD_TYPES. Remove unnecessary #ifdefs.
+ * sdbout.c: Include varray.h.
+ (deferred_global_decls): New static.
+ (sdb_debug_hooks): Update.
+ (sdbout_global_decl): If we can't emit something right now,
+ remember it in deferred_global_decls.
+ (sdbout_finish): Just scan deferred_global_decls; don't call getdecls.
+ (sdbout_init): Initialize deferred_global_decls.
+ * Makefile.in: Update dependencies of sdbout.o.
+ * dwarf2out.c (dwarf2out_type_decl): New function.
+ (dwarf2_debug_hooks): Update.
+ * vmsdbgout.c (vmsdbg_debug_hooks): Update.
+ * c-decl.c (getdecls): Just return 0.
+ (check_for_loop_decls): Don't use getdecls.
+ (record_builtin_type): Call debug_hooks->type_decl on the TYPE_DECL.
+ * c-objc-common.c (c_objc_common_finish_file): Don't use getdecls.
+
2004-02-12 Ulrich Weigand <uweigand@de.ibm.com>
* config/s390/s390.c (s390_sched_reorder2): Remove.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index e59c8f5f092..22640847394 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1605,10 +1605,10 @@ dbxout.o : dbxout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_
insn-config.h reload.h gstab.h xcoffout.h output.h dbxout.h toplev.h \
$(GGC_H) gt-dbxout.h
debug.o : debug.c debug.h $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
-sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_H) \
- flags.h function.h $(EXPR_H) output.h hard-reg-set.h $(REGS_H) real.h \
- insn-config.h xcoffout.h c-pragma.h $(GGC_H) $(TARGET_H) \
- sdbout.h toplev.h $(TM_P_H) except.h debug.h langhooks.h gt-sdbout.h
+sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) debug.h \
+ $(TREE_H) $(GGC_H) varray.h $(RTL_H) $(REGS_H) flags.h insn-config.h \
+ output.h toplev.h $(TM_P_H) gsyms.h langhooks.h $(TARGET_H) sdbout.h \
+ gt-sdbout.h
dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(TREE_H) $(RTL_H) dwarf2.h debug.h flags.h insn-config.h reload.h \
output.h $(DIAGNOSTIC_H) real.h hard-reg-set.h $(REGS_H) $(EXPR_H) \
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 87d24a9ead4..0487e03d0c9 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -2056,12 +2056,13 @@ define_label (location_t location, tree name)
return label;
}
-/* Return the list of declarations of the current scope. */
+/* Return the list of declarations of the current scope.
+ This hook is optional and not implemented for C. */
tree
getdecls (void)
{
- return current_scope->names;
+ return 0;
}
@@ -6197,7 +6198,7 @@ check_for_loop_decls (void)
}
}
- for (t = getdecls (); t; t = TREE_CHAIN (t))
+ for (t = current_scope->names; t; t = TREE_CHAIN (t))
{
if (TREE_CODE (t) != VAR_DECL && DECL_NAME (t))
error ("%Jdeclaration of non-variable '%D' in 'for' loop "
@@ -6380,11 +6381,14 @@ void
record_builtin_type (enum rid rid_index, const char *name, tree type)
{
tree id;
+ tree tdecl;
if (name == 0)
id = ridpointers[(int) rid_index];
else
id = get_identifier (name);
- pushdecl (build_decl (TYPE_DECL, id, type));
+ tdecl = build_decl (TYPE_DECL, id, type);
+ pushdecl (tdecl);
+ debug_hooks->type_decl (tdecl, 0);
}
/* Build the void_list_node (void_type_node having been created). */
diff --git a/gcc/c-objc-common.c b/gcc/c-objc-common.c
index d044ba9cb65..d011ef4f5af 100644
--- a/gcc/c-objc-common.c
+++ b/gcc/c-objc-common.c
@@ -265,17 +265,6 @@ c_objc_common_finish_file (void)
finish_cdtor (body);
}
-
- {
- int flags;
- FILE *stream = dump_begin (TDI_all, &flags);
-
- if (stream)
- {
- dump_node (getdecls (), flags & ~TDF_SLIM, stream);
- dump_end (TDI_all, stream);
- }
- }
}
/* Called during diagnostic message formatting process to print a
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 97b1d7cd467..c7ddf37efc5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2004-02-12 Zack Weinberg <zack@codesourcery.com>
+
+ * cp-lang.c: Don't define LANG_HOOKS_BUILTIN_TYPE_DECLS.
+ * cp-tree.h: Don't declare cxx_builtin_type_decls.
+ * decl.c (builtin_type_decls, cxx_builtin_type_decls): Delete.
+ (record_builtin_type): Call debug_hooks->type_decl on the TYPE_DECL.
+
2004-02-10 Mark Mitchell <mark@codesourcery.com>
* typeck.c (lookup_destructor): Fix typo in error message.
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index f1f5eedcc54..eda84682679 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -102,8 +102,6 @@ static void cxx_initialize_diagnostics (diagnostic_context *);
#define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name
#undef LANG_HOOKS_PRINT_ERROR_FUNCTION
#define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function
-#undef LANG_HOOKS_BUILTIN_TYPE_DECLS
-#define LANG_HOOKS_BUILTIN_TYPE_DECLS cxx_builtin_type_decls
#undef LANG_HOOKS_PUSHLEVEL
#define LANG_HOOKS_PUSHLEVEL lhd_do_nothing_i
#undef LANG_HOOKS_POPLEVEL
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 64b9549b876..91997270c9e 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3707,7 +3707,6 @@ extern void register_dtor_fn (tree);
extern tmpl_spec_kind current_tmpl_spec_kind (int);
extern tree cp_fname_init (const char *, tree *);
extern tree check_elaborated_type_specifier (enum tag_types, tree, bool);
-extern tree cxx_builtin_type_decls (void);
extern void warn_extern_redeclared_static (tree, tree);
extern bool have_extern_spec;
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3f9feac4737..a343e6ac357 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2748,18 +2748,6 @@ make_unbound_class_template (tree context, tree name, tsubst_flags_t complain)
-/* A chain of TYPE_DECLs for the builtin types. */
-
-static GTY(()) tree builtin_type_decls;
-
-/* Return a chain of TYPE_DECLs for the builtin types. */
-
-tree
-cxx_builtin_type_decls (void)
-{
- return builtin_type_decls;
-}
-
/* Push the declarations of builtin types into the namespace.
RID_INDEX is the index of the builtin type in the array
RID_POINTERS. NAME is the name used when looking up the builtin
@@ -2803,10 +2791,7 @@ record_builtin_type (enum rid rid_index,
TYPE_NAME (type) = tdecl;
if (tdecl)
- {
- TREE_CHAIN (tdecl) = builtin_type_decls;
- builtin_type_decls = tdecl;
- }
+ debug_hooks->type_decl (tdecl, 0);
}
/* Record one of the standard Java types.
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index e020d03f47a..0fe6c0bd2c8 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -179,6 +179,12 @@ static GTY(()) int typevec_len;
static GTY(()) int next_type_number;
+/* The C front end may call dbxout_symbol before dbxout_init runs.
+ We save all such decls in this list and output them when we get
+ to dbxout_init. */
+
+static GTY(()) tree preinit_symbols;
+
enum binclstatus {BINCL_NOT_REQUIRED, BINCL_PENDING, BINCL_PROCESSED};
/* When using N_BINCL in dbx output, each type number is actually a
@@ -371,6 +377,7 @@ static void dbxout_begin_function (tree);
static void dbxout_begin_block (unsigned, unsigned);
static void dbxout_end_block (unsigned, unsigned);
static void dbxout_function_decl (tree);
+static void dbxout_type_decl (tree, int);
const struct gcc_debug_hooks dbx_debug_hooks =
{
@@ -396,6 +403,7 @@ const struct gcc_debug_hooks dbx_debug_hooks =
debug_nothing_int, /* end_function */
dbxout_function_decl,
dbxout_global_decl, /* global_decl */
+ dbxout_type_decl, /* type_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
@@ -425,6 +433,7 @@ const struct gcc_debug_hooks xcoff_debug_hooks =
xcoffout_end_function,
debug_nothing_tree, /* function_decl */
dbxout_global_decl, /* global_decl */
+ dbxout_type_decl, /* type_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
@@ -537,22 +546,20 @@ dbxout_init (const char *input_file_name)
current_file->pending_bincl_name = NULL;
#endif
- /* Make sure that types `int' and `char' have numbers 1 and 2.
- Definitions of other integer types will refer to those numbers.
- (Actually it should no longer matter what their numbers are.
- Also, if any types with tags have been defined, dbxout_symbol
- will output them first, so the numbers won't be 1 and 2. That
- happens in C++. So it's a good thing it should no longer matter). */
-
-#ifdef DBX_OUTPUT_STANDARD_TYPES
- DBX_OUTPUT_STANDARD_TYPES (syms);
-#endif
-
/* Get all permanent types that have typedef names, and output them
all, except for those already output. Some language front ends
- put these declarations in the top-level scope; some do not. */
- dbxout_typedefs ((*lang_hooks.decls.builtin_type_decls) ());
+ put these declarations in the top-level scope; some do not;
+ the latter are responsible for calling debug_hooks->type_decl from
+ their record_builtin_type function. */
dbxout_typedefs (syms);
+
+ if (preinit_symbols)
+ {
+ tree t;
+ for (t = nreverse (preinit_symbols); t; t = TREE_CHAIN (t))
+ dbxout_symbol (TREE_VALUE (t), 0);
+ preinit_symbols = 0;
+ }
}
/* Output any typedef names for types described by TYPE_DECLs in SYMS. */
@@ -805,6 +812,14 @@ dbxout_global_decl (tree decl)
}
}
+/* This is just a function-type adapter; dbxout_symbol does exactly
+ what we want but returns an int. */
+static void
+dbxout_type_decl (tree decl, int local)
+{
+ dbxout_symbol (decl, local);
+}
+
/* At the end of compilation, finish writing the symbol table.
Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
to do nothing. */
@@ -2064,14 +2079,22 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
symbol nodees are flagged with TREE_USED. Ignore any that
aren't flaged as TREE_USED. */
+ if (flag_debug_only_used_symbols
+ && (!TREE_USED (decl)
+ && (TREE_CODE (decl) != VAR_DECL || !DECL_INITIAL (decl))))
+ DBXOUT_DECR_NESTING_AND_RETURN (0);
+
+ /* If dbxout_init has not yet run, queue this symbol for later. */
+ if (!typevec)
+ {
+ preinit_symbols = tree_cons (0, decl, preinit_symbols);
+ DBXOUT_DECR_NESTING_AND_RETURN (0);
+ }
+
if (flag_debug_only_used_symbols)
{
tree t;
- if (!TREE_USED (decl)
- && (TREE_CODE (decl) != VAR_DECL || !DECL_INITIAL (decl)))
- DBXOUT_DECR_NESTING_AND_RETURN (0);
-
/* We now have a used symbol. We need to generate the info for
the symbol's type in addition to the symbol itself. These
type symbols are queued to be generated after were done with
@@ -2175,6 +2198,20 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
if (TREE_ASM_WRITTEN (decl) || TYPE_DECL_SUPPRESS_DEBUG (decl))
DBXOUT_DECR_NESTING_AND_RETURN (0);
+ /* Don't output typedefs for types with magic type numbers (XCOFF). */
+#ifdef DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER
+ {
+ int fundamental_type_number =
+ DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER (decl);
+
+ if (fundamental_type_number != 0)
+ {
+ TREE_ASM_WRITTEN (decl) = 1;
+ TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = fundamental_type_number;
+ DBXOUT_DECR_NESTING_AND_RETURN (0);
+ }
+ }
+#endif
FORCE_TEXT;
result = 1;
{
diff --git a/gcc/debug.c b/gcc/debug.c
index 18d5bc8cae2..812920604ba 100644
--- a/gcc/debug.c
+++ b/gcc/debug.c
@@ -41,6 +41,7 @@ const struct gcc_debug_hooks do_nothing_debug_hooks =
debug_nothing_int, /* end_function */
debug_nothing_tree, /* function_decl */
debug_nothing_tree, /* global_decl */
+ debug_nothing_tree_int, /* type_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
@@ -100,3 +101,9 @@ debug_nothing_int_int (unsigned int line ATTRIBUTE_UNUSED,
unsigned int n ATTRIBUTE_UNUSED)
{
}
+
+void
+debug_nothing_tree_int (tree decl ATTRIBUTE_UNUSED,
+ int local ATTRIBUTE_UNUSED)
+{
+}
diff --git a/gcc/debug.h b/gcc/debug.h
index 448b028ea79..547b7f68eab 100644
--- a/gcc/debug.h
+++ b/gcc/debug.h
@@ -89,6 +89,14 @@ struct gcc_debug_hooks
compilation proper has finished. */
void (* global_decl) (tree decl);
+ /* Debug information for a type DECL. Called from toplev.c after
+ compilation proper, also from various language front ends to
+ record built-in types. The second argument is properly a
+ boolean, which indicates whether or not the type is a "local"
+ type as determined by the language. (It's not a boolean for
+ legacy reasons.) */
+ void (* type_decl) (tree decl, int local);
+
/* Debug information for imported modules and declarations. */
void (* imported_module_or_decl) (tree decl, tree context);
@@ -122,6 +130,7 @@ extern void debug_nothing_int_charstar (unsigned int, const char *);
extern void debug_nothing_int (unsigned int);
extern void debug_nothing_int_int (unsigned int, unsigned int);
extern void debug_nothing_tree (tree);
+extern void debug_nothing_tree_int (tree, int);
extern void debug_nothing_tree_tree (tree, tree);
extern bool debug_true_tree (tree);
extern void debug_nothing_rtx (rtx);
@@ -131,7 +140,6 @@ extern const struct gcc_debug_hooks do_nothing_debug_hooks;
extern const struct gcc_debug_hooks dbx_debug_hooks;
extern const struct gcc_debug_hooks sdb_debug_hooks;
extern const struct gcc_debug_hooks xcoff_debug_hooks;
-extern const struct gcc_debug_hooks dwarf_debug_hooks;
extern const struct gcc_debug_hooks dwarf2_debug_hooks;
extern const struct gcc_debug_hooks vmsdbg_debug_hooks;
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 7bb4562b206..91a4705021e 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -3249,6 +3249,7 @@ static void dwarf2out_begin_block (unsigned, unsigned);
static void dwarf2out_end_block (unsigned, unsigned);
static bool dwarf2out_ignore_block (tree);
static void dwarf2out_global_decl (tree);
+static void dwarf2out_type_decl (tree, int);
static void dwarf2out_imported_module_or_decl (tree, tree);
static void dwarf2out_abstract_function (tree);
static void dwarf2out_var_location (rtx);
@@ -3275,6 +3276,7 @@ const struct gcc_debug_hooks dwarf2_debug_hooks =
debug_nothing_int, /* end_function */
dwarf2out_decl, /* function_decl */
dwarf2out_global_decl,
+ dwarf2out_type_decl, /* type_decl */
dwarf2out_imported_module_or_decl,
debug_nothing_tree, /* deferred_inline_function */
/* The DWARF 2 backend tries to reduce debugging bloat by not
@@ -12494,6 +12496,15 @@ dwarf2out_global_decl (tree decl)
dwarf2out_decl (decl);
}
+/* Output debug information for type decl DECL. Called from toplev.c
+ and from language front ends (to record built-in types). */
+static void
+dwarf2out_type_decl (tree decl, int local)
+{
+ if (!local)
+ dwarf2out_decl (decl);
+}
+
/* Output debug information for imported module or decl. */
static void
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 7caab7809be..7d66437af03 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -242,7 +242,6 @@ extern int lhd_tree_dump_type_quals (tree);
#define LANG_HOOKS_SET_BLOCK set_block
#define LANG_HOOKS_PUSHDECL pushdecl
#define LANG_HOOKS_GETDECLS getdecls
-#define LANG_HOOKS_BUILTIN_TYPE_DECLS lhd_return_null_tree_v
#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL lhd_warn_unused_global_decl
#define LANG_HOOKS_WRITE_GLOBALS write_global_declarations
#define LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE NULL
@@ -256,7 +255,6 @@ extern int lhd_tree_dump_type_quals (tree);
LANG_HOOKS_SET_BLOCK, \
LANG_HOOKS_PUSHDECL, \
LANG_HOOKS_GETDECLS, \
- LANG_HOOKS_BUILTIN_TYPE_DECLS, \
LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL, \
LANG_HOOKS_WRITE_GLOBALS, \
LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE, \
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 199b79f237a..f2c879afd2c 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -189,9 +189,6 @@ struct lang_hooks_for_decls
/* Returns the chain of decls so far in the current scope level. */
tree (*getdecls) (void);
- /* Returns a chain of TYPE_DECLs for built-in types. */
- tree (*builtin_type_decls) (void);
-
/* Returns true when we should warn for an unused global DECL.
We will already have checked that it has static binding. */
bool (*warn_unused_global) (tree);
diff --git a/gcc/sdbout.c b/gcc/sdbout.c
index 648b4c9ccde..56cebba5936 100644
--- a/gcc/sdbout.c
+++ b/gcc/sdbout.c
@@ -48,6 +48,7 @@ AT&T C compiler. From the example below I would conclude the following:
#include "debug.h"
#include "tree.h"
#include "ggc.h"
+#include "varray.h"
static GTY(()) tree anonymous_types;
@@ -59,6 +60,10 @@ static GTY(()) int sdbout_source_line_counter;
static GTY(()) int unnamed_struct_number;
+/* Declarations whose debug info was deferred till end of compilation. */
+
+static GTY(()) varray_type deferred_global_decls;
+
#ifdef SDB_DEBUGGING_INFO
#include "rtl.h"
@@ -331,6 +336,7 @@ const struct gcc_debug_hooks sdb_debug_hooks =
sdbout_end_function, /* end_function */
debug_nothing_tree, /* function_decl */
sdbout_global_decl, /* global_decl */
+ sdbout_type_decl, /* type_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
@@ -1438,6 +1444,8 @@ sdbout_global_decl (tree decl)
sdbout_finish (). */
if (!DECL_INITIAL (decl) || !TREE_PUBLIC (decl))
sdbout_symbol (decl, 0);
+ else
+ VARRAY_PUSH_TREE (deferred_global_decls, decl);
/* Output COFF information for non-global file-scope initialized
variables. */
@@ -1452,29 +1460,12 @@ sdbout_global_decl (tree decl)
static void
sdbout_finish (const char *main_filename ATTRIBUTE_UNUSED)
{
- tree decl = (*lang_hooks.decls.getdecls) ();
- unsigned int len = list_length (decl);
- tree *vec = xmalloc (sizeof (tree) * len);
- unsigned int i;
+ 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 < VARRAY_ACTIVE_SIZE (deferred_global_decls); i++)
+ sdbout_symbol (VARRAY_TREE (deferred_global_decls, i), 0);
- 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);
+ VARRAY_FREE (deferred_global_decls);
}
/* Describe the beginning of an internal block within a function.
@@ -1677,6 +1668,8 @@ sdbout_init (const char *input_file_name ATTRIBUTE_UNUSED)
current_file->next = NULL;
current_file->name = input_file_name;
#endif
+
+ VARRAY_TREE_INIT (deferred_global_decls, 12, "deferred_global_decls");
}
#else /* SDB_DEBUGGING_INFO */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 8330c89bc44..763c5d024ba 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1978,50 +1978,18 @@ rest_of_decl_compilation (tree decl,
expand_decl (decl);
}
}
-#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
- else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
- && TREE_CODE (decl) == TYPE_DECL)
+ else if (TREE_CODE (decl) == TYPE_DECL)
{
timevar_push (TV_SYMOUT);
- dbxout_symbol (decl, 0);
+ debug_hooks->type_decl (decl, !top_level);
timevar_pop (TV_SYMOUT);
}
-#endif
-#ifdef SDB_DEBUGGING_INFO
- else if (write_symbols == SDB_DEBUG && top_level
- && TREE_CODE (decl) == TYPE_DECL)
- {
- timevar_push (TV_SYMOUT);
- sdbout_symbol (decl, 0);
- timevar_pop (TV_SYMOUT);
- }
-#endif
-#ifdef DWARF2_DEBUGGING_INFO
- else if ((write_symbols == DWARF2_DEBUG
- || write_symbols == VMS_AND_DWARF2_DEBUG)
- && top_level
- && TREE_CODE (decl) == TYPE_DECL)
- {
- timevar_push (TV_SYMOUT);
- dwarf2out_decl (decl);
- timevar_pop (TV_SYMOUT);
- }
-#endif
}
/* Called after finishing a record, union or enumeral type. */
void
-rest_of_type_compilation (
-#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO) \
- || defined (SDB_DEBUGGING_INFO) || defined (DWARF2_DEBUGGING_INFO)
- tree type,
- int toplev
-#else
- tree type ATTRIBUTE_UNUSED,
- int toplev ATTRIBUTE_UNUSED
-#endif
- )
+rest_of_type_compilation (tree type, int toplev)
{
/* Avoid confusing the debug information machinery when there are
errors. */
@@ -2029,20 +1997,7 @@ rest_of_type_compilation (
return;
timevar_push (TV_SYMOUT);
-#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
- if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
- dbxout_symbol (TYPE_STUB_DECL (type), !toplev);
-#endif
-#ifdef SDB_DEBUGGING_INFO
- if (write_symbols == SDB_DEBUG)
- sdbout_symbol (TYPE_STUB_DECL (type), !toplev);
-#endif
-#ifdef DWARF2_DEBUGGING_INFO
- if ((write_symbols == DWARF2_DEBUG
- || write_symbols == VMS_AND_DWARF2_DEBUG)
- && toplev)
- dwarf2out_decl (TYPE_STUB_DECL (type));
-#endif
+ debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
timevar_pop (TV_SYMOUT);
}
diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c
index 5c5634de344..f0b49f6f6c6 100644
--- a/gcc/vmsdbgout.c
+++ b/gcc/vmsdbgout.c
@@ -186,6 +186,7 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks
vmsdbgout_end_function,
vmsdbgout_decl,
vmsdbgout_global_decl,
+ debug_nothing_tree_int, /* type_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
vmsdbgout_abstract_function,
diff --git a/gcc/xcoffout.c b/gcc/xcoffout.c
index 324c5d5fa5b..447da746ac4 100644
--- a/gcc/xcoffout.c
+++ b/gcc/xcoffout.c
@@ -112,59 +112,71 @@ const char *xcoff_lastfile;
#define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \
fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM))
-static void assign_type_number (tree, const char *, int);
static void xcoffout_block (tree, int, tree);
static void xcoffout_source_file (FILE *, const char *, int);
/* Support routines for XCOFF debugging info. */
-/* Assign NUMBER as the stabx type number for the type described by NAME.
- Search all decls in the list SYMS to find the type NAME. */
-
-static void
-assign_type_number (tree syms, const char *name, int number)
+struct xcoff_type_number
{
- tree decl;
-
- for (decl = syms; decl; decl = TREE_CHAIN (decl))
- if (DECL_NAME (decl)
- && strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), name) == 0)
- {
- TREE_ASM_WRITTEN (decl) = 1;
- TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = number;
- }
-}
-
-/* Setup gcc primitive types to use the XCOFF built-in type numbers where
- possible. */
-
-void
-xcoff_output_standard_types (tree syms)
-{
- /* Handle built-in C types here. */
-
- assign_type_number (syms, "int", -1);
- assign_type_number (syms, "char", -2);
- assign_type_number (syms, "short int", -3);
- assign_type_number (syms, "long int", (TARGET_64BIT ? -31 : -4));
- assign_type_number (syms, "unsigned char", -5);
- assign_type_number (syms, "signed char", -6);
- assign_type_number (syms, "short unsigned int", -7);
- assign_type_number (syms, "unsigned int", -8);
+ const char *name;
+ int number;
+};
+static const struct xcoff_type_number xcoff_type_numbers[] = {
+ { "int", -1 },
+ { "char", -2 },
+ { "short int", -3 },
+ { "long int", -4 }, /* fiddled to -31 if 64 bits */
+ { "unsigned char", -5 },
+ { "signed char", -6 },
+ { "short unsigned int", -7 },
+ { "unsigned int", -8 },
/* No such type "unsigned". */
- assign_type_number (syms, "long unsigned int", (TARGET_64BIT ? -32 : -10));
- assign_type_number (syms, "void", -11);
- assign_type_number (syms, "float", -12);
- assign_type_number (syms, "double", -13);
- assign_type_number (syms, "long double", -14);
+ { "long unsigned int", -10 }, /* fiddled to -32 if 64 bits */
+ { "void", -11 },
+ { "float", -12 },
+ { "double", -13 },
+ { "long double", -14 },
/* Pascal and Fortran types run from -15 to -29. */
- assign_type_number (syms, "wchar", -30);
- assign_type_number (syms, "long long int", -31);
- assign_type_number (syms, "long long unsigned int", -32);
+ { "wchar", -30 }, /* XXX Should be "wchar_t" ? */
+ { "long long int", -31 },
+ { "long long unsigned int", -32 },
/* Additional Fortran types run from -33 to -37. */
/* ??? Should also handle built-in C++ and Obj-C types. There perhaps
aren't any that C doesn't already have. */
+};
+
+/* Returns an XCOFF fundamental type number for DECL (assumed to be a
+ TYPE_DECL), or 0 if dbxout.c should assign a type number normally. */
+int
+xcoff_assign_fundamental_type_number (tree decl)
+{
+ const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
+ size_t i;
+
+ /* Do not waste time searching the list for non-intrinsic types. */
+ if (DECL_SOURCE_LINE (decl) > 0)
+ return 0;
+
+ /* Linear search, blech, but the list is too small to bother
+ doing anything else. */
+ for (i = 0; i < ARRAY_SIZE (xcoff_type_numbers); i++)
+ if (!strcmp (xcoff_type_numbers[i].name, name))
+ goto found;
+ return 0;
+
+ found:
+ /* -4 and -10 should be replaced with -31 and -32, respectively,
+ when used for a 64-bit type. */
+ if (int_size_in_bytes (TREE_TYPE (decl)) == 8)
+ {
+ if (xcoff_type_numbers[i].number == -4)
+ return -31;
+ if (xcoff_type_numbers[i].number == -10)
+ return -32;
+ }
+ return xcoff_type_numbers[i].number;
}
/* Print an error message for unrecognized stab codes. */
diff --git a/gcc/xcoffout.h b/gcc/xcoffout.h
index 2b830484feb..1a0cf652c48 100644
--- a/gcc/xcoffout.h
+++ b/gcc/xcoffout.h
@@ -29,15 +29,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Use the XCOFF predefined type numbers. */
-/* ??? According to metin, typedef stabx must go in text control section,
- but he did not make this changes everywhere where such typedef stabx
- can be emitted, so it is really needed or not? */
-
-#define DBX_OUTPUT_STANDARD_TYPES(SYMS) \
-{ \
- text_section (); \
- xcoff_output_standard_types (SYMS); \
-}
+#define DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER(TYPE) \
+ xcoff_assign_fundamental_type_number (TYPE)
/* Any type with a negative type index has already been output. */
@@ -183,23 +176,11 @@ extern const char *xcoff_lastfile;
/* Prototype functions in xcoffout.c. */
extern int stab_to_sclass (int);
-#ifdef BUFSIZ
extern void xcoffout_begin_prologue (unsigned int, const char *);
extern void xcoffout_begin_block (unsigned, unsigned);
extern void xcoffout_end_epilogue (unsigned int, const char *);
extern void xcoffout_end_function (unsigned int);
extern void xcoffout_end_block (unsigned, unsigned);
-#endif /* BUFSIZ */
-
-#ifdef TREE_CODE
-extern void xcoff_output_standard_types (tree);
-#ifdef BUFSIZ
+extern int xcoff_assign_fundamental_type_number (tree);
extern void xcoffout_declare_function (FILE *, tree, const char *);
-#endif /* BUFSIZ */
-#endif /* TREE_CODE */
-
-#ifdef RTX_CODE
-#ifdef BUFSIZ
extern void xcoffout_source_line (unsigned int, const char *);
-#endif /* BUFSIZ */
-#endif /* RTX_CODE */