summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/count.exp
blob: f930062cd7fa53d53b41f8c4fe7c48f3db9c05dd (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
# Copyright 2014-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/>.

# Tests to cover DW_AT_count attribute in subranges.

load_lib dwarf.exp

# Only run on targets which support dwarf and gas.
if { ![dwarf2_support] } {
    return 0
}

standard_testfile main.c .S

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {{language @DW_LANG_C99}} {
	    declare_labels char_label \
		array_size_type_label long_unsigned_int_label \
		array_label array_label2 static_array_label \
		vla_length_label vla_array_label

	    char_label: base_type {
		{name char}
		{encoding @DW_ATE_signed}
		{byte_size 1 DW_FORM_sdata}
	    }

	    array_size_type_label: base_type {
		{byte_size 8 DW_FORM_sdata}
		{encoding @DW_ATE_unsigned}
		{name __ARRAY_SIZE_TYPE__}
	    }

	    long_unsigned_int_label: base_type {
		{byte_size 8 DW_FORM_sdata}
		{encoding @DW_ATE_unsigned}
		{name "long unsigned int"}
	    }

	    array_label: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {count {DW_OP_lit5} SPECIAL_expr}
		    {type :$char_label}
		}
	    }

	    array_label2: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {count {DW_OP_lit1} SPECIAL_expr}
		    {type :$char_label}
		}
	    }

	    static_array_label: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {count 5 DW_FORM_sdata}
		    {type :$char_label}
		}
	    }

	    vla_length_label:
	    DW_TAG_variable {
		{location
		    {
			lit6
			stack_value
		    } SPECIAL_expr}
		{name "__vla_array_length"}
		{type :$long_unsigned_int_label}
		{artificial 1 DW_FORM_flag_present}
	    }

	    vla_array_label: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {type :$array_size_type_label}
		    {count :$vla_length_label}
		}
	    }

	    DW_TAG_variable {
		{name array2}
		{type :$array_label2}
		{const_value 65 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{name array}
		{type :$array_label}
		{const_value hello DW_FORM_block1}
	    }

	    DW_TAG_variable {
		{name static_array}
		{type :$static_array_label}
		{const_value world DW_FORM_block1}
	    }

	    DW_TAG_variable {
		{name vla_array}
		{type :$vla_array_label}
		{const_value saluton DW_FORM_block1}
	    }
	}
    }
}

if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
	  object {nodebug}] != "" } {
    return -1
}

if { [gdb_compile $asm_file ${binfile}2.o object {nodebug}] != "" } {
    return -1
}

if { [gdb_compile [list ${binfile}1.o ${binfile}2.o] \
	  "${binfile}" executable {}] != "" } {
    return -1
}

global GDBFLAGS
set saved_gdbflags $GDBFLAGS
set GDBFLAGS [concat $GDBFLAGS " -readnow"]
clean_restart ${testfile}
set GDBFLAGS $saved_gdbflags

if ![runto_main] {
    return -1
}

gdb_test "ptype array" "type = char \\\[5\\\]"
gdb_test "whatis array" "type = char \\\[5\\\]"
gdb_test "print array" " = \"hello\""
gdb_test "print sizeof array" " = 5"

gdb_test "ptype array2" "type = char \\\[1\\\]"
gdb_test "whatis array2" "type = char \\\[1\\\]"
gdb_test "print array2" " = \"A\""
gdb_test "print sizeof array2" " = 1"

gdb_test "ptype static_array" "type = char \\\[5\\\]"
gdb_test "whatis static_array" "type = char \\\[5\\\]"
gdb_test "print static_array" " = \"world\""
gdb_test "print sizeof static_array" " = 5"

gdb_test "ptype vla_array" "type = char \\\[6\\\]"
gdb_test "whatis vla_array" "type = char \\\[6\\\]"
gdb_test "print vla_array" " = \"saluto\""
gdb_test "print sizeof vla_array" " = 6"