* dwarf2read.c (read_func_scope): Also scan specification DIEs
authorUlrich Weigand <uweigand@de.ibm.com>
Fri, 26 Mar 2010 18:55:30 +0000 (18:55 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Fri, 26 Mar 2010 18:55:30 +0000 (18:55 +0000)
for DW_TAG_imported_module children.

gdb/ChangeLog
gdb/dwarf2read.c

index 5effdf3672985a2833a29c7ccb49f7e79975f3f9..739450902b3884be3df690588d387237e43d3e36 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-26  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * dwarf2read.c (read_func_scope): Also scan specification DIEs
+       for DW_TAG_imported_module children.
+
 2010-03-26  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * dwarf2read.c (dwarf2_name): Work around GCC bugzilla debug/41828 by
index 298703912fa34da85b2d3e3947bcfe3ff5180b7d..ed25124579b7733715f1ebc15619644e998b603b 100644 (file)
@@ -3946,6 +3946,31 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
 
   inherit_abstract_dies (die, cu);
 
+  /* If we have a DW_AT_specification, we might need to import using
+     directives from the context of the specification DIE.  See the
+     comment in determine_prefix.  */
+  if (cu->language == language_cplus
+      && dwarf2_attr (die, DW_AT_specification, cu))
+    {
+      struct dwarf2_cu *spec_cu = cu;
+      struct die_info *spec_die = die_specification (die, &spec_cu);
+
+      while (spec_die)
+       {
+         child_die = spec_die->child;
+         while (child_die && child_die->tag)
+           {
+             if (child_die->tag == DW_TAG_imported_module)
+               process_die (child_die, spec_cu);
+             child_die = sibling_die (child_die);
+           }
+
+         /* In some cases, GCC generates specification DIEs that
+            themselves contain DW_AT_specification attributes.  */
+         spec_die = die_specification (spec_die, &spec_cu);
+       }
+    }
+
   new = pop_context ();
   /* Make a block for the local symbols within.  */
   block = finish_block (new->name, &local_symbols, new->old_blocks,