From 9750bca92c8e67e36ac1b9724abfcb814efaf48f Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Fri, 2 Dec 2011 01:28:55 +0000 Subject: [PATCH] gdb/ 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 | 14 ++ gdb/dwarf2read.c | 1 + gdb/psympriv.h | 9 +- gdb/psymtab.c | 10 +- gdb/testsuite/ChangeLog | 7 + .../gdb.dwarf2/dw2-objfile-overlap-inner.S | 177 +++++++++++++++ .../gdb.dwarf2/dw2-objfile-overlap-outer.S | 208 ++++++++++++++++++ .../gdb.dwarf2/dw2-objfile-overlap.exp | 47 ++++ 8 files changed, 471 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a806a76ad96..497f960fc94 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2011-12-02 Jan Kratochvil + + 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 * python/py-type.c (type_object_methods): Fix "array" doc string. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 3f66c676fdf..a72e5af77dd 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -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) diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 95d7676cbfa..cee39945003 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -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. */ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 6c4507d24d3..8178c0165f1 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -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) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 341ce06d211..3a5716c7c27 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-12-02 Jan Kratochvil + + 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 * 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 index 00000000000..8f11b788424 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S @@ -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 . */ + + .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 index 00000000000..3012e45e112 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S @@ -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 . */ + + .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 index 00000000000..4ae4815ee3b --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap.exp @@ -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 . +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 +gdb_test "info line inner" {Line 2 of "inner\.c" starts at address .*} -- 2.30.2