gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 15 Mar 2011 15:57:12 +0000 (15:57 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 15 Mar 2011 15:57:12 +0000 (15:57 +0000)
* dwarf2read.c (dwarf2_get_pc_bounds): Require HIGH strictly higher
than LOW.  Comment it.
(read_partial_die): Call complaint for inappropriate zero LOWPC or
HIGHPC not strictly higher than LOWPC.

gdb/testsuite/
* gdb.dwarf2/dw2-empty-pc-range.S: New file.
* gdb.dwarf2/dw2-empty-pc-range.exp: New file.
* gdb.dwarf2/pr11465.S: New .text labels text_start and text_end.
Provide a stub byte there.
(DW_TAG_compile_unit): Set DW_AT_low_pc, DW_AT_high_pc and
DW_AT_entry_pc.
(dieb4, dieda): Set DW_AT_high_pc higher than DW_AT_low_pc.

gdb/ChangeLog
gdb/dwarf2read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.exp [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/pr11465.S

index a92d0480ff08a51ff37fe3dab7ec5b8b44085934..6342675eb8d733832d6ecc7da6bf54d685e111e3 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwarf2read.c (dwarf2_get_pc_bounds): Require HIGH strictly higher
+       than LOW.  Comment it.
+       (read_partial_die): Call complaint for inappropriate zero LOWPC or
+       HIGHPC not strictly higher than LOWPC.
+
 2011-03-15  Pierre Muller  <muller@ics.u-strasbg.fr>
 
        Fix formatting of function declarations returning a pointer in
index 2a47c7d19b08fc62a9ee2a5253cf8e635fed001c..5d498d56f0a141fe01dd9507bf862915bf293fcd 100644 (file)
@@ -5982,7 +5982,8 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
        }
     }
 
-  if (high < low)
+  /* read_partial_die has also the strict LOW < HIGH requirement.  */
+  if (high <= low)
     return 0;
 
   /* When using the GNU linker, .gnu.linkonce. sections are used to
@@ -9127,19 +9128,41 @@ read_partial_die (struct partial_die_info *part_die,
        }
     }
 
-  /* When using the GNU linker, .gnu.linkonce. sections are used to
-     eliminate duplicate copies of functions and vtables and such.
-     The linker will arbitrarily choose one and discard the others.
-     The AT_*_pc values for such functions refer to local labels in
-     these sections.  If the section from that file was discarded, the
-     labels are not in the output, so the relocs get a value of 0.
-     If this is a discarded function, mark the pc bounds as invalid,
-     so that GDB will ignore it.  */
-  if (has_low_pc_attr && has_high_pc_attr
-      && part_die->lowpc < part_die->highpc
-      && (part_die->lowpc != 0
-         || dwarf2_per_objfile->has_section_at_zero))
-    part_die->has_pc_info = 1;
+  if (has_low_pc_attr && has_high_pc_attr)
+    {
+      /* When using the GNU linker, .gnu.linkonce. sections are used to
+        eliminate duplicate copies of functions and vtables and such.
+        The linker will arbitrarily choose one and discard the others.
+        The AT_*_pc values for such functions refer to local labels in
+        these sections.  If the section from that file was discarded, the
+        labels are not in the output, so the relocs get a value of 0.
+        If this is a discarded function, mark the pc bounds as invalid,
+        so that GDB will ignore it.  */
+      if (part_die->lowpc == 0 && !dwarf2_per_objfile->has_section_at_zero)
+       {
+         struct gdbarch *gdbarch = get_objfile_arch (cu->objfile);
+
+         complaint (&symfile_complaints,
+                    _("DW_AT_low_pc %s is zero "
+                      "for DIE at 0x%x [in module %s]"),
+                    paddress (gdbarch, part_die->lowpc),
+                    part_die->offset, cu->objfile->name);
+       }
+      /* dwarf2_get_pc_bounds has also the strict low < high requirement.  */
+      else if (part_die->lowpc >= part_die->highpc)
+       {
+         struct gdbarch *gdbarch = get_objfile_arch (cu->objfile);
+
+         complaint (&symfile_complaints,
+                    _("DW_AT_low_pc %s is not < DW_AT_high_pc %s "
+                      "for DIE at 0x%x [in module %s]"),
+                    paddress (gdbarch, part_die->lowpc),
+                    paddress (gdbarch, part_die->highpc),
+                    part_die->offset, cu->objfile->name);
+       }
+      else
+       part_die->has_pc_info = 1;
+    }
 
   return info_ptr;
 }
index 0472ab7fa7614cbfa0dfe17b650b8cc2844dfb69..5af19b36a5d6d271820041094a77dd47b71cf05c 100644 (file)
@@ -1,3 +1,13 @@
+2011-03-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.dwarf2/dw2-empty-pc-range.S: New file.
+       * gdb.dwarf2/dw2-empty-pc-range.exp: New file.
+       * gdb.dwarf2/pr11465.S: New .text labels text_start and text_end.
+       Provide a stub byte there.
+       (DW_TAG_compile_unit): Set DW_AT_low_pc, DW_AT_high_pc and
+       DW_AT_entry_pc.
+       (dieb4, dieda): Set DW_AT_high_pc higher than DW_AT_low_pc.
+
 2011-03-15  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * gdb.arch/altivec-abi.exp: Skip "generic" tests on 64-bit when
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S b/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S
new file mode 100644 (file)
index 0000000..07e8f4a
--- /dev/null
@@ -0,0 +1,82 @@
+/* Copyright 2011, 2011 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+       .text
+pc_start:
+       .byte   0
+pc_end:
+
+       .section        .debug_info
+d:
+       .long   .Ldebug_info_end - 1f   /* Length of Compilation Unit Info */
+1:
+       .2byte  0x3     /* DWARF version number */
+       .long   .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+       .byte   0x4     /* Pointer Size (in bytes) */
+dieb:
+       .uleb128 0x1    /* (DIE (0xb) DW_TAG_compile_unit) */
+       .ascii  "GCC\0" /* DW_AT_producer */
+       .byte   0x2     /* DW_AT_language = DW_LANG_C */
+       .ascii  "1.c\0" /* DW_AT_name */
+
+       .uleb128 0x2            /* (DIE (0xd3) DW_TAG_subprogram) */
+       .byte   0x1             /* DW_AT_external */
+       .ascii  "realrange\0"   /* DW_AT_name */
+       .4byte  pc_start        /* DW_AT_low_pc */
+       .4byte  pc_end          /* DW_AT_high_pc */
+       .byte   0x1             /* DW_AT_prototyped */
+
+       .uleb128 0x2            /* (DIE (0xd3) DW_TAG_subprogram) */
+       .byte   0x1             /* DW_AT_external */
+       .ascii  "emptyrange\0"  /* DW_AT_name */
+       .4byte  pc_start        /* DW_AT_low_pc */
+       .4byte  pc_start        /* DW_AT_high_pc */
+       .byte   0x1             /* DW_AT_prototyped */
+
+       .byte   0x0     /* end of children of DIE 0xb */
+.Ldebug_info_end:
+
+       .section        .debug_abbrev
+.Ldebug_abbrev0:
+
+       .uleb128 0x1    /* (abbrev code) */
+       .uleb128 0x11   /* (TAG: DW_TAG_compile_unit) */
+       .byte   0x1     /* DW_children_yes */
+       .uleb128 0x25   /* (DW_AT_producer) */
+       .uleb128 0x8    /* (DW_FORM_string) */
+       .uleb128 0x13   /* (DW_AT_language) */
+       .uleb128 0xb    /* (DW_FORM_data1) */
+       .uleb128 0x3    /* (DW_AT_name) */
+       .uleb128 0x8    /* (DW_FORM_string) */
+       .byte   0x0
+       .byte   0x0
+
+       .uleb128 0x2    /* (abbrev code) */
+       .uleb128 0x2e   /* (DW_TAG_subprogram) */
+       .byte   0x0     /* DW_children_no */
+       .uleb128 0x3f   /* (DW_AT_external) */
+       .uleb128 0xc    /* (DW_FORM_flag) */
+       .uleb128 0x3    /* (DW_AT_name) */
+       .uleb128 0x8    /* (DW_FORM_string) */
+       .uleb128 0x11   /* (DW_AT_low_pc) */
+       .uleb128 0x1    /* (DW_FORM_addr) */
+       .uleb128 0x12   /* (DW_AT_high_pc) */
+       .uleb128 0x1    /* (DW_FORM_addr) */
+       .uleb128 0x27   /* (DW_AT_prototyped) */
+       .uleb128 0xc    /* (DW_FORM_flag) */
+       .byte   0x0
+       .byte   0x0
+
+       .byte   0x0
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.exp b/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.exp
new file mode 100644 (file)
index 0000000..6835b79
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    return 0  
+}
+
+set testfile "dw2-empty-pc-range"
+set srcfile ${testfile}.S
+set executable ${testfile}.x
+set binfile ${objdir}/${subdir}/${executable}
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {}] != "" } {
+    return -1
+}
+
+clean_restart $executable
+gdb_test "ptype emptyrange" {No symbol "emptyrange" in current context\.} \
+        "empty range before CU load"
+
+# Force loading the CU
+gdb_test "ptype realrange" {type = void \(void\)} \
+        "valid range after CU load"
+
+gdb_test "ptype emptyrange" {No symbol "emptyrange" in current context\.} \
+        "empty range after CU load"
index 56e1ed93bd5e6d2c31a3040fefaf74f6fb9d221b..01722b5e92ec2b3d950d77d1973936997ee32d97 100644 (file)
 */
 
        .text
-_ZN1N1cE:      
+text_start:
+_ZN1N1cE:
+       /* Valid function must have non-empty PC range.  */
+       .byte 0
+text_end:
+
        .section        .debug_info
 d:
        .long   .Ldebug_info_end - 1f /* Length of CU info */
@@ -49,9 +54,9 @@ dieb: .uleb128 0x1            /* DW_TAG_compile_unit */
        .byte   0x4             /* DW_AT_language */
        .long   .LASF5          /* DW_AT_name */
        .long   .LASF6          /* DW_AT_comp_dir */
-       .long   0x0             /* DW_AT_low_pc */
-       .long   0x0             /* DW_AT_high_pc */
-       .long   0x0             /* DW_AT_entry_pc */
+       .long   text_start      /* DW_AT_low_pc */
+       .long   text_end        /* DW_AT_high_pc */
+       .long   text_start      /* DW_AT_entry_pc */
 die29: .uleb128 0x2            /* DW_TAG_namespace */
        .string "N"             /* DW_AT_name */
 die32: .uleb128 0x3            /* DW_TAG_class_type */
@@ -112,7 +117,7 @@ dieaf:      .uleb128 0xe            /* DW_TAG_const_type */
 dieb4: .uleb128 0xf            /* DW_TAG_subprogram */
        .long   die95-d         /* DW_AT_abstract_origin */
        .long   _ZN1N1cE        /* DW_AT_low_pc */
-       .long   _ZN1N1cE        /* DW_AT_high_pc */
+       .long   _ZN1N1cE + 1    /* DW_AT_high_pc */
 diec9: .uleb128 0x10           /* DW_TAG_subprogram */
        .long   die9f-d         /* DW_AT_abstract_origin */
        .byte   2f-1f           /* DW_AT_location */
@@ -131,7 +136,7 @@ dieda:      .uleb128 0x11           /* DW_TAG_subprogram */
        .long   .LASF8          /* DW_AT_name */
        .long   dief2-d         /* DW_AT_type */
        .long   _ZN1N1cE        /* DW_AT_low_pc */
-       .long   _ZN1N1cE        /* DW_AT_high_pc */
+       .long   _ZN1N1cE + 1    /* DW_AT_high_pc */
 dief2: .uleb128 0x12           /* DW_TAG_base_type */
        .byte   0x4             /* DW_AT_byte_size */
        .byte   0x5             /* DW_AT_encoding */