Add translations for various sub-directories
[binutils-gdb.git] / gdb / testsuite / gdb.dwarf2 / rnglists-multiple-cus.exp
blob21161eb43a7c687a5e8c7c2433bcb3bf482c4ac3
1 # Copyright 2020-2024 Free Software Foundation, Inc.
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 3 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 # Test to reproduce the crash described in PR 26813.
18 # When reading a list in any table in the .debug_rnglists section, GDB would
19 # read the header at offset 0 in the section (the header of the first table).
20 # When the index of the list we read was greater than the number of lists of
21 # the first table, GDB would erroneously report that the index is invalid.
23 # So this test creates a .debug_rnglists section with two tables.  The second
24 # table has more lists than the first one and we try to read a high index in
25 # the second table.
27 load_lib dwarf.exp
29 require dwarf2_support
31 # Test with 32-bit and 64-bit DWARF.
32 foreach_with_prefix is_64 {false true} {
33     if { $is_64 } {
34         standard_testfile main.c -dw64.S
35         set testfile ${testfile}-dw64
36     } else {
37         standard_testfile main.c -dw32.S
38         set testfile ${testfile}-dw32
39     }
41     set asm_file [standard_output_file $srcfile2]
42     Dwarf::assemble $asm_file {
43         global is_64
45         # The CU uses the DW_FORM_rnglistx form to refer to the .debug_rnglists
46         # section.
47         cu {
48             version 5
49             is_64 $is_64
50         } {
51             DW_TAG_compile_unit {
52                 {DW_AT_ranges 1 DW_FORM_rnglistx}
53                 {DW_AT_rnglists_base cu_table DW_FORM_sec_offset}
54             } {
55                 # This tests a DW_AT_ranges attribute of form DW_FORM_rnglistx on a
56                 # function, which was buggy at some point.
57                 DW_TAG_subprogram {
58                     {DW_AT_name "foo"}
59                     {DW_AT_ranges 2 DW_FORM_rnglistx}
60                 }
61             }
62         }
64         rnglists {is-64 $is_64} {
65             # This table is unused, but exists so that the used table is not at
66             # the beginning of the section.
67             table {} {
68                 list_ {
69                     start_end 0x1000 0x2000
70                 }
71             }
73             # The lists in this table are accessed by index (DW_FORM_rnglistx).
74             table {post-header-label cu_table} {
75                 # This list is unused, but exists to offset the next ones.
76                 list_ {
77                     start_end 0x2000 0x3000
78                 }
80                 # For the CU.
81                 list_ {
82                     start_end 0x3000 0x4000
83                 }
85                 # For function foo.
86                 list_ {
87                     start_end 0x3000 0x3010
88                 }
89             }
90         }
91     }
93     if { [prepare_for_testing "failed to prepare" ${testfile} \
94               [list $srcfile $asm_file] {nodebug}] } {
95         return -1
96     }
98     # Sanity checks to make sure GDB slurped the symbols correctly.
99     gdb_test "p/x &foo" " = 0x3000"