forked from Imagelibrary/binutils-gdb
PR symtab/17559
Basically the problem is that "symtab" is ambiguous. Is it the primary symtab (where we canonically think of blockvectors as being stored) or is it for a specific file (where each file's line table is stored) ? gdb_disassembly wants the symtab that contains the line table but is instead getting the primary symtab. gdb/ChangeLog: PR symtab/17559 * symtab.c (find_pc_line_symtab): New function. * symtab.h (find_pc_line_symtab): Declare. * disasm.c (gdb_disassembly): Call find_pc_line_symtab instead of find_pc_symtab. * tui/tui-disasm.c (tui_set_disassem_content): Ditto. * tui/tui-hooks.c (tui_selected_frame_level_changed_hook): Ditto. * tui/tui-source.c (tui_vertical_source_scroll): Ditto. * tui/tui-win.c (make_visible_with_new_height): Ditto. * tui/tui-winsource.c (tui_horizontal_source_scroll): Ditto. (tui_display_main): Call find_pc_line_symtab instead of find_pc_line. gdb/testsuite/ChangeLog: PR symtab/17559 * gdb.base/line-symtabs.exp: New file. * gdb.base/line-symtabs.c: New file. * gdb.base/line-symtabs.h: New file.
This commit is contained in:
@@ -1,3 +1,17 @@
|
||||
2014-11-15 Doug Evans <xdje42@gmail.com>
|
||||
|
||||
PR symtab/17559
|
||||
* symtab.c (find_pc_line_symtab): New function.
|
||||
* symtab.h (find_pc_line_symtab): Declare.
|
||||
* disasm.c (gdb_disassembly): Call find_pc_line_symtab instead of
|
||||
find_pc_symtab.
|
||||
* tui/tui-disasm.c (tui_set_disassem_content): Ditto.
|
||||
* tui/tui-hooks.c (tui_selected_frame_level_changed_hook): Ditto.
|
||||
* tui/tui-source.c (tui_vertical_source_scroll): Ditto.
|
||||
* tui/tui-win.c (make_visible_with_new_height): Ditto.
|
||||
* tui/tui-winsource.c (tui_horizontal_source_scroll): Ditto.
|
||||
(tui_display_main): Call find_pc_line_symtab instead of find_pc_line.
|
||||
|
||||
2014-11-15 Doug Evans <xdje42@gmail.com>
|
||||
|
||||
* symtab.c (expand_symtab_containing_pc): Renamed from
|
||||
|
||||
@@ -410,13 +410,12 @@ gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
|
||||
struct ui_file *stb = mem_fileopen ();
|
||||
struct cleanup *cleanups = make_cleanup_ui_file_delete (stb);
|
||||
struct disassemble_info di = gdb_disassemble_info (gdbarch, stb);
|
||||
/* To collect the instruction outputted from opcodes. */
|
||||
struct symtab *symtab = NULL;
|
||||
struct symtab *symtab;
|
||||
struct linetable_entry *le = NULL;
|
||||
int nlines = -1;
|
||||
|
||||
/* Assume symtab is valid for whole PC range. */
|
||||
symtab = find_pc_symtab (low);
|
||||
symtab = find_pc_line_symtab (low);
|
||||
|
||||
if (symtab != NULL && symtab->linetable != NULL)
|
||||
{
|
||||
|
||||
13
gdb/symtab.c
13
gdb/symtab.c
@@ -2431,6 +2431,19 @@ find_pc_line (CORE_ADDR pc, int notcurrent)
|
||||
pc = overlay_mapped_address (pc, section);
|
||||
return find_pc_sect_line (pc, section, notcurrent);
|
||||
}
|
||||
|
||||
/* See symtab.h. */
|
||||
|
||||
struct symtab *
|
||||
find_pc_line_symtab (CORE_ADDR pc)
|
||||
{
|
||||
struct symtab_and_line sal;
|
||||
|
||||
/* This always passes zero for NOTCURRENT to find_pc_line.
|
||||
There are currently no callers that ever pass non-zero. */
|
||||
sal = find_pc_line (pc, 0);
|
||||
return sal.symtab;
|
||||
}
|
||||
|
||||
/* Find line number LINE in any symtab whose name is the same as
|
||||
SYMTAB.
|
||||
|
||||
@@ -1271,6 +1271,10 @@ extern struct symtab_and_line find_pc_line (CORE_ADDR, int);
|
||||
extern struct symtab_and_line find_pc_sect_line (CORE_ADDR,
|
||||
struct obj_section *, int);
|
||||
|
||||
/* Wrapper around find_pc_line to just return the symtab. */
|
||||
|
||||
extern struct symtab *find_pc_line_symtab (CORE_ADDR);
|
||||
|
||||
/* Given a symtab and line number, return the pc there. */
|
||||
|
||||
extern int find_line_pc (struct symtab *, int, CORE_ADDR *);
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
2014-11-15 Doug Evans <xdje42@gmail.com>
|
||||
|
||||
PR symtab/17559
|
||||
* gdb.base/line-symtabs.exp: New file.
|
||||
* gdb.base/line-symtabs.c: New file.
|
||||
* gdb.base/line-symtabs.h: New file.
|
||||
|
||||
2014-11-14 Yao Qi <yao@codesourcery.com>
|
||||
|
||||
* gdb.dwarf2/dw2-ifort-parameter.c: Remove inline asm.
|
||||
|
||||
25
gdb/testsuite/gdb.base/line-symtabs.c
Normal file
25
gdb/testsuite/gdb.base/line-symtabs.c
Normal file
@@ -0,0 +1,25 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2014 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/>. */
|
||||
|
||||
#include "line-symtabs.h"
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
header_function ();
|
||||
return 0;
|
||||
}
|
||||
33
gdb/testsuite/gdb.base/line-symtabs.exp
Normal file
33
gdb/testsuite/gdb.base/line-symtabs.exp
Normal file
@@ -0,0 +1,33 @@
|
||||
# Test handling of line symbol tables (non-primary symtabs).
|
||||
# Copyright 2014 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/>.
|
||||
|
||||
standard_testfile .c line-symtabs.h
|
||||
|
||||
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
|
||||
return -1
|
||||
}
|
||||
|
||||
if ![runto_main] {
|
||||
fail "Can't run to main"
|
||||
return -1
|
||||
}
|
||||
|
||||
# PR 17559: gdb_disassembly was using the wrong symtab lookup function.
|
||||
# It was expecting the symtab of the source file containing $pc,
|
||||
# instead it was getting the primary symtab of that compilation unit.
|
||||
gdb_breakpoint "$srcfile2:[gdb_get_line_number {break here} $srcfile2]"
|
||||
gdb_continue_to_breakpoint "continue to breakpoint in header"
|
||||
gdb_test "disas /m" "break here.*End of assembler dump\\."
|
||||
24
gdb/testsuite/gdb.base/line-symtabs.h
Normal file
24
gdb/testsuite/gdb.base/line-symtabs.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2014 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/>. */
|
||||
|
||||
int x;
|
||||
|
||||
void
|
||||
header_function (void)
|
||||
{
|
||||
x = 42; /* break here */
|
||||
}
|
||||
@@ -275,7 +275,7 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
|
||||
void
|
||||
tui_show_disassem (struct gdbarch *gdbarch, CORE_ADDR start_addr)
|
||||
{
|
||||
struct symtab *s = find_pc_symtab (start_addr);
|
||||
struct symtab *s = find_pc_line_symtab (start_addr);
|
||||
struct tui_win_info *win_with_focus = tui_win_with_focus ();
|
||||
struct tui_line_or_address val;
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ tui_selected_frame_level_changed_hook (int level)
|
||||
{
|
||||
struct symtab *s;
|
||||
|
||||
s = find_pc_symtab (pc);
|
||||
s = find_pc_line_symtab (pc);
|
||||
/* elz: This if here fixes the problem with the pc not being
|
||||
displayed in the tui asm layout, with no debug symbols. The
|
||||
value of s would be 0 here, and select_source_symtab would
|
||||
|
||||
@@ -357,7 +357,7 @@ tui_vertical_source_scroll (enum tui_scroll_direction scroll_direction,
|
||||
struct symtab_and_line cursal = get_current_source_symtab_and_line ();
|
||||
|
||||
if (cursal.symtab == (struct symtab *) NULL)
|
||||
s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
|
||||
s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
|
||||
else
|
||||
s = cursal.symtab;
|
||||
|
||||
|
||||
@@ -1386,7 +1386,7 @@ make_visible_with_new_height (struct tui_win_info *win_info)
|
||||
struct frame_info *frame = deprecated_safe_get_selected_frame ();
|
||||
struct gdbarch *gdbarch = get_frame_arch (frame);
|
||||
|
||||
s = find_pc_symtab (get_frame_pc (frame));
|
||||
s = find_pc_line_symtab (get_frame_pc (frame));
|
||||
if (win_info->generic.type == SRC_WIN)
|
||||
{
|
||||
line.loa = LOA_LINE;
|
||||
|
||||
@@ -51,12 +51,12 @@ tui_display_main (void)
|
||||
tui_get_begin_asm_address (&gdbarch, &addr);
|
||||
if (addr != (CORE_ADDR) 0)
|
||||
{
|
||||
struct symtab_and_line sal;
|
||||
struct symtab *s;
|
||||
|
||||
tui_update_source_windows_with_addr (gdbarch, addr);
|
||||
sal = find_pc_line (addr, 0);
|
||||
if (sal.symtab)
|
||||
tui_update_locator_fullname (symtab_to_fullname (sal.symtab));
|
||||
s = find_pc_line_symtab (addr);
|
||||
if (s != NULL)
|
||||
tui_update_locator_fullname (symtab_to_fullname (s));
|
||||
else
|
||||
tui_update_locator_fullname ("??");
|
||||
}
|
||||
@@ -331,7 +331,7 @@ tui_horizontal_source_scroll (struct tui_win_info *win_info,
|
||||
= get_current_source_symtab_and_line ();
|
||||
|
||||
if (cursal.symtab == NULL)
|
||||
s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
|
||||
s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
|
||||
else
|
||||
s = cursal.symtab;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user