summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/nonvar-access.exp
blob: 714d33155e3284c2c0faf83834411a198aff4cdc (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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# Copyright 2016-2022 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 accessing "non-variable" variables, i.e., variables which are
# optimized to a constant DWARF location expression and/or
# partially/fully optimized out.

load_lib dwarf.exp

if {![dwarf2_support]} { return 0 }

standard_testfile main.c -dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]

Dwarf::assemble $asm_file {
    global srcfile

    cu {} {
	compile_unit {
	    {DW_AT_name $srcfile}
	} {
	    declare_labels int_type_label char_type_label \
		struct_s_label struct_t_label array_a9_label \
		char_ptr_label implicit_a_label stack_b_label

	    int_type_label: base_type {
		{name "int"}
		{encoding @DW_ATE_signed}
		{byte_size 4 DW_FORM_sdata}
	    }
	    char_type_label: base_type {
		{name "char"}
		{encoding @DW_ATE_unsigned}
		{byte_size 1 DW_FORM_sdata}
	    }
	    char_ptr_label: pointer_type {
		{type :$char_type_label}
	    }

	    struct_s_label: structure_type {
		{name s}
		{byte_size 4 DW_FORM_sdata}
	    } {
		member {
		    {name a}
		    {type :$int_type_label}
		    {data_member_location 0 DW_FORM_udata}
		    {bit_size 8 DW_FORM_udata}
		}
		member {
		    {name b}
		    {type :$int_type_label}
		    {data_bit_offset 8 DW_FORM_udata}
		    {bit_size 24 DW_FORM_udata}
		}
	    }

	    struct_t_label: structure_type {
		{name t}
		{byte_size 4 DW_FORM_sdata}
	    } {
		member {
		    {name a}
		    {type :$int_type_label}
		    {data_member_location 0 DW_FORM_udata}
		    {bit_size 9 DW_FORM_udata}
		}
		member {
		    {name b}
		    {type :$int_type_label}
		    {data_bit_offset 9 DW_FORM_udata}
		    {bit_size 23 DW_FORM_udata}
		}
	    }

	    array_a9_label: array_type {
		{type :$char_type_label}
	    } {
		subrange_type {
		    {type :$int_type_label}
		    {upper_bound 8 DW_FORM_udata}
		}
	    }

	    DW_TAG_subprogram {
		{MACRO_AT_func {main}}
		{DW_AT_external 1 flag}
	    } {
		# Simple variable without location.
		DW_TAG_variable {
		    {name undef_int}
		    {type :$int_type_label}
		}
		# Struct variable without location.
		DW_TAG_variable {
		    {name undef_s}
		    {type :$struct_s_label}
		}
		# Composite location: byte-aligned pieces.
		DW_TAG_variable {
		    {name def_s}
		    {type :$struct_s_label}
		    {location {
			const1u 0
			stack_value
			bit_piece 8 0
			const1s -1
			stack_value
			bit_piece 24 0
		    } SPECIAL_expr}
		}
		# Composite location: non-byte-aligned pieces.
		DW_TAG_variable {
		    {name def_t}
		    {type :$struct_t_label}
		    {location {
			const2s -184
			stack_value
			bit_piece 9 0
			const4u 1752286
			stack_value
			bit_piece 23 0
		    } SPECIAL_expr}
		}
		# Composite location with some empty pieces.
		DW_TAG_variable {
		    {name part_def_a}
		    {type :$array_a9_label}
		    {location {
			piece 3
			const4u 0xf1927314
			stack_value
			piece 4
			piece 2
		    } SPECIAL_expr}
		}
		# Implicit location: immediate value.
		DW_TAG_variable {
		    {name def_implicit_s}
		    {type :$struct_s_label}
		    {location {
			implicit_value 0x12 0x34 0x56 0x78
		    } SPECIAL_expr}
		}
		# Implicit location: immediate value for whole array, with
		# excess bytes.
		implicit_a_label: DW_TAG_variable {
		    {name def_implicit_a}
		    {type :$array_a9_label}
		    {location {
			implicit_value 0x1 0x12 0x23 0x34 0x45 \
			    0x56 0x67 0x78 0x89 0x9a 0xab
		    } SPECIAL_expr}
		}
		# Implicit pointer into immediate value.
		DW_TAG_variable {
		    {name implicit_a_ptr}
		    {type :$char_ptr_label}
		    {location {
			implicit_pointer $implicit_a_label 5
		    } SPECIAL_expr}
		}
		# Stack-value location.
		stack_b_label: DW_TAG_variable {
		    {name def_stack_b}
		    {type :$struct_t_label}
		    {location {
			const4u 0x1a2b3c4d
			stack_value
		    } SPECIAL_expr}
		}
		# Implicit pointer into stack value.
		DW_TAG_variable {
		    {name implicit_b_ptr}
		    {type :$char_ptr_label}
		    {location {
			implicit_pointer $stack_b_label 1
		    } SPECIAL_expr}
		}
	    }
	}
    }
}

if { [prepare_for_testing "failed to prepare" ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

if ![runto_main] {
    return -1
}

# Determine byte order.
set endian [get_endianness]

# Byte-aligned objects with simple location descriptions.
switch $endian { big {set val 0x345678} little {set val 0x785634} }
gdb_test "print/x def_implicit_s" " = \\{a = 0x12, b = $val\\}"
gdb_test "print/x def_implicit_s.b" " = $val"
gdb_test "print/x def_implicit_a" \
    " = \\{0x1, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89\\}"
gdb_test "print/x def_implicit_a\[5\]" " = 0x56"
gdb_test "print/x *(char (*)\[5\]) implicit_a_ptr" \
    " = \\{0x56, 0x67, 0x78, 0x89, 0x9a\\}"
switch $endian {
    big {set val "a = 52, b = 2833485"}
    little {set val "a = 77, b = 857502"}
}
gdb_test "print def_stack_b" " = \\{$val\\}"
switch $endian {big {set val 0x2b} little {set val 0x3c}}
gdb_test "print/x *implicit_b_ptr" " = $val"

# Byte-aligned fields, pieced together from DWARF stack values.
gdb_test "print def_s" " = \\{a = 0, b = -1\\}"
switch $endian { big {set val 0x92} little {set val 0x73} }
gdb_test "print/x part_def_a\[4\]" " = $val"
gdb_test "print/x part_def_a\[8\]" " = <optimized out>"

# Non-byte-aligned fields, pieced together from DWARF stack values.
gdb_test "print def_t" " = \\{a = -184, b = 1752286\\}"

# Simple variable without location.
gdb_test "print undef_int" " = <optimized out>"

# Member of a structure without location.
gdb_test "print undef_s.a" " = <optimized out>"