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.
This commit is contained in:
Jan Kratochvil 2011-12-02 01:28:55 +00:00
parent f28c316a0b
commit 9750bca92c
8 changed files with 471 additions and 2 deletions

View 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> 2011-12-01 Doug Evans <dje@google.com>
* python/py-type.c (type_object_methods): Fix "array" doc string. * python/py-type.c (type_object_methods): Fix "array" doc string.

View file

@ -3462,6 +3462,7 @@ process_psymtab_comp_unit (struct objfile *objfile,
0, 0,
objfile->global_psymbols.next, objfile->global_psymbols.next,
objfile->static_psymbols.next); objfile->static_psymbols.next);
pst->psymtabs_addrmap_supported = 1;
attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, &cu); attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, &cu);
if (attr != NULL) if (attr != NULL)

View file

@ -92,7 +92,8 @@ struct partial_symtab
struct section_offsets *section_offsets; struct section_offsets *section_offsets;
/* Range of text addresses covered by this file; texthigh is the /* 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 textlow;
CORE_ADDR texthigh; CORE_ADDR texthigh;
@ -135,6 +136,12 @@ struct partial_symtab
unsigned char readin; 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 /* 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. */ !readin or if we haven't looked for the symtab after it was readin. */

View file

@ -221,6 +221,8 @@ find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
struct partial_symtab *best_pst = pst; struct partial_symtab *best_pst = pst;
CORE_ADDR best_addr = pst->textlow; CORE_ADDR best_addr = pst->textlow;
gdb_assert (!pst->psymtabs_addrmap_supported);
/* An objfile that has its functions reordered might have /* An objfile that has its functions reordered might have
many partial symbol tables containing the PC, but many partial symbol tables containing the PC, but
we want the partial symbol table that contains the 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. */ debug info type in single OBJFILE. */
ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) 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; struct partial_symtab *best_pst;
@ -976,6 +979,8 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
fprintf_filtered (outfile, "-"); fprintf_filtered (outfile, "-");
fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile); fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
fprintf_filtered (outfile, "\n"); 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", fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
psymtab->number_of_dependencies); psymtab->number_of_dependencies);
for (i = 0; i < psymtab->number_of_dependencies; i++) 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), fputs_filtered (paddress (gdbarch, psymtab->texthigh),
gdb_stdout); gdb_stdout);
printf_filtered ("\n"); printf_filtered ("\n");
printf_filtered (" psymtabs_addrmap_supported %s\n",
(psymtab->psymtabs_addrmap_supported
? "yes" : "no"));
printf_filtered (" globals "); printf_filtered (" globals ");
if (psymtab->n_global_syms) if (psymtab->n_global_syms)
{ {

View 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> 2011-12-01 Joel Brobecker <brobecker@adacore.com>
* gdb.ada/homonym/pck.ads, gdb.ada/homonym/pck.adb: New files. * gdb.ada/homonym/pck.ads, gdb.ada/homonym/pck.adb: New files.

View file

@ -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:

View file

@ -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:

View file

@ -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 .*}