Makefile.in (dwarf2out.o): Depend on input.h
authorDevang Patel <dpatel@apple.com>
Tue, 27 Jan 2004 20:36:02 +0000 (12:36 -0800)
committerDevang Patel <dpatel@gcc.gnu.org>
Tue, 27 Jan 2004 20:36:02 +0000 (12:36 -0800)
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

13 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/cp/ChangeLog
gcc/cp/Make-lang.in
gcc/cp/name-lookup.c
gcc/dbxout.c
gcc/debug.c
gcc/debug.h
gcc/dwarf2out.c
gcc/sdbout.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/namespace1.C [new file with mode: 0644]
gcc/vmsdbgout.c

index 2bd5d7d59b06bc0b118a0ca135e08d793ffe8199..dce9a7c86b6cb3f14376ccde87deaa2d46f4e370 100644 (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
index 98c07f2e45323e2fe06269f57005923983979a1e..ff2878ca6a5c31d7ed71115cb66456ec17a7977b 100644 (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) \
index 001c992ac4da4a6eb1f355903b09a52e25adbe2f..2bd3883b0a01eb4b3e46f1e2c26a51dc582ce2d4 100644 (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
index f4e58d52f2090f3fc46f8228b96ec798ee41455f..3723a9fac90debe2b38c23f09f7b193b66d58614 100644 (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)
index 14f7b76bdcdcbc161ac05f272c58a9e878323bd9..30ff8e50822532707e95777a7d0db2570acca13f 100644 (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"
index 46fc026482adbac64870981055e87210f5c50c65..3561f434f41191409b9460251708fd24dc348e71 100644 (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  */
 \f
index e18ce55448c36fa16301a7fb0dc33e667c0a23db..03b0acc5648351680781299b0dc6ea36f67df20f 100644 (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)
 {
index 22d837835c627ded14af552dd520811494c2e0c3..fee3bc6400ca9b989ccd23f3c6256ec9513eeb6d 100644 (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);
 
index 7dca634483a2acc3764b04a6fd04534389f426be..f9d86b5f7763e252aadb099bc604a0982e9d00cd 100644 (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.
+/* Returns the DIE for decl 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.  */
+static dw_die_ref
+force_decl_die (tree decl)
+{
+  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;
+
+      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;
+
+       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_namespace_die (tree ns)
+force_type_die (tree type)
 {
-  dw_die_ref ns_die;
+  dw_die_ref type_die;
 
-  dwarf2out_decl (ns);
-  ns_die = lookup_decl_die (ns);
-  if (!ns_die)
-    abort();
+  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;
 
-  return ns_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
index 3d62047531504eea7a0ac80301cbc03ebaab4820..d33b5c1cc1d8f418e795e13ed212cefedb2b1f91 100644 (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.  */
index 264927497df725b5355c599e379ef10973c09a6c..53070cc64fde8aed7128e2a7c3c80464e09a8976 100644 (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
diff --git a/gcc/testsuite/g++.dg/debug/namespace1.C b/gcc/testsuite/g++.dg/debug/namespace1.C
new file mode 100644 (file)
index 0000000..c1954d6
--- /dev/null
@@ -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 ();
+}
index 4f7f62d2e976290f84221a8fc84123e3ed221bfa..0a9062a7a3808350fb5bac0402f67707ad4d5430 100644 (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