Makefile.in (dwarf2out.o): Depend on input.h

2004-01-27  Devang Patel  <dpatel@apple.com>

        * Makefile.in (dwarf2out.o): Depend on input.h
        * dbxout.c (dbx_debug_hooks): Add new empty hook for
        imported_module_or_decl.
        (xcoff_debug_hooks): Same.
        * sdbout.c (sdb_debug_hooks): Same.
        * vmsdbgout.c (vmsdbg_debug_hooks): Same.
        * debug.c (do_nothing_debug_hooks): Same.
        (debug_nothing_tree_tree): New function.
        * debug.h (gcc_debug_hooks): New hook, imported_module_or_decl.
        * dwarf2out.c: Include input.h.
        (dwarf2_debug_hooks): Add new hook for imported_module_or_decl.
        (remove_child_TAG): New function.
        (dwarf_tag_name): Handle DW_TAG_imported_module.
        (gen_subprogram_die): Equate decl number to declaration die. Do not
        remove all children dies while reusing declaration die for definition.
        Instead, selectively remove only formal parameters.
        (gen_variable_die): Equate variable decl to declaration die.
        (gen_field_die): Equate field decl to line number.
        (force_namespace_die): Replace it with ...
        (force_decl_die): ... this.
        (force_type_die): New function.
        (setup_namespace_context): Replace use of force_namespace_die() with
        force_decl_die().
        (gen_namespace_die): Same.
        (dwarf2out_imported_module_or_decl): New function.

        testsuite:

        * g++.dg/debug/namespace1.C: New test.

        cp:

        * name-lookup.c: Include "debug.h"
        (do_namespace_alias): Invoke debug_hooks to emit debug info
        for namespace alias.
        (do_local_using_decl): Invoke debug_hooks to emit debug info
        for using decl.
        (do_class_using_decl): Same.
        (do_toplevel_using_decl): Same.
        (do_using_directive): Same.
        (cp_emit_debug_info_for_using): New function.
        * Make-lang.in (cp/parser.o): Depend on debug.h
        (cp/name-lookup.o): Same.

From-SVN: r76746
This commit is contained in:
Devang Patel 2004-01-27 12:36:02 -08:00 committed by Devang Patel
parent e6aecf8efd
commit 6097b0c31b
13 changed files with 637 additions and 90 deletions

View File

@ -1,3 +1,31 @@
2004-01-27 Devang Patel <dpatel@apple.com>
* Makefile.in (dwarf2out.o): Depend on input.h
* dbxout.c (dbx_debug_hooks): Add new empty hook for
imported_module_or_decl.
(xcoff_debug_hooks): Same.
* sdbout.c (sdb_debug_hooks): Same.
* vmsdbgout.c (vmsdbg_debug_hooks): Same.
* debug.c (do_nothing_debug_hooks): Same.
(debug_nothing_tree_tree): New function.
* debug.h (gcc_debug_hooks): New hook, imported_module_or_decl.
* dwarf2out.c: Include input.h.
(dwarf2_debug_hooks): Add new hook for imported_module_or_decl.
(remove_child_TAG): New function.
(dwarf_tag_name): Handle DW_TAG_imported_module.
(gen_subprogram_die): Equate decl number to declaration die. Do not
remove all children dies while reusing declaration die for definition.
Instead, selectively remove only formal parameters.
(gen_variable_die): Equate variable decl to declaration die.
(gen_field_die): Equate field decl to line number.
(force_namespace_die): Replace it with ...
(force_decl_die): ... this.
(force_type_die): New function.
(setup_namespace_context): Replace use of force_namespace_die() with
force_decl_die().
(gen_namespace_die): Same.
(dwarf2out_imported_module_or_decl): New function.
2004-01-27 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.c (xtensa_copy_incoming_a7): Remove SUBREG

View File

@ -1599,7 +1599,7 @@ dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
output.h $(DIAGNOSTIC_H) real.h hard-reg-set.h $(REGS_H) $(EXPR_H) \
libfuncs.h toplev.h dwarf2out.h varray.h $(GGC_H) except.h dwarf2asm.h \
$(TM_P_H) langhooks.h $(HASHTAB_H) gt-dwarf2out.h $(TARGET_H) cgraph.h \
$(MD5_H)
$(MD5_H) input.h
dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) flags.h $(RTL_H) \
$(TREE_H) output.h dwarf2asm.h $(TM_P_H) $(GGC_H) gt-dwarf2asm.h
vmsdbgout.o : vmsdbgout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \

View File

@ -1,3 +1,17 @@
2004-01-27 Devang Patel <dpatel@apple.com>
* name-lookup.c: Include "debug.h"
(do_namespace_alias): Invoke debug_hooks to emit debug info
for namespace alias.
(do_local_using_decl): Invoke debug_hooks to emit debug info
for using decl.
(do_class_using_decl): Same.
(do_toplevel_using_decl): Same.
(do_using_directive): Same.
(cp_emit_debug_info_for_using): New function.
* Make-lang.in (cp/parser.o): Depend on debug.h
(cp/name-lookup.o): Same.
2004-01-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cp-tree.h (language_function, lang_type_header): Use

View File

@ -262,11 +262,12 @@ cp/optimize.o: cp/optimize.c $(CXX_TREE_H) $(TM_H) rtl.h integrate.h insn-config
input.h $(PARAMS_H) debug.h tree-inline.h
cp/mangle.o: cp/mangle.c $(CXX_TREE_H) $(TM_H) toplev.h real.h gt-cp-mangle.h $(TM_P_H)
cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) diagnostic.h gt-cp-parser.h output.h
cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) diagnostic.h gt-cp-parser.h \
output.h
cp/name-lookup.o: cp/name-lookup.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(CXX_TREE_H) timevar.h gt-cp-name-lookup.h toplev.h \
$(DIAGNOSTIC_H) flags.h
$(DIAGNOSTIC_H) flags.h debug.h
cp/cxx-pretty-print.o: cp/cxx-pretty-print.c $(CXX_PRETTY_PRINT_H) \
$(CONFIG_H) $(SYSTEM_H) $(TM_H) coretypes.h $(CXX_TREE_H)

View File

@ -30,6 +30,7 @@ Boston, MA 02111-1307, USA. */
#include "timevar.h"
#include "toplev.h"
#include "diagnostic.h"
#include "debug.h"
static cxx_scope *innermost_nonclass_level (void);
static tree select_decl (cxx_binding *, int);
@ -42,7 +43,7 @@ static bool lookup_using_namespace (tree, cxx_binding *, tree,
static bool qualified_lookup_using_namespace (tree, tree, cxx_binding *, int);
static tree lookup_type_current_level (tree);
static tree push_using_directive (tree);
static void cp_emit_debug_info_for_using (tree, tree);
/* The :: namespace. */
@ -2226,6 +2227,7 @@ void
do_local_using_decl (tree decl, tree scope, tree name)
{
tree oldval, oldtype, newval, newtype;
tree orig_decl = decl;
decl = validate_nonmember_using_decl (decl, scope, name);
if (decl == NULL_TREE)
@ -2264,6 +2266,10 @@ do_local_using_decl (tree decl, tree scope, tree name)
}
if (newtype)
set_identifier_type_value (name, newtype);
/* Emit debug info. */
if (!processing_template_decl)
cp_emit_debug_info_for_using (orig_decl, current_scope());
}
/* Return the type that should be used when TYPE's name is preceded
@ -2829,6 +2835,15 @@ do_class_using_decl (tree decl)
type = dependent_type_p (scope) ? NULL_TREE : void_type_node;
value = build_lang_decl (USING_DECL, name, type);
DECL_INITIAL (value) = scope;
if (scope && !processing_template_decl)
{
tree r;
r = lookup_qualified_name (scope, name, false, false);
if (r && TREE_CODE (r) != ERROR_MARK)
cp_emit_debug_info_for_using (r, scope);
}
return value;
}
@ -3135,6 +3150,9 @@ do_namespace_alias (tree alias, tree namespace)
DECL_NAMESPACE_ALIAS (alias) = namespace;
DECL_EXTERNAL (alias) = 1;
pushdecl (alias);
/* Emit debug info for namespace alias. */
(*debug_hooks->global_decl) (alias);
}
/* Like pushdecl, only it places X in the current namespace,
@ -3238,6 +3256,7 @@ void
do_toplevel_using_decl (tree decl, tree scope, tree name)
{
tree oldval, oldtype, newval, newtype;
tree orig_decl = decl;
cxx_binding *binding;
decl = validate_nonmember_using_decl (decl, scope, name);
@ -3251,6 +3270,10 @@ do_toplevel_using_decl (tree decl, tree scope, tree name)
do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype);
/* Emit debug info. */
if (!processing_template_decl)
cp_emit_debug_info_for_using (orig_decl, current_namespace);
/* Copy declarations found. */
if (newval)
binding->value = newval;
@ -3264,6 +3287,8 @@ do_toplevel_using_decl (tree decl, tree scope, tree name)
void
do_using_directive (tree namespace)
{
tree context = NULL_TREE;
if (building_stmt_tree ())
add_stmt (build_stmt (USING_STMT, namespace));
@ -3285,10 +3310,21 @@ do_using_directive (tree namespace)
}
namespace = ORIGINAL_NAMESPACE (namespace);
if (!toplevel_bindings_p ())
push_using_directive (namespace);
{
push_using_directive (namespace);
context = current_scope ();
}
else
/* direct usage */
add_using_namespace (current_namespace, namespace, 0);
{
/* direct usage */
add_using_namespace (current_namespace, namespace, 0);
if (current_namespace != global_namespace)
context = current_namespace;
}
/* Emit debugging info. */
if (!processing_template_decl)
(*debug_hooks->imported_module_or_decl) (namespace, context);
}
/* Deal with a using-directive seen by the parser. Currently we only
@ -4803,4 +4839,32 @@ pop_everything (void)
verbatim ("XXX leaving pop_everything ()\n");
}
/* Emit debugging information for using declarations and directives.
If input tree is overloaded fn then emit debug info for all
candidates. */
static void
cp_emit_debug_info_for_using (tree t, tree context)
{
/* Ignore this FUNCTION_DECL if it refers to a builtin declaration
of a builtin function. */
if (TREE_CODE (t) == FUNCTION_DECL
&& DECL_EXTERNAL (t)
&& DECL_BUILT_IN (t))
return;
/* Do not supply context to imported_module_or_decl, if
it is a global namespace. */
if (context == global_namespace)
context = NULL_TREE;
if (BASELINK_P (t))
t = BASELINK_FUNCTIONS (t);
/* FIXME: Handle TEMPLATE_DECLs. */
for (t = OVL_CURRENT (t); t; t = OVL_NEXT (t))
if (TREE_CODE (t) != TEMPLATE_DECL)
(*debug_hooks->imported_module_or_decl) (t, context);
}
#include "gt-cp-name-lookup.h"

View File

@ -382,23 +382,25 @@ const struct gcc_debug_hooks dbx_debug_hooks =
dbxout_end_source_file,
dbxout_begin_block,
dbxout_end_block,
debug_true_tree, /* ignore_block */
dbxout_source_line, /* source_line */
dbxout_source_line, /* begin_prologue: just output line info */
debug_nothing_int_charstar, /* end_prologue */
debug_nothing_int_charstar, /* end_epilogue */
debug_true_tree, /* ignore_block */
dbxout_source_line, /* source_line */
dbxout_source_line, /* begin_prologue: just output
line info */
debug_nothing_int_charstar, /* end_prologue */
debug_nothing_int_charstar, /* end_epilogue */
#ifdef DBX_FUNCTION_FIRST
dbxout_begin_function,
#else
debug_nothing_tree, /* begin_function */
debug_nothing_tree, /* begin_function */
#endif
debug_nothing_int, /* end_function */
debug_nothing_int, /* end_function */
dbxout_function_decl,
dbxout_global_decl, /* global_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
debug_nothing_rtx, /* label */
dbxout_handle_pch /* handle_pch */
dbxout_global_decl, /* global_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
debug_nothing_rtx, /* label */
dbxout_handle_pch /* handle_pch */
};
#endif /* DBX_DEBUGGING_INFO */
@ -413,19 +415,20 @@ const struct gcc_debug_hooks xcoff_debug_hooks =
dbxout_end_source_file,
xcoffout_begin_block,
xcoffout_end_block,
debug_true_tree, /* ignore_block */
debug_true_tree, /* ignore_block */
xcoffout_source_line,
xcoffout_begin_prologue, /* begin_prologue */
debug_nothing_int_charstar, /* end_prologue */
xcoffout_begin_prologue, /* begin_prologue */
debug_nothing_int_charstar, /* end_prologue */
xcoffout_end_epilogue,
debug_nothing_tree, /* begin_function */
debug_nothing_tree, /* begin_function */
xcoffout_end_function,
debug_nothing_tree, /* function_decl */
dbxout_global_decl, /* global_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
debug_nothing_rtx, /* label */
dbxout_handle_pch /* handle_pch */
debug_nothing_tree, /* function_decl */
dbxout_global_decl, /* global_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
debug_nothing_rtx, /* label */
dbxout_handle_pch /* handle_pch */
};
#endif /* XCOFF_DEBUGGING_INFO */

View File

@ -30,21 +30,22 @@ const struct gcc_debug_hooks do_nothing_debug_hooks =
debug_nothing_int_charstar,
debug_nothing_int_charstar,
debug_nothing_int,
debug_nothing_int_int, /* begin_block */
debug_nothing_int_int, /* end_block */
debug_true_tree, /* ignore_block */
debug_nothing_int_charstar, /* source_line */
debug_nothing_int_charstar, /* begin_prologue */
debug_nothing_int_charstar, /* end_prologue */
debug_nothing_int_charstar, /* end_epilogue */
debug_nothing_tree, /* begin_function */
debug_nothing_int, /* end_function */
debug_nothing_tree, /* function_decl */
debug_nothing_tree, /* global_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
debug_nothing_rtx, /* label */
debug_nothing_int /* handle_pch */
debug_nothing_int_int, /* begin_block */
debug_nothing_int_int, /* end_block */
debug_true_tree, /* ignore_block */
debug_nothing_int_charstar, /* source_line */
debug_nothing_int_charstar, /* begin_prologue */
debug_nothing_int_charstar, /* end_prologue */
debug_nothing_int_charstar, /* end_epilogue */
debug_nothing_tree, /* begin_function */
debug_nothing_int, /* end_function */
debug_nothing_tree, /* function_decl */
debug_nothing_tree, /* global_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
debug_nothing_rtx, /* label */
debug_nothing_int /* handle_pch */
};
/* This file contains implementations of each debug hook that do
@ -60,6 +61,12 @@ debug_nothing_tree (tree decl ATTRIBUTE_UNUSED)
{
}
void
debug_nothing_tree_tree (tree t1 ATTRIBUTE_UNUSED,
tree t2 ATTRIBUTE_UNUSED)
{
}
bool
debug_true_tree (tree block ATTRIBUTE_UNUSED)
{

View File

@ -89,6 +89,9 @@ struct gcc_debug_hooks
compilation proper has finished. */
void (* global_decl) (tree decl);
/* Debug information for imported modules and declarations. */
void (* imported_module_or_decl) (tree decl, tree context);
/* DECL is an inline function, whose body is present, but which is
not being output at this point. */
void (* deferred_inline_function) (tree decl);
@ -116,6 +119,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_tree (tree, tree);
extern bool debug_true_tree (tree);
extern void debug_nothing_rtx (rtx);

View File

@ -65,6 +65,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "langhooks.h"
#include "hashtab.h"
#include "cgraph.h"
#include "input.h"
#ifdef DWARF2_DEBUGGING_INFO
static void dwarf2out_source_line (unsigned int, const char *);
@ -3248,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_imported_module_or_decl (tree, tree);
static void dwarf2out_abstract_function (tree);
/* The debug hooks structure. */
@ -3271,6 +3273,7 @@ const struct gcc_debug_hooks dwarf2_debug_hooks =
debug_nothing_int, /* end_function */
dwarf2out_decl, /* function_decl */
dwarf2out_global_decl,
dwarf2out_imported_module_or_decl,
debug_nothing_tree, /* deferred_inline_function */
/* The DWARF 2 backend tries to reduce debugging bloat by not
emitting the abstract description of inline functions until
@ -3647,6 +3650,7 @@ static bool is_java (void);
static bool is_fortran (void);
static bool is_ada (void);
static void remove_AT (dw_die_ref, enum dwarf_attribute);
static void remove_child_TAG (dw_die_ref, enum dwarf_tag);
static inline void free_die (dw_die_ref);
static void remove_children (dw_die_ref);
static void add_child_die (dw_die_ref, dw_die_ref);
@ -3795,7 +3799,8 @@ static void decls_for_scope (tree, dw_die_ref, int);
static int is_redundant_typedef (tree);
static void gen_namespace_die (tree);
static void gen_decl_die (tree, dw_die_ref);
static dw_die_ref force_namespace_die (tree);
static dw_die_ref force_decl_die (tree);
static dw_die_ref force_type_die (tree);
static dw_die_ref setup_namespace_context (tree, dw_die_ref);
static void declare_in_namespace (tree, dw_die_ref);
static unsigned lookup_filename (const char *);
@ -4073,6 +4078,8 @@ dwarf_tag_name (unsigned int tag)
return "DW_TAG_variable";
case DW_TAG_volatile_type:
return "DW_TAG_volatile_type";
case DW_TAG_imported_module:
return "DW_TAG_imported_module";
case DW_TAG_MIPS_loop:
return "DW_TAG_MIPS_loop";
case DW_TAG_format_label:
@ -5049,6 +5056,34 @@ remove_AT (dw_die_ref die, enum dwarf_attribute attr_kind)
}
}
/* Remove child die whose die_tag is specified tag. */
static void
remove_child_TAG (dw_die_ref die, enum dwarf_tag tag)
{
dw_die_ref current, prev, next;
current = die->die_child;
prev = NULL;
while (current != NULL)
{
if (current->die_tag == tag)
{
next = current->die_sib;
if (prev == NULL)
die->die_child = next;
else
prev->die_sib = next;
free_die (current);
current = next;
}
else
{
prev = current;
current = current->die_sib;
}
}
}
/* Free up the memory used by DIE. */
static inline void
@ -10712,9 +10747,13 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
{
subr_die = old_die;
/* Clear out the declaration attribute and the parm types. */
/* Clear out the declaration attribute and the formal parameters.
Do not remove all children, because it is possible that this
declaration die was forced using force_decl_die(). In such
cases die that forced declaration die (e.g. TAG_imported_module)
is one of the children that we do not want to remove. */
remove_AT (subr_die, DW_AT_declaration);
remove_children (subr_die);
remove_child_TAG (subr_die, DW_TAG_formal_parameter);
}
else
{
@ -10762,8 +10801,10 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
/* The first time we see a member function, it is in the context of
the class to which it belongs. We make sure of this by emitting
the class first. The next time is the definition, which is
handled above. The two may come from the same source text. */
if (DECL_CONTEXT (decl) || DECL_ABSTRACT (decl))
handled above. The two may come from the same source text.
Note that force_decl_die() forces function declaration die. It is
later reused to represent definition. */
equate_decl_number_to_die (decl, subr_die);
}
}
@ -10975,7 +11016,7 @@ gen_variable_die (tree decl, dw_die_ref context_die)
if (declaration)
add_AT_flag (var_die, DW_AT_declaration, 1);
if (class_or_namespace_scope_p (context_die) || DECL_ABSTRACT (decl))
if (DECL_ABSTRACT (decl) || declaration)
equate_decl_number_to_die (decl, var_die);
if (! declaration && ! DECL_ABSTRACT (decl))
@ -11147,6 +11188,9 @@ gen_field_die (tree decl, dw_die_ref context_die)
add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected);
else if (TREE_PRIVATE (decl))
add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private);
/* Equate decl number to die, so that we can look up this decl later on. */
equate_decl_number_to_die (decl, decl_die);
}
#if 0
@ -11857,23 +11901,95 @@ is_redundant_typedef (tree decl)
return 0;
}
/* Returns the DIE for namespace NS or aborts.
Note that namespaces don't really have a lexical context, so there's no
need to pass in a context_die. They always go inside their containing
namespace, or comp_unit_die if none. */
/* Returns the DIE for decl or aborts. */
static dw_die_ref
force_namespace_die (tree ns)
force_decl_die (tree decl)
{
dw_die_ref ns_die;
dw_die_ref decl_die;
unsigned saved_external_flag;
tree save_fn = NULL_TREE;
decl_die = lookup_decl_die (decl);
if (!decl_die)
{
dw_die_ref context_die;
tree decl_context = DECL_CONTEXT (decl);
if (decl_context)
{
/* Find die that represents this context. */
if (TYPE_P (decl_context))
context_die = force_type_die (decl_context);
else
context_die = force_decl_die (decl_context);
}
else
context_die = comp_unit_die;
dwarf2out_decl (ns);
ns_die = lookup_decl_die (ns);
if (!ns_die)
abort();
switch (TREE_CODE (decl))
{
case FUNCTION_DECL:
/* Clear current_function_decl, so that gen_subprogram_die thinks
that this is a declaration. At this point, we just want to force
declaration die. */
save_fn = current_function_decl;
current_function_decl = NULL_TREE;
gen_subprogram_die (decl, context_die);
current_function_decl = save_fn;
break;
return ns_die;
case VAR_DECL:
/* Set external flag to force declaration die. Restore it after
gen_decl_die() call. */
saved_external_flag = DECL_EXTERNAL (decl);
DECL_EXTERNAL (decl) = 1;
gen_decl_die (decl, context_die);
DECL_EXTERNAL (decl) = saved_external_flag;
break;
case NAMESPACE_DECL:
dwarf2out_decl (decl);
break;
default:
abort ();
}
/* See if we can find the die for this deci now.
If not then abort. */
if (!decl_die)
decl_die = lookup_decl_die (decl);
if (!decl_die)
abort ();
}
return decl_die;
}
/* Returns the DIE for decl or aborts. */
static dw_die_ref
force_type_die (tree type)
{
dw_die_ref type_die;
type_die = lookup_type_die (root_type (type));
if (!type_die)
{
dw_die_ref context_die;
if (TYPE_CONTEXT (type))
if (TYPE_P (TYPE_CONTEXT (type)))
context_die = force_type_die (TYPE_CONTEXT (type));
else
context_die = force_decl_die (TYPE_CONTEXT (type));
else
context_die = comp_unit_die;
gen_type_die (type, context_die);
type_die = lookup_type_die (root_type (type));
if (!type_die)
abort();
}
return type_die;
}
/* Force out any required namespaces to be able to output DECL,
@ -11885,7 +12001,7 @@ setup_namespace_context (tree thing, dw_die_ref context_die)
tree context = DECL_P (thing) ? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing);
if (context && TREE_CODE (context) == NAMESPACE_DECL)
/* Force out the namespace. */
context_die = force_namespace_die (context);
context_die = force_decl_die (context);
return context_die;
}
@ -11938,7 +12054,7 @@ gen_namespace_die (tree decl)
/* Force out the namespace we are an alias of, if necessary. */
dw_die_ref origin_die
= force_namespace_die (DECL_ABSTRACT_ORIGIN (decl));
= force_decl_die (DECL_ABSTRACT_ORIGIN (decl));
/* Now create the namespace alias DIE. */
dw_die_ref namespace_die
@ -12141,6 +12257,52 @@ dwarf2out_global_decl (tree decl)
dwarf2out_decl (decl);
}
/* Output debug information for imported module or decl. */
static void
dwarf2out_imported_module_or_decl (tree decl, tree context)
{
dw_die_ref imported_die, at_import_die;
dw_die_ref scope_die;
unsigned file_index;
if (debug_info_level <= DINFO_LEVEL_TERSE)
return;
if (!decl)
abort ();
/* To emit DW_TAG_imported_module or DW_TAG_imported_decl, we need two DIEs.
We need decl DIE for reference and scope die. First, get DIE for the decl
itself. */
/* Get the scope die for decl context. Use comp_unit_die for global module
or decl. If die is not found for non globals, force new die. */
if (!context)
scope_die = comp_unit_die;
else if (TYPE_P (context))
scope_die = force_type_die (context);
else
scope_die = force_decl_die (context);
/* For TYPE_DECL, lookup TREE_TYPE. */
if (TREE_CODE (decl) == TYPE_DECL)
at_import_die = force_type_die (TREE_TYPE (decl));
else
at_import_die = force_decl_die (decl);
/* OK, now we have DIEs for decl as well as scope. Emit imported die. */
if (TREE_CODE (decl) == NAMESPACE_DECL)
imported_die = new_die (DW_TAG_imported_module, scope_die, context);
else
imported_die = new_die (DW_TAG_imported_declaration, scope_die, context);
file_index = lookup_filename (input_filename);
add_AT_unsigned (imported_die, DW_AT_decl_file, file_index);
add_AT_unsigned (imported_die, DW_AT_decl_line, input_line);
add_AT_die_ref (imported_die, DW_AT_import, at_import_die);
}
/* Write the debugging output for DECL. */
void

View File

@ -307,34 +307,35 @@ static struct sdb_file *current_file;
/* The debug hooks structure. */
const struct gcc_debug_hooks sdb_debug_hooks =
{
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, /* source_line */
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, /* source_line */
#ifdef MIPS_DEBUGGING_INFO
/* Defer on MIPS systems so that parameter descriptions follow
function entry. */
debug_nothing_int_charstar, /* begin_prologue */
sdbout_end_prologue, /* end_prologue */
debug_nothing_int_charstar, /* begin_prologue */
sdbout_end_prologue, /* end_prologue */
#else
sdbout_begin_prologue, /* begin_prologue */
debug_nothing_int_charstar, /* end_prologue */
sdbout_begin_prologue, /* begin_prologue */
debug_nothing_int_charstar, /* end_prologue */
#endif
sdbout_end_epilogue, /* end_epilogue */
sdbout_begin_function, /* begin_function */
sdbout_end_function, /* end_function */
debug_nothing_tree, /* function_decl */
sdbout_global_decl, /* global_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
sdbout_label, /* label */
debug_nothing_int /* handle_pch */
sdbout_end_epilogue, /* end_epilogue */
sdbout_begin_function, /* begin_function */
sdbout_end_function, /* end_function */
debug_nothing_tree, /* function_decl */
sdbout_global_decl, /* global_decl */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree, /* outlining_inline_function */
sdbout_label, /* label */
debug_nothing_int /* handle_pch */
};
/* Return a unique string to name an anonymous type. */

View File

@ -1,3 +1,7 @@
2004-01-27 Devang Patel <dpatel@apple.com>
* g++.dg/debug/namespace1.C: New test.
2004-01-27 Ian Lance Taylor <ian@wasabisystems.com>
* gcc.dg/const-elim-1.c: Add xfail for strongarm-*-* and

View File

@ -0,0 +1,258 @@
/* Test DWARF namespace support.
This test case is based on GDB testsuite test case. */
/* { dg-do compile } */
namespace AAA {
char c;
int i;
int A_xyzq (int);
char xyzq (char);
class inA {
public:
int xx;
int fum (int);
};
};
int AAA::inA::fum (int i)
{
return 10 + i;
}
namespace BBB {
char c;
int i;
int B_xyzq (int);
char xyzq (char);
namespace CCC {
char xyzq (char);
};
class Class {
public:
char xyzq (char);
int dummy;
};
};
int AAA::A_xyzq (int x)
{
return 2 * x;
}
char AAA::xyzq (char c)
{
return 'a';
}
int BBB::B_xyzq (int x)
{
return 3 * x;
}
char BBB::xyzq (char c)
{
return 'b';
}
char BBB::CCC::xyzq (char c)
{
return 'z';
}
char BBB::Class::xyzq (char c)
{
return 'o';
}
void marker1(void)
{
return;
}
namespace
{
int X = 9;
namespace G
{
int Xg = 10;
namespace
{
int XgX = 11;
}
}
}
namespace H
{
int h = 14;
}
namespace I = H;
namespace J
{
int j = 15;
}
using namespace J;
namespace K
{
int k = 16;
}
namespace L
{
using namespace K;
}
namespace O
{
int o = 18;
}
namespace P
{
using namespace O;
}
namespace Q
{
using namespace P;
}
namespace R
{
int r1 = 19;
int r2 = 20;
}
using R::r1;
namespace C
{
int c = 1;
int shadow = 12;
class CClass {
public:
int x;
class NestedClass {
public:
int y;
};
};
namespace
{
int cX = 6;
namespace F
{
int cXf = 7;
namespace
{
int cXfX = 8;
}
}
}
namespace C
{
int cc = 2;
}
namespace E
{
int ce = 4;
}
namespace D
{
int cd = 3;
int shadow = 13;
namespace E
{
int cde = 5;
}
namespace M
{
int cdm = 17;
}
using namespace M;
void marker2 (void)
{
// NOTE: carlton/2003-04-23: I'm listing the expressions that I
// plan to have GDB try to print out, just to make sure that the
// compiler and I agree which ones should be legal! It's easy
// to screw up when testing the boundaries of namespace stuff.
c;
//cc;
C::cc;
cd;
//C::D::cd;
E::cde;
shadow;
//E::ce;
cX;
F::cXf;
F::cXfX;
X;
G::Xg;
//cXOtherFile;
//XOtherFile;
G::XgX;
I::h;
j;
L::k;
//k;
cdm;
Q::o;
//o;
r1;
//r2;
return;
}
}
}
int main ()
{
using AAA::inA;
char c1;
using namespace BBB;
c1 = xyzq ('x');
c1 = AAA::xyzq ('x');
c1 = BBB::CCC::xyzq ('m');
inA ina;
ina.xx = 33;
int y;
y = AAA::A_xyzq (33);
y += B_xyzq (44);
BBB::Class cl;
c1 = cl.xyzq('e');
marker1();
C::D::marker2 ();
}

View File

@ -186,10 +186,11 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks
vmsdbgout_end_function,
vmsdbgout_decl,
vmsdbgout_global_decl,
debug_nothing_tree, /* deferred_inline_function */
debug_nothing_tree_tree, /* imported_module_or_decl */
debug_nothing_tree, /* deferred_inline_function */
vmsdbgout_abstract_function,
debug_nothing_rtx, /* label */
debug_nothing_int /* handle_pch */
debug_nothing_rtx, /* label */
debug_nothing_int /* handle_pch */
};
/* Definitions of defaults for assembler-dependent names of various