diff options
author | Tom de Vries <tdevries@suse.de> | 2021-11-22 09:14:15 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2021-11-22 09:14:15 +0100 |
commit | 41505c0f3db2247bafde27d372eb461132a8cb3b (patch) | |
tree | c8e0c17bad19f554650524aca40bf633e8b4ea5c /gdb/testsuite/gdb.dwarf2/dw2-lines.exp | |
parent | fc6a93854b3c9520259926891c3a5c559d3545d1 (diff) | |
download | gdb-41505c0f3db2247bafde27d372eb461132a8cb3b.zip gdb-41505c0f3db2247bafde27d372eb461132a8cb3b.tar.gz gdb-41505c0f3db2247bafde27d372eb461132a8cb3b.tar.bz2 |
[gdb/testsuite] Add test-case gdb.dwarf2/dw2-lines.exp
Add a new test-case gdb.dwarf2/dw2-lines.exp that tests various .debug_line
sections.
Tested on x86_64-linux.
Diffstat (limited to 'gdb/testsuite/gdb.dwarf2/dw2-lines.exp')
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-lines.exp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-lines.exp b/gdb/testsuite/gdb.dwarf2/dw2-lines.exp new file mode 100644 index 0000000..cde602f --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-lines.exp @@ -0,0 +1,156 @@ +# Copyright 2021 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/>. + +# Test line number information in various configurations. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +require dwarf2_support 1 + +standard_testfile .c -dw.S + +with_shared_gdb { + set func_info_vars \ + [concat \ + [get_func_info main] \ + [get_func_info bar]] +} + +# Helper function. +proc line_for { l } { + global srcfile + set line [gdb_get_line_number "$l:" $srcfile] + return [expr $line + 1] +} + +# Execute test. +proc test_1 { _cv _cdw64 _lv _ldw64 } { + global srcfile srcfile2 testfile + global cv cdw64 lv ldw64 + set cv $_cv + set cdw64 $_cdw64 + set lv $_lv + set ldw64 $_ldw64 + + set asm_file [standard_output_file $srcfile2] + Dwarf::assemble $asm_file { + declare_labels Llines + global srcdir subdir srcfile cv cdw64 lv ldw64 + global func_info_vars + foreach var $func_info_vars { + global $var + } + + cu { version $cv is_64 $cdw64 } { + compile_unit { + {language @DW_LANG_C} + {name $srcfile} + {stmt_list $Llines DW_FORM_sec_offset} + } { + subprogram { + {external 1 flag} + {name main} + {low_pc $main_start addr} + {high_pc "$main_start + $main_len" addr} + } + subprogram { + {external 1 flag} + {name bar} + {low_pc $bar_start addr} + {high_pc "$bar_start + $bar_len" addr} + } + } + } + + lines [list version $lv is_64 $ldw64] Llines { + include_dir "${srcdir}/${subdir}" + file_name "$srcfile" 1 + + program { + {DW_LNE_set_address bar_label} + {line [line_for bar_label]} + {DW_LNS_copy} + + {DW_LNE_set_address bar_label_2} + {line [line_for bar_label_2]} + {DW_LNS_copy} + + {DW_LNE_set_address bar_label_3} + {line [line_for bar_label_3]} + {DW_LNS_copy} + + {DW_LNE_set_address bar_label_4} + {line [line_for bar_label_4]} + {DW_LNS_copy} + + {DW_LNE_set_address bar_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 "bar" + gdb_continue_to_breakpoint "foo \\(1\\)" + + gdb_test "next" "foo \\(2\\).*" "next to foo (2)" + gdb_test "next" "foo \\(3\\).*" "next to foo (3)" + gdb_test "next" "foo \\(4\\).*" "next to foo (4)" +} + + +# Add unique test prefix. +proc test { cv cdw64 lv ldw64 } { + with_test_prefix cv=$cv { + with_test_prefix cdw=[expr $cdw64 ? 64 : 32] { + with_test_prefix lv=$lv { + with_test_prefix ldw=[expr $ldw64 ? 64 : 32] { + test_1 $cv $cdw64 $lv $ldw64 + } + } + } + } +} + +set cv_low 2 +set cv_high 4 + +set lv_low 2 +set lv_high 3 + +for { set cv $cv_low } { $cv <= $cv_high } { incr cv } { + for { set lv $lv_low } { $lv <= $lv_high } { incr lv } { + # I'm not sure if it makes sense to have a dwarf vx CU with + # a dwarf vx+1 line unit. + if { $lv > $lv } { + continue + } + + foreach cdw64 { 0 1 } { + foreach ldw64 { 0 1 } { + test $cv $cdw64 $lv $ldw64 + } + } + } +} |