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
|
# Copyright 2017-2024 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.
require dwarf2_support
standard_testfile main.c -dw.S
# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
global pair
cu { addr_size 4 } {
compile_unit {} {
declare_labels int_label ushort_label struct_label struct_label_2
int_label: DW_TAG_base_type {
{DW_AT_byte_size 4 DW_FORM_udata}
{DW_AT_encoding @DW_ATE_unsigned}
{DW_AT_name "myint"}
}
ushort_label: DW_TAG_base_type {
{DW_AT_byte_size 2 DW_FORM_udata}
{DW_AT_encoding @DW_ATE_unsigned}
{DW_AT_name "myushort"}
}
struct_label: DW_TAG_structure_type {
{DW_AT_name "S"}
{DW_AT_byte_size 8 DW_FORM_udata}
} {
DW_TAG_member {
{DW_AT_name "a"}
{DW_AT_type :${int_label}}
{DW_AT_data_member_location 0 DW_FORM_udata}
}
DW_TAG_member {
{DW_AT_name "b"}
{DW_AT_type :${ushort_label}}
{DW_AT_data_member_location 4 DW_FORM_udata}
}
}
struct_label_2: DW_TAG_structure_type {
{DW_AT_name "S_2"}
{DW_AT_byte_size 6 DW_FORM_udata}
} {
DW_TAG_member {
{DW_AT_name "a"}
{DW_AT_type :${int_label}}
{DW_AT_data_member_location 0 DW_FORM_udata}
}
DW_TAG_member {
{DW_AT_name "b"}
{DW_AT_type :${ushort_label}}
{DW_AT_data_member_location 4 DW_FORM_udata}
}
}
DW_TAG_variable {
{DW_AT_name "s1"}
{DW_AT_type :${struct_label}}
{DW_AT_external 1 DW_FORM_flag}
{DW_AT_location {
DW_OP_constu 1
DW_OP_stack_value
DW_OP_piece 4
DW_OP_constu 0
DW_OP_stack_value
DW_OP_piece 2
} SPECIAL_expr}
}
DW_TAG_variable {
{DW_AT_name "s2"}
{DW_AT_type :${struct_label}}
{DW_AT_external 1 DW_FORM_flag}
{DW_AT_location {
DW_OP_constu 1
DW_OP_stack_value
DW_OP_piece 4
DW_OP_constu 0
DW_OP_stack_value
DW_OP_piece 8
} SPECIAL_expr}
}
DW_TAG_variable {
{DW_AT_name "s3"}
{DW_AT_type :${struct_label_2}}
{DW_AT_external 1 DW_FORM_flag}
{DW_AT_location {
DW_OP_constu 0
DW_OP_stack_value
DW_OP_piece 4
DW_OP_constu 1
DW_OP_stack_value
DW_OP_piece 2
} SPECIAL_expr}
}
}
}
}
if { [prepare_for_testing "failed to prepare" ${testfile} \
[list $srcfile $asm_file] {nodebug}] } {
return -1
}
gdb_test "p s1" " = {a = 1, b = 0}"
gdb_test "p s2" \
"access outside bounds of object referenced via synthetic pointer"
# When fetching a lazy value, GDB typically tries to fetch the 'full'
# object based on the enclosing type. GDB does not support the reading
# of a pieced value with a (possibly larger) enclosing type. However,
# the user may want to print a value casted to a different type,
# e.g. print (<type> []) <variable>. This cast causes an update of the
# value's type. In case of a pieced value, GDB failed to fetch the
# value's content.
# This test verifies that GDB can print a pieced value casted to a
# different type.
gdb_test "p (int \[\]) s1" " = \\{1, <optimized out>\\}"
gdb_test "p (short \[\]) s1" " = \\{1, 0, 0, <optimized out>\\}"
# Test for correct output if the size of the original object is not a
# multiple of the array's element size.
gdb_test "p s3" " = {a = 0, b = 1}"
gdb_test "p (int \[\]) s3" [multi_line \
"warning: array element type size does not divide object size in cast" \
"\\$\\d = \\{0\\}"]
|