* dwarf2read.c (dwarf2_cu): Enhance comment.
authorDoug Evans <dje@google.com>
Mon, 10 Dec 2012 22:02:34 +0000 (22:02 +0000)
committerDoug Evans <dje@google.com>
Mon, 10 Dec 2012 22:02:34 +0000 (22:02 +0000)
(dwarf2_get_pc_bounds): Only add ranges_base for DIEs that live in
the DWO file.
(dwarf2_record_block_ranges): Ditto.

gdb/ChangeLog
gdb/dwarf2read.c

index 5f9ef4db5ed3ac18f9c830ae39b19c5b2554d2cf..cfbd0a3e748860157a7deba1e3351d234a26f716 100644 (file)
@@ -1,5 +1,10 @@
 2012-12-10  Doug Evans  <dje@google.com>
 
+       * dwarf2read.c (dwarf2_cu): Enhance comment.
+       (dwarf2_get_pc_bounds): Only add ranges_base for DIEs that live in
+       the DWO file.
+       (dwarf2_record_block_ranges): Ditto.
+
        * dwarf2read.c (create_dwo_in_dwp): Tweak comment.
 
        * symtab.c (find_pc_sect_symtab): Add comment.
index 7a1bbc5bf7ac3a2101b9538d831ca9cf90d875cf..b0f90ffa48a37b48ddb227878ca7d5b9f3460cf7 100644 (file)
@@ -483,7 +483,12 @@ struct dwarf2_cu
      (zero is a valid value though).
      Note this value comes from the stub CU/TU's DIE.
      Also note that the value is zero in the non-DWO case so this value can
-     be used without needing to know whether DWO files are in use or not.  */
+     be used without needing to know whether DWO files are in use or not.
+     N.B. This does not apply to DW_AT_ranges appearing in
+     DW_TAG_compile_unit dies.  This is a bit of a wart, consider if ever
+     DW_AT_ranges appeared in the DW_TAG_compile_unit of DWO DIEs: then
+     DW_AT_ranges_base *would* have to be applied, and we'd have to care
+     whether the DW_AT_ranges attribute came from the skeleton or DWO.  */
   ULONGEST ranges_base;
 
   /* Mark used when releasing cached dies.  */
@@ -10056,7 +10061,14 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
       attr = dwarf2_attr (die, DW_AT_ranges, cu);
       if (attr != NULL)
        {
-         unsigned int ranges_offset = DW_UNSND (attr) + cu->ranges_base;
+         /* DW_AT_ranges_base does not apply to DIEs from the DWO skeleton.
+            We take advantage of the fact that DW_AT_ranges does not appear
+            in DW_TAG_compile_unit of DWO files.  */
+         int need_ranges_base = die->tag != DW_TAG_compile_unit;
+         unsigned int ranges_offset = (DW_UNSND (attr)
+                                       + (need_ranges_base
+                                          ? cu->ranges_base
+                                          : 0));
 
          /* Value of the DW_AT_ranges attribute is the offset in the
             .debug_ranges section.  */
@@ -10217,10 +10229,15 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block,
   if (attr)
     {
       bfd *obfd = objfile->obfd;
+      /* DW_AT_ranges_base does not apply to DIEs from the DWO skeleton.
+        We take advantage of the fact that DW_AT_ranges does not appear
+        in DW_TAG_compile_unit of DWO files.  */
+      int need_ranges_base = die->tag != DW_TAG_compile_unit;
 
       /* The value of the DW_AT_ranges attribute is the offset of the
          address range list in the .debug_ranges section.  */
-      unsigned long offset = DW_UNSND (attr) + cu->ranges_base;
+      unsigned long offset = (DW_UNSND (attr)
+                             + (need_ranges_base ? cu->ranges_base : 0));
       gdb_byte *buffer = dwarf2_per_objfile->ranges.buffer + offset;
 
       /* For some target architectures, but not others, the