diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 5 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.c | 62 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.exp | 140 |
5 files changed, 217 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7d6e091..464ae13 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-07-25 Tom de Vries <tdevries@suse.de> + + PR symtab/26243 + * dwarf2/read.c (lnp_state_machine::record_line): Ignore zero line + entries. + 2020-07-24 Aaron Merey <amerey@redhat.com> * Makefile.in: Replace LIBDEBUGINFOD with DEBUGINFOD_LIBS. diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 39ed455..4e70dcc 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -20437,8 +20437,9 @@ lnp_state_machine::record_line (bool end_sequence) bool file_changed = m_last_subfile != m_cu->get_builder ()->get_current_subfile (); bool ignore_this_line - = (file_changed && !end_sequence && m_last_address == m_address - && !m_is_stmt && m_stmt_at_address); + = ((file_changed && !end_sequence && m_last_address == m_address + && !m_is_stmt && m_stmt_at_address) + || (!end_sequence && m_line == 0)); if ((file_changed && !ignore_this_line) || end_sequence) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 29f940e..e65caaf 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-07-25 Tom de Vries <tdevries@suse.de> + + PR symtab/26243 + * gdb.dwarf2/dw2-line-number-zero.c: New test. + * gdb.dwarf2/dw2-line-number-zero.exp: New file. + 2020-07-24 Tom de Vries <tdevries@suse.de> PR testsuite/26293 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.c b/gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.c new file mode 100644 index 0000000..15b37a6 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.c @@ -0,0 +1,62 @@ +/* + Copyright 2020 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/>. */ + +void +foo (int x) +{ + +} + +void +bar1 (void) +{ + asm ("bar1_label: .globl bar1_label"); + foo (1); + asm ("bar1_label_2: .globl bar1_label_2"); + foo (2); + asm ("bar1_label_3: .globl bar1_label_3"); + foo (3); + asm ("bar1_label_4: .globl bar1_label_4"); + foo (4); + asm ("bar1_label_5: .globl bar1_label_5"); +} + +void +bar2 (void) +{ + asm ("bar2_label: .globl bar2_label"); + foo (1); + asm ("bar2_label_2: .globl bar2_label_2"); + foo (2); + asm ("bar2_label_3: .globl bar2_label_3"); + foo (3); + asm ("bar2_label_4: .globl bar2_label_4"); + foo (4); + asm ("bar2_label_5: .globl bar2_label_5"); +} + +int +main (void) +{ + asm ("main_label: .globl main_label"); + + bar1 (); + + bar2 (); + + return 0; +} + diff --git a/gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.exp b/gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.exp new file mode 100644 index 0000000..a39256c --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-line-number-zero.exp @@ -0,0 +1,140 @@ +# Copyright 2020 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]} { + verbose "Skipping dw2-line-number-zero test." + return 0 +} + +# The .c files use __attribute__. +if [get_compiler_info] { + return -1 +} +if !$gcc_compiled { + verbose "Skipping dw2-line-number-zero test." + return 0 +} + +standard_testfile .c dw2-line-number-zero-dw.S + +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + declare_labels Llines + global srcdir subdir srcfile + + cu {} { + compile_unit { + {language @DW_LANG_C} + {name dw2-line-number-zero.c} + {stmt_list $Llines DW_FORM_sec_offset} + } { + subprogram { + {external 1 flag} + {MACRO_AT_func {main}} + } + subprogram { + {external 1 flag} + {MACRO_AT_func {bar1}} + } + subprogram { + {external 1 flag} + {MACRO_AT_func {bar2}} + } + } + } + + lines {version 2} Llines { + include_dir "${srcdir}/${subdir}" + file_name "$srcfile" 1 + + program { + {DW_LNE_set_address bar1_label} + {line 27} + {DW_LNS_copy} + + {DW_LNE_set_address bar1_label_2} + {line 29} + {DW_LNS_copy} + + {DW_LNE_set_address bar1_label_3} + {line 0} + {DW_LNS_copy} + + {DW_LNE_set_address bar1_label_4} + {line 33} + {DW_LNS_copy} + + {DW_LNE_set_address bar1_label_5} + {DW_LNE_end_sequence} + + + {DW_LNE_set_address bar2_label} + {line 41} + {DW_LNS_copy} + + {DW_LNE_set_address bar2_label_2} + {line 43} + {DW_LNS_copy} + + {DW_LNE_set_address bar2_label_3} + {line 0} + {DW_LNS_negate_stmt} + {DW_LNS_copy} + {DW_LNS_negate_stmt} + + {DW_LNE_set_address bar2_label_4} + {line 47} + {DW_LNS_copy} + + {DW_LNE_set_address bar2_label_5} + {DW_LNE_end_sequence} + } + } +} + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_breakpoint "bar1" +gdb_continue_to_breakpoint "bar1" "\[^\r\n\]*:27\r\n.*" + +gdb_test "n" "foo \\(2\\);" "bar1, 1st next" +gdb_test "n" "foo \\(4\\);" "bar1, 2nd next" + +gdb_breakpoint "bar2" +gdb_continue_to_breakpoint "bar2" "\[^\r\n\]*:41\r\n.*" + +gdb_test "n" "foo \\(2\\);" "bar2, 1st next" +gdb_test "n" "foo \\(4\\);" "bar2, 2nd next" + +if ![runto_main] { + return -1 +} + +gdb_breakpoint "bar1_label_3" +setup_kfail "gdb/nnnnn" *-*-* +gdb_continue_to_breakpoint "bar1_label_3" "bar1 \\(\\)" + +gdb_breakpoint "bar2_label_3" +setup_kfail "gdb/nnnnn" *-*-* +gdb_continue_to_breakpoint "bar2_label_3" "bar2 \\(\\)" |