aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
blob: 501f1290c3b1e893bec7beaa614875472f12ee09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# 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/>.
load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0
}

standard_testfile dynarr-ptr.c dynarr-ptr-dw.S

# We need to know the size of integer and address types in order
# to write some of the debugging info we'd like to generate.
#
# For that, we ask GDB by debugging our dynarr-ptr.c program.
# Any program would do, but since we already have dynarr-ptr.c
# specifically for this testcase, might as well use that.

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
    untested ${testfile}.exp
    return -1
}

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
 	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_Ada95}
                {DW_AT_name     foo.adb}
                {DW_AT_comp_dir /tmp}
        } {
            declare_labels integer_label array_label array_ptr_label \
                array_typedef_label
            set ptr_size [get_sizeof "void *" 96]

            integer_label: DW_TAG_base_type {
                {DW_AT_byte_size 4 DW_FORM_sdata}
                {DW_AT_encoding  @DW_ATE_signed}
                {DW_AT_name      integer}
            }

	    array_label: DW_TAG_array_type {
		{DW_AT_name foo__array_type}
		{DW_AT_type :$integer_label}
                {external 1 flag}
	    } {
		DW_TAG_subrange_type {
		    {DW_AT_type        :$integer_label}
                    {DW_AT_lower_bound {
                        DW_OP_push_object_address
                        DW_OP_lit8
                        DW_OP_minus
                        DW_OP_deref_size 4
                    } SPECIAL_expr}
                    {DW_AT_upper_bound {
                        DW_OP_push_object_address
                        DW_OP_lit4
                        DW_OP_minus
                        DW_OP_deref_size 4
                    } SPECIAL_expr}
		}
	    }
            array_ptr_label: DW_TAG_pointer_type {
                {DW_AT_byte_size :$ptr_size }
                {DW_AT_type :$array_label}
            }
            array_typedef_label: DW_TAG_typedef {
                {DW_AT_name "foo__array_ptr"}
                {DW_AT_type :$array_ptr_label}
            }
            DW_TAG_variable {
                {DW_AT_name foo__three_ptr}
                {DW_AT_type :$array_ptr_label}
                {DW_AT_location {
                    DW_OP_addr table_1_ptr
                } SPECIAL_expr}
                {external 1 flag}
            }
            DW_TAG_variable {
                {DW_AT_name foo__three_ptr_tdef}
                {DW_AT_type :$array_typedef_label}
                {DW_AT_location {
                    DW_OP_addr table_1_ptr
                } SPECIAL_expr}
                {external 1 flag}
            }
            DW_TAG_variable {
                {DW_AT_name foo__five_ptr}
                {DW_AT_type :$array_ptr_label}
                {DW_AT_location {
                    DW_OP_addr table_2_ptr
                } SPECIAL_expr}
                {external 1 flag}
            }
            DW_TAG_variable {
                {DW_AT_name foo__five_ptr_tdef}
                {DW_AT_type :$array_typedef_label}
                {DW_AT_location {
                    DW_OP_addr table_2_ptr
                } SPECIAL_expr}
                {external 1 flag}
            }
	}
    }
}

# Now that we've generated the DWARF debugging info, rebuild our
# program using our debug info instead of the info generated by
# the compiler.

if { [prepare_for_testing ${testfile}.exp ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

if ![runto_main] {
    return -1
}

gdb_test_no_output "set language ada"

# foo.three_ptr.all

gdb_test "print foo.three_ptr.all" \
         " = \\(1, 2, 3\\)"

# foo.three_ptr_tdef.all

gdb_test "print foo.three_ptr_tdef.all" \
         " = \\(1, 2, 3\\)"

# foo.five_ptr.all

gdb_test "print foo.five_ptr.all" \
         " = \\(2 => 5, 8, 13, 21, 34\\)"

# foo.five_ptr_tdef.all

gdb_test "print foo.five_ptr_tdef.all" \
         " = \\(2 => 5, 8, 13, 21, 34\\)"