summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.mi/mi-sym-info.exp
blob: 4a65bd6ee5dc833eee575133655a910a5a70bb09 (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
# Copyright 2019 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 -symbol-info-functions, -symbol-info-variables, and
# -symbol-info-types.

load_lib mi-support.exp
set MIFLAGS "-i=mi"

standard_testfile mi-sym-info-1.c mi-sym-info-2.c

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

gdb_exit
if {[mi_gdb_start]} {
    continue
}

mi_run_to_main

set qstr "\"\[^\"\]+\""
set fun_re "\{line=\"$decimal\",name=${qstr},type=${qstr},description=${qstr}\}"
set type_re "\{(?:line=\"$decimal\",)*name=${qstr}\}"
set sym_list "\\\[${fun_re}(?:,$fun_re)*\\\]"
set type_sym_list "\\\[${type_re}(?:,$type_re)*\\\]"
set symtab_re \
    "\{filename=${qstr},fullname=${qstr},symbols=${sym_list}\}"
set symtab_type_re \
    "\{filename=${qstr},fullname=${qstr},symbols=${type_sym_list}\}"
set debug_only_syms \
    "symbols=\{debug=\\\[${symtab_re}(?:,${symtab_re})*\\\]\}"
set all_syms \
    "symbols=\{debug=\\\[${symtab_re}(?:,${symtab_re})*\\\],nondebug=\\\[.*\\\]\}"
set type_syms \
    "symbols=\{debug=\\\[${symtab_type_re}(?:,${symtab_type_re})*\\\]\}"

# Fetch all functions, variables and types without any non-debug
# symbols.
mi_gdb_test "111-symbol-info-functions" \
    "111\\^done,${debug_only_syms}" \
    "List all functions from debug information only"

mi_gdb_test "112-symbol-info-variables" \
    "112\\^done,${debug_only_syms}" \
    "List all variables from debug information only"

mi_gdb_test "113-symbol-info-types" \
    "113\\^done,${type_syms}" \
    "List all types"

# Fetch functions and variables but also grab the non-debug symbols
# (from the symbol table).  There's often so much output output from
# this command that we overflow expect's buffers, avoid this by
# fetching the output piece by piece.
set testname "List all functions"
gdb_test_multiple "114-symbol-info-functions --include-nondebug" ${testname} {
    -re "114\\^done,symbols=\{debug=\\\[${symtab_re}(?:,${symtab_re})*\\\],nondebug=\\\[" {
	exp_continue
    }

    -re "\{address=${qstr},name=${qstr}\}," {
	exp_continue
    }

    -re "\{address=${qstr},name=${qstr}\}\\\]\}\r\n${mi_gdb_prompt}$" {
	pass ${testname}
    }
}

set testname "List all variables"
gdb_test_multiple "115-symbol-info-variables --include-nondebug" ${testname} {
    -re "115\\^done,symbols=\{debug=\\\[${symtab_re}(?:,${symtab_re})*\\\],nondebug=\\\[" {
	verbose -log "Got the first part of the input"
	exp_continue
    }

    -re "\{address=${qstr},name=${qstr}\}," {
	exp_continue
    }

    -re "\{address=${qstr},name=${qstr}\}\\\]\}\r\n${mi_gdb_prompt}$" {
	pass ${testname}
    }
}

# Filter functions by name and type.
set lineno [gdb_get_line_number "f3 (another_int_t arg)" ${srcfile2}]
mi_gdb_test "116-symbol-info-functions --name f3" \
    "116\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"39\",name=\"f3\",type=\"int \\(another_int_t\\)\",description=\"int f3\\(another_int_t\\);\"\}\\\]\}\\\]\}" \
    "List all functions matching pattern f3"

set lineno [gdb_get_line_number "f4 (int *arg)" ${srcfile}]
mi_gdb_test "117-symbol-info-functions --type void" \
    "117\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"36\",name=\"f4\",type=\"void \\(int \\*\\)\",description=\"void f4\\(int \\*\\);\"\}\\\]\}\\\]\}" \
    "List all functions matching type void"

# Filter variables by name and type.
set lineno [gdb_get_line_number "int global_f2;" ${srcfile2}]
mi_gdb_test "118-symbol-info-variables --name global_f2" \
    "118\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"global_f2\",type=\"int\",description=\"int global_f2;\"\}\\\]\}\\\]\}" \
    "List all variables matching pattern global_f2"

set lineno1 [gdb_get_line_number "static float global_f1;" ${srcfile}]
set lineno2 [gdb_get_line_number "static float global_f1;" ${srcfile2}]
mi_gdb_test "119-symbol-info-variables --type float" \
    "119\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"25\",name=\"global_f1\",type=\"float\",description=\"static float global_f1;\"\}\\\]\},\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"19\",name=\"global_f1\",type=\"float\",description=\"static float global_f1;\"\}\\\]\}\\\]\}" \
    "List all variables matching type float"

# Fetch types, filtering by name.
set lineno1 [gdb_get_line_number "typedef int my_int_t;" ${srcfile}]
set lineno2 [gdb_get_line_number "typedef int another_int_t;" ${srcfile2}]
mi_gdb_test "120-symbol-info-types --name _int_" \
    "120\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"27\",name=\"my_int_t\"\}\\\]\},\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"23\",name=\"another_int_t\"\}\\\]\}\\\]\}" \
    "List all types matching _int_"

# Test the --max-results parameter.
mi_gdb_test "121-symbol-info-functions --max-results 0" \
    "121\\^done,symbols=\{\}" \
    "-symbol-info-functions --max-results 0"

mi_gdb_test "122-symbol-info-functions --max-results 1" \
    "122\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"39\",name=\"f3\",type=\"int \\(another_int_t\\)\",description=\"int f3\\(another_int_t\\);\"\}\\\]\}\\\]\}" \
    "-symbol-info-functions --max-results 1"

mi_gdb_test "123-symbol-info-functions --max-results 2" \
    "123\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"33\",name=\"f2\",type=\"float \\(another_float_t\\)\",description=\"float f2\\(another_float_t\\);\"\},\{line=\"39\",name=\"f3\",type=\"int \\(another_int_t\\)\",description=\"int f3\\(another_int_t\\);\"\}\\\]\}\\\]\}" \
    "-symbol-info-functions --max-results 2"

mi_gdb_test "124-symbol-info-variables --max-results 3" \
    "124\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"global_f2\",type=\"int\",description=\"int global_f2;\"\},\{line=\"20\",name=\"global_i2\",type=\"int\",description=\"int global_i2;\"\},\{line=\"19\",name=\"global_f1\",type=\"float\",description=\"static float global_f1;\"\}\\\]\}\\\]\}" \
    "-symbol-info-variables --max-results 3"

mi_gdb_test "125-symbol-info-types --max-results 4" \
    "125\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"24\",name=\"another_float_t\"\},\{line=\"23\",name=\"another_int_t\"\},\{name=\"float\"\},\{name=\"int\"\}\\\]\}\\\]\}" \
    "-symbol-info-types --max-results 4"