debug.h (struct gcc_debug_hooks): Add type_decl field.
* 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. cp: * 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. From-SVN: r77730
This commit is contained in:
parent
3c419fd66a
commit
21d13d8372
|
@ -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.
|
||||
|
|
|
@ -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) \
|
||||
|
|
12
gcc/c-decl.c
12
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). */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
71
gcc/dbxout.c
71
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;
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
|
10
gcc/debug.h
10
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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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, \
|
||||
|
|
|
@ -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);
|
||||
|
|
35
gcc/sdbout.c
35
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 */
|
||||
|
|
53
gcc/toplev.c
53
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue