gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 2 Dec 2011 01:28:55 +0000 (01:28 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 2 Dec 2011 01:28:55 +0000 (01:28 +0000)
PR breakpoints/13346
* dwarf2read.c (process_psymtab_comp_unit): Set
PSYMTABS_ADDRMAP_SUPPORTED.
* psympriv.h (struct partial_symtab): Comment textlow and texthigh
validity.  New field psymtabs_addrmap_supported.
* psymtab.c (find_pc_sect_psymtab_closer): New gdb_assert on
psymtabs_addrmap_supported.
(find_pc_sect_psymtab): Do not fallback to TEXTLOW and TEXTHIGH for
!PSYMTABS_ADDRMAP_SUPPORTED.
(dump_psymtab, maintenance_info_psymtabs): Print also
psymtabs_addrmap_supported.

gdb/testsuite/
PR breakpoints/13346
* gdb.dwarf2/dw2-objfile-overlap-inner.S: New file.
* gdb.dwarf2/dw2-objfile-overlap-outer.S: New file.
* gdb.dwarf2/dw2-objfile-overlap.exp: New file.

gdb/ChangeLog
gdb/dwarf2read.c
gdb/psympriv.h
gdb/psymtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap.exp [new file with mode: 0644]

index a806a76ad96d58a773908b03b5505ed058a146f3..497f960fc948ea1bf0a03136b5297eec1ac2c3f8 100644 (file)
@@ -1,3 +1,17 @@
+2011-12-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR breakpoints/13346
+       * dwarf2read.c (process_psymtab_comp_unit): Set
+       PSYMTABS_ADDRMAP_SUPPORTED.
+       * psympriv.h (struct partial_symtab): Comment textlow and texthigh
+       validity.  New field psymtabs_addrmap_supported.
+       * psymtab.c (find_pc_sect_psymtab_closer): New gdb_assert on
+       psymtabs_addrmap_supported.
+       (find_pc_sect_psymtab): Do not fallback to TEXTLOW and TEXTHIGH for
+       !PSYMTABS_ADDRMAP_SUPPORTED.
+       (dump_psymtab, maintenance_info_psymtabs): Print also
+       psymtabs_addrmap_supported.
+
 2011-12-01  Doug Evans  <dje@google.com>
 
        * python/py-type.c (type_object_methods): Fix "array" doc string.
index 3f66c676fdfd2329f4cb84c4df3e55e365a65489..a72e5af77dd9dfd42f4e0c2d2ba5b740f9b448ab 100644 (file)
@@ -3462,6 +3462,7 @@ process_psymtab_comp_unit (struct objfile *objfile,
                              0,
                              objfile->global_psymbols.next,
                              objfile->static_psymbols.next);
+  pst->psymtabs_addrmap_supported = 1;
 
   attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, &cu);
   if (attr != NULL)
index 95d7676cbfad496fad0a8d0fa337c118f1ae9447..cee3994500317dd8d72eea249f6a0c149ebe8192 100644 (file)
@@ -92,7 +92,8 @@ struct partial_symtab
   struct section_offsets *section_offsets;
 
   /* Range of text addresses covered by this file; texthigh is the
-     beginning of the next section.  */
+     beginning of the next section.  Do not use if PSYMTABS_ADDRMAP_SUPPORTED
+     is set.  */
 
   CORE_ADDR textlow;
   CORE_ADDR texthigh;
@@ -135,6 +136,12 @@ struct partial_symtab
 
   unsigned char readin;
 
+  /* True iff objfile->psymtabs_addrmap is properly populated for this
+     partial_symtab.  For discontiguous overlapping psymtabs is the only usable
+     info in PSYMTABS_ADDRMAP.  */
+
+  unsigned char psymtabs_addrmap_supported;
+
   /* Pointer to symtab eventually allocated for this source file, 0 if
      !readin or if we haven't looked for the symtab after it was readin.  */
 
index 6c4507d24d3b900a8d4751d79549167acfb7bd96..8178c0165f13d5eacf3fce1cbcada47b6c016a40 100644 (file)
@@ -221,6 +221,8 @@ find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
   struct partial_symtab *best_pst = pst;
   CORE_ADDR best_addr = pst->textlow;
 
+  gdb_assert (!pst->psymtabs_addrmap_supported);
+
   /* An objfile that has its functions reordered might have
      many partial symbol tables containing the PC, but
      we want the partial symbol table that contains the
@@ -344,7 +346,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
      debug info type in single OBJFILE.  */
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
-    if (pc >= pst->textlow && pc < pst->texthigh)
+    if (!pst->psymtabs_addrmap_supported
+       && pc >= pst->textlow && pc < pst->texthigh)
       {
        struct partial_symtab *best_pst;
 
@@ -976,6 +979,8 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
   fprintf_filtered (outfile, "-");
   fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
   fprintf_filtered (outfile, "\n");
+  fprintf_filtered (outfile, "  Address map supported - %s.\n",
+                   psymtab->psymtabs_addrmap_supported ? "yes" : "no");
   fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
                    psymtab->number_of_dependencies);
   for (i = 0; i < psymtab->number_of_dependencies; i++)
@@ -1781,6 +1786,9 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
              fputs_filtered (paddress (gdbarch, psymtab->texthigh),
                              gdb_stdout);
              printf_filtered ("\n");
+             printf_filtered ("    psymtabs_addrmap_supported %s\n",
+                              (psymtab->psymtabs_addrmap_supported
+                               ? "yes" : "no"));
              printf_filtered ("    globals ");
              if (psymtab->n_global_syms)
                {
index 341ce06d21196bec11b315681cb664f06fa22bb3..3a5716c7c2718432f1e66eef2d7b64680f318a57 100644 (file)
@@ -1,3 +1,10 @@
+2011-12-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR breakpoints/13346
+       * gdb.dwarf2/dw2-objfile-overlap-inner.S: New file.
+       * gdb.dwarf2/dw2-objfile-overlap-outer.S: New file.
+       * gdb.dwarf2/dw2-objfile-overlap.exp: New file.
+
 2011-12-01  Joel Brobecker  <brobecker@adacore.com>
 
        * gdb.ada/homonym/pck.ads, gdb.ada/homonym/pck.adb: New files.
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S
new file mode 100644 (file)
index 0000000..8f11b78
--- /dev/null
@@ -0,0 +1,177 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   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/>.  */
+
+       .text
+
+       .globl _start
+_start:
+
+       .globl inner
+       .type inner, %function
+inner:
+.Lbegin_inner:
+       .int 0
+.Lend_inner:
+       .size inner, . - inner
+
+/* Debug information */
+
+       .section .debug_info
+.Lcu1_begin:
+       /* CU header */
+       .4byte  .Lcu1_end - .Lcu1_start         /* Length of Compilation Unit */
+.Lcu1_start:
+       .2byte  2                               /* DWARF Version */
+       .4byte  .Labbrev1_begin                 /* Offset into abbrev section */
+       .byte   4                               /* Pointer size */
+
+       /* CU die */
+       .uleb128 1                              /* Abbrev: DW_TAG_compile_unit */
+       .4byte  .Lline1_begin                   /* DW_AT_stmt_list */
+       .4byte  .Ldebug_ranges                  /* DW_AT_ranges */
+       .ascii  "inner.c\0"                     /* DW_AT_name */
+        .ascii  "/tmp\0"                       /* DW_AT_comp_dir */
+       .ascii  "GNU C 3.3.3\0"                 /* DW_AT_producer */
+       .byte   1                               /* DW_AT_language (C) */
+
+       /* inner */
+       .uleb128        2                       /* Abbrev: DW_TAG_subprogram */
+       .byte           1                       /* DW_AT_external */
+       .byte           1                       /* DW_AT_decl_file */
+       .byte           1                       /* DW_AT_decl_line */
+       .ascii          "inner\0"               /* DW_AT_name */
+       .4byte          .Lbegin_inner           /* DW_AT_low_pc */
+       .4byte          .Lend_inner             /* DW_AT_high_pc */
+
+       .byte           0                       /* End of children of CU */
+
+.Lcu1_end:
+
+/* DW_AT_ranges.  */
+       .section        .debug_ranges
+.Ldebug_ranges:
+       .4byte  .Lbegin_inner
+       .4byte  .Lend_inner
+       .4byte  0
+       .4byte  0
+
+/* Abbrev table */
+       .section .debug_abbrev
+.Labbrev1_begin:
+       .uleb128        1                       /* Abbrev code */
+       .uleb128        0x11                    /* DW_TAG_compile_unit */
+       .byte           1                       /* has_children */
+       .uleb128        0x10                    /* DW_AT_stmt_list */
+       .uleb128        0x6                     /* DW_FORM_data4 */
+       .uleb128        0x55                    /* DW_AT_ranges */
+       .uleb128        0x6                     /* DW_FORM_data4 */
+       .uleb128        0x3                     /* DW_AT_name */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x1b                    /* DW_AT_comp_dir */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x25                    /* DW_AT_producer */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x13                    /* DW_AT_language */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .uleb128        2                       /* Abbrev code */
+       .uleb128        0x2e                    /* DW_TAG_subprogram */
+       .byte           0                       /* has_children */
+       .uleb128        0x3f                    /* DW_AT_external */
+       .uleb128        0xc                     /* DW_FORM_flag */
+       .uleb128        0x3a                    /* DW_AT_decl_file */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .uleb128        0x3b                    /* DW_AT_decl_line */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .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 */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+/* Line table */
+       .section .debug_line
+.Lline1_begin:
+       .4byte          .Lline1_end - .Lline1_start     /* Initial length */
+.Lline1_start:
+       .2byte          2                       /* Version */
+       .4byte          .Lline1_lines - .Lline1_hdr     /* header_length */
+.Lline1_hdr:
+       .byte           1                       /* Minimum insn length */
+       .byte           1                       /* default_is_stmt */
+       .byte           1                       /* line_base */
+       .byte           1                       /* line_range */
+       .byte           0x10                    /* opcode_base */
+
+       /* Standard lengths */
+       .byte           0
+       .byte           1
+       .byte           1
+       .byte           1
+       .byte           1
+       .byte           0
+       .byte           0
+       .byte           0
+       .byte           1
+       .byte           0
+       .byte           0
+       .byte           1
+       .byte           0
+       .byte           0
+       .byte           0
+
+       /* Include directories */
+        .ascii  "/tmp\0"
+       .byte           0
+
+       /* File names */
+       .ascii          "inner.c\0"
+       .uleb128        1
+       .uleb128        0
+       .uleb128        0
+
+       .byte           0
+
+.Lline1_lines:
+       .byte           0       /* DW_LNE_set_address */
+       .uleb128        5
+       .byte           2
+       .4byte          .Lbegin_inner
+
+       .byte           3       /* DW_LNS_advance_line */
+       .sleb128        1       /* ... to 2 */
+
+       .byte           1       /* DW_LNS_copy */
+
+       .byte           0       /* DW_LNE_set_address */
+       .uleb128        5
+       .byte           2
+       .4byte          .Lend_inner
+
+       .byte           0       /* DW_LNE_end_of_sequence */
+       .uleb128        1
+       .byte           1
+
+.Lline1_end:
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S
new file mode 100644 (file)
index 0000000..3012e45
--- /dev/null
@@ -0,0 +1,208 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   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/>.  */
+
+       .text
+
+       .globl _start
+_start:
+
+       .globl outer_before
+       .type outer_before, %function
+outer_before:
+.Lbegin_outer_before:
+       .int 0
+.Lend_outer_before:
+       .size outer_before, . - outer_before
+
+       .globl outer_inner
+outer_inner:
+
+       .int 0
+
+       .globl outer_after
+       .type outer_after, %function
+outer_after:
+.Lbegin_outer_after:
+       .int 0
+.Lend_outer_after:
+       .size outer_after, . - outer_after
+
+/* Debug information */
+
+       .section .debug_info
+.Lcu1_begin:
+       /* CU header */
+       .4byte  .Lcu1_end - .Lcu1_start         /* Length of Compilation Unit */
+.Lcu1_start:
+       .2byte  2                               /* DWARF Version */
+       .4byte  .Labbrev1_begin                 /* Offset into abbrev section */
+       .byte   4                               /* Pointer size */
+
+       /* CU die */
+       .uleb128 1                              /* Abbrev: DW_TAG_compile_unit */
+       .4byte  .Lline1_begin                   /* DW_AT_stmt_list */
+       .4byte  .Ldebug_ranges                  /* DW_AT_ranges */
+       .ascii  "outer.c\0"                     /* DW_AT_name */
+        .ascii  "/tmp\0"                       /* DW_AT_comp_dir */
+       .ascii  "GNU C 3.3.3\0"                 /* DW_AT_producer */
+       .byte   1                               /* DW_AT_language (C) */
+
+       /* outer_before */
+       .uleb128        2                       /* Abbrev: DW_TAG_subprogram */
+       .byte           1                       /* DW_AT_external */
+       .byte           1                       /* DW_AT_decl_file */
+       .byte           1                       /* DW_AT_decl_line */
+       .ascii          "outer_before\0"        /* DW_AT_name */
+       .4byte          .Lbegin_outer_before    /* DW_AT_low_pc */
+       .4byte          .Lend_outer_before      /* DW_AT_high_pc */
+
+       /* outer_after */
+       .uleb128        2                       /* Abbrev: DW_TAG_subprogram */
+       .byte           1                       /* DW_AT_external */
+       .byte           1                       /* DW_AT_decl_file */
+       .byte           2                       /* DW_AT_decl_line */
+       .ascii          "outer_after\0"         /* DW_AT_name */
+       .4byte          .Lbegin_outer_after     /* DW_AT_low_pc */
+       .4byte          .Lend_outer_after       /* DW_AT_high_pc */
+
+       .byte           0                       /* End of children of CU */
+
+.Lcu1_end:
+
+/* DW_AT_ranges.  */
+       .section        .debug_ranges
+.Ldebug_ranges:
+       .4byte  .Lbegin_outer_before
+       .4byte  .Lend_outer_before
+       .4byte  .Lbegin_outer_after
+       .4byte  .Lend_outer_after
+       .4byte  0
+       .4byte  0
+
+/* Abbrev table */
+       .section .debug_abbrev
+.Labbrev1_begin:
+       .uleb128        1                       /* Abbrev code */
+       .uleb128        0x11                    /* DW_TAG_compile_unit */
+       .byte           1                       /* has_children */
+       .uleb128        0x10                    /* DW_AT_stmt_list */
+       .uleb128        0x6                     /* DW_FORM_data4 */
+       .uleb128        0x55                    /* DW_AT_ranges */
+       .uleb128        0x6                     /* DW_FORM_data4 */
+       .uleb128        0x3                     /* DW_AT_name */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x1b                    /* DW_AT_comp_dir */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x25                    /* DW_AT_producer */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x13                    /* DW_AT_language */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .uleb128        2                       /* Abbrev code */
+       .uleb128        0x2e                    /* DW_TAG_subprogram */
+       .byte           0                       /* has_children */
+       .uleb128        0x3f                    /* DW_AT_external */
+       .uleb128        0xc                     /* DW_FORM_flag */
+       .uleb128        0x3a                    /* DW_AT_decl_file */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .uleb128        0x3b                    /* DW_AT_decl_line */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .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 */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+/* Line table */
+       .section .debug_line
+.Lline1_begin:
+       .4byte          .Lline1_end - .Lline1_start     /* Initial length */
+.Lline1_start:
+       .2byte          2                       /* Version */
+       .4byte          .Lline1_lines - .Lline1_hdr     /* header_length */
+.Lline1_hdr:
+       .byte           1                       /* Minimum insn length */
+       .byte           1                       /* default_is_stmt */
+       .byte           1                       /* line_base */
+       .byte           1                       /* line_range */
+       .byte           0x10                    /* opcode_base */
+
+       /* Standard lengths */
+       .byte           0
+       .byte           1
+       .byte           1
+       .byte           1
+       .byte           1
+       .byte           0
+       .byte           0
+       .byte           0
+       .byte           1
+       .byte           0
+       .byte           0
+       .byte           1
+       .byte           0
+       .byte           0
+       .byte           0
+
+       /* Include directories */
+        .ascii  "/tmp\0"
+       .byte           0
+
+       /* File names */
+       .ascii          "outer.c\0"
+       .uleb128        1
+       .uleb128        0
+       .uleb128        0
+
+       .byte           0
+
+.Lline1_lines:
+       .byte           0       /* DW_LNE_set_address */
+       .uleb128        5
+       .byte           2
+       .4byte          .Lbegin_outer_before
+
+       .byte           1       /* DW_LNS_copy */
+
+       .byte           0       /* DW_LNE_set_address */
+       .uleb128        5
+       .byte           2
+       .4byte          .Lbegin_outer_after
+
+       .byte           3       /* DW_LNS_advance_line */
+       .sleb128        2       /* ... to 3 */
+
+       .byte           1       /* DW_LNS_copy */
+
+       .byte           0       /* DW_LNE_set_address */
+       .uleb128        5
+       .byte           2
+       .4byte          .Lend_outer_after
+
+       .byte           0       /* DW_LNE_end_of_sequence */
+       .uleb128        1
+       .byte           1
+
+.Lline1_end:
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap.exp b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap.exp
new file mode 100644 (file)
index 0000000..4ae4815
--- /dev/null
@@ -0,0 +1,47 @@
+# 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-objfile-overlap"
+set srcfile_outer ${testfile}-outer.S
+set srcfile_inner ${testfile}-inner.S
+set executable_outer ${testfile}-outer.x
+set binfile_outer ${objdir}/${subdir}/${executable_outer}
+set binfile_inner ${objdir}/${subdir}/${testfile}-inner.x
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile_outer}" "${binfile_outer}" \
+      object {}] != ""
+     || [gdb_compile "${srcdir}/${subdir}/${srcfile_inner}" "${binfile_inner}" \
+      object {}] != "" } {
+    return -1
+}
+
+clean_restart $executable_outer
+
+gdb_test "add-symbol-file $binfile_inner outer_inner" \
+         {Reading symbols from .*\.\.\.done\.} "add-symbol-file" \
+        "\r\n\t\\.text_addr = 0x\[0-9a-f\]+\r\n\\(y or n\\) \$" "y"
+
+# Expand symtab for ${binfile_outer}.
+gdb_breakpoint "*outer_before"
+
+# FAIL was:
+# No line number information available for address 0x4 <outer_inner>
+gdb_test "info line inner" {Line 2 of "inner\.c" starts at address .*}