]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2003-12-15 David Carlton <carlton@kealia.com>
authorDavid Carlton <carlton@bactrian.org>
Mon, 15 Dec 2003 21:16:06 +0000 (21:16 +0000)
committerDavid Carlton <carlton@bactrian.org>
Mon, 15 Dec 2003 21:16:06 +0000 (21:16 +0000)
* dwarf2read.c (get_scope_pc_bounds): New.
(psymtab_to_symtab_1): Use get_scope_pc_bounds.
(read_file_scope): Ditto.

gdb/ChangeLog
gdb/dwarf2read.c

index 1ad5a43e28349faebea326ddd6ac198efaa4ad47..c3825b8705a20ae54cba082e2eb08b0d0b2964db 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-15  David Carlton  <carlton@kealia.com>
+
+       * dwarf2read.c (get_scope_pc_bounds): New.
+       (psymtab_to_symtab_1): Use get_scope_pc_bounds.
+       (read_file_scope): Ditto.
+
 2003-11-11  David Carlton  <carlton@kealia.com>
 
        * valops.c: Tweak comments to match proposed patch.
index c848d0ea757665933ebdd6408f99006847b7c651..a42144bb14569009478dc06ad1fb9df274c67ea7 100644 (file)
@@ -840,6 +840,10 @@ static int dwarf2_get_pc_bounds (struct die_info *,
                                 CORE_ADDR *, CORE_ADDR *, struct objfile *,
                                 const struct comp_unit_head *);
 
+static void get_scope_pc_bounds (struct die_info *,
+                                CORE_ADDR *, CORE_ADDR *, struct objfile *,
+                                const struct comp_unit_head *);
+
 static void dwarf2_add_field (struct field_info *, struct die_info *,
                              struct objfile *, const struct comp_unit_head *);
 
@@ -1977,31 +1981,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst)
   /* Do line number decoding in read_file_scope () */
   process_die (dies, objfile, &cu_header);
 
-  if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile, &cu_header))
-    {
-      /* Some compilers don't define a DW_AT_high_pc attribute for
-         the compilation unit.   If the DW_AT_high_pc is missing,
-         synthesize it, by scanning the DIE's below the compilation unit.  */
-      highpc = 0;
-      if (dies->child != NULL)
-       {
-         child_die = dies->child;
-         while (child_die && child_die->tag)
-           {
-             if (child_die->tag == DW_TAG_subprogram)
-               {
-                 CORE_ADDR low, high;
-
-                 if (dwarf2_get_pc_bounds (child_die, &low, &high,
-                                           objfile, &cu_header))
-                   {
-                     highpc = max (highpc, high);
-                   }
-               }
-             child_die = sibling_die (child_die);
-           }
-       }
-    }
+  get_scope_pc_bounds (dies, &lowpc, &highpc, objfile, &cu_header);
   symtab = end_symtab (highpc + baseaddr, objfile, SECT_OFF_TEXT (objfile));
 
   /* Set symtab language to language from DW_AT_language.
@@ -2125,28 +2105,7 @@ read_file_scope (struct die_info *die, struct objfile *objfile,
   bfd *abfd = objfile->obfd;
   struct line_header *line_header = 0;
 
-  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
-    {
-      if (die->child != NULL)
-       {
-         child_die = die->child;
-         while (child_die && child_die->tag)
-           {
-             if (child_die->tag == DW_TAG_subprogram)
-               {
-                 CORE_ADDR low, high;
-
-                 if (dwarf2_get_pc_bounds (child_die, &low, &high,
-                                           objfile, cu_header))
-                   {
-                     lowpc = min (lowpc, low);
-                     highpc = max (highpc, high);
-                   }
-               }
-             child_die = sibling_die (child_die);
-           }
-       }
-    }
+  get_scope_pc_bounds (die, &lowpc, &highpc, objfile, cu_header);
 
   /* If we didn't find a lowpc, set it to highpc to avoid complaints
      from finish_block.  */
@@ -2577,6 +2536,69 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
   return ret;
 }
 
+/* Get the low and high pc's represented by the scope DIE, and store
+   them in *LOWPC and *HIGHPC.  If the correct values can't be
+   determined, set *LOWPC to -1 and *HIGHPC to 0.  */
+static void
+get_scope_pc_bounds (struct die_info *die,
+                    CORE_ADDR *lowpc, CORE_ADDR *highpc,
+                    struct objfile *objfile,
+                    const struct comp_unit_head *cu_header)
+{
+  CORE_ADDR best_low = (CORE_ADDR) -1;
+  CORE_ADDR best_high = (CORE_ADDR) 0;
+  CORE_ADDR current_low, current_high;
+
+  if (dwarf2_get_pc_bounds (die, &current_low, &current_high,
+                           objfile, cu_header))
+    {
+      best_low = current_low;
+      best_high = current_high;
+    }
+  else
+    {
+      struct die_info *child = die->child;
+
+      while (child && child->tag)
+       {
+         switch (child->tag) {
+         case DW_TAG_subprogram:
+           if (dwarf2_get_pc_bounds (child, &current_low, &current_high,
+                                     objfile, cu_header));
+             {
+               best_low = min (best_low, current_low);
+               best_high = max (best_high, current_high);
+             }
+           break;
+         case DW_TAG_namespace:
+           /* FIXME: carlton/2003-12-15: Should we do this for
+              DW_TAG_class_type/DW_TAG_structure_type, too?  I think
+              that current GCC's always generate the DIEs
+              corresponding to definitions methods of classes at
+              namespace scope, but I don't see any reason why they
+              have to.  */
+           get_scope_pc_bounds (child, &current_low, &current_high,
+                                objfile, cu_header);
+
+           if (current_low != ((CORE_ADDR) -1))
+             {
+               best_low = min (best_low, current_low);
+               best_high = max (best_high, current_high);
+             }
+           break;
+         default:
+           /* Ignore. */
+           break;
+         }
+
+         child = sibling_die (child);
+       }
+    }
+
+  *lowpc = best_low;
+  *highpc = best_high;
+}
+
 /* Add an aggregate field to the field list.  */
 
 static void