1# Copyright 2019-2020 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# Test -symbol-info-modules, listing Fortran modules.
17
18load_lib fortran.exp
19load_lib mi-support.exp
20set MIFLAGS "-i=mi"
21
22standard_testfile "mi-fortran-modules.f90" "mi-fortran-modules-2.f90"
23
24if {[prepare_for_testing "failed to prepare" ${testfile} \
25	 [list $srcfile2 $srcfile] {debug f90}]} {
26    return -1
27}
28
29gdb_exit
30if {[mi_gdb_start]} {
31    continue
32}
33
34mi_run_to_main
35
36
37# Patterns to skip optional system modules that appear with later versions of GFortran.
38set system_modules_pattern \
39    "\{filename=\"\[^\"\]+/ieee/\[^/\]+\.F90\",fullname=\"\[^\"\]+\",symbols=\\\[(\[^\]\]+)\\\]\},"
40set system_module_symbols_pattern \
41    "\{module=\"\[^\"\]*ieee\[^\"\]*\",files=\\\[\{filename=\"\[^\"\]+\",fullname=\"\[^\"\]+\",symbols=\\\[\[^\]\]+\\\]\}\\\]\},"
42
43mi_gdb_test "101-symbol-info-modules" \
44    "101\\^done,symbols=\{debug=\\\[($system_modules_pattern)*\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"16\",name=\"mod1\"\},\{line=\"27\",name=\"mod2\"\}\\\]\},\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"16\",name=\"mod3\"\},\{line=\"32\",name=\"modmany\"\},\{line=\"41\",name=\"moduse\"\}\\\]\}\\\]\}" \
45    "-symbol-info-modules"
46
47mi_gdb_test "102-symbol-info-modules --name mod\[123\]" \
48    "102\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"16\",name=\"mod1\"\},\{line=\"27\",name=\"mod2\"\}\\\]\},\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"16\",name=\"mod3\"\}\\\]\}\\\]\}" \
49    "-symbol-info-modules --name mod\[123\]"
50
51mi_gdb_test "103-symbol-info-modules --name moduse" \
52    "103\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"41\",name=\"moduse\"\}\\\]\}\\\]\}" \
53    "-symbol-info-modules --name moduse"
54
55set test "-symbol-info-module-functions"
56set cmd "104-symbol-info-module-functions"
57set mod1_re \
58    "\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"mod1::check_all\",type=\"void \\(void\\)\",description=\"void mod1::check_all\\(void\\);\"\}\\\]\}\\\]\}"
59set mod2_re \
60    "\{module=\"mod2\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"30\",name=\"mod2::check_var_i\",type=\"void \\(void\\)\",description=\"void mod2::check_var_i\\(void\\);\"\}\\\]\}\\\]\}"
61set mod3_re \
62    "\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"21\",name=\"mod3::check_all\",type=\"void \\(void\\)\",description=\"void mod3::check_all\\(void\\);\"\},\{line=\"27\",name=\"mod3::check_mod2\",type=\"void \\(void\\)\",description=\"void mod3::check_mod2\\(void\\);\"\}\\\]\}\\\]\}"
63set modmany_re \
64    "\{module=\"modmany\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"35\",name=\"modmany::check_some\",type=\"void \\(void\\)\",description=\"void modmany::check_some\\(void\\);\"\}\\\]\}\\\]\}"
65set moduse_re \
66    "\{module=\"moduse\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"44\",name=\"moduse::check_all\",type=\"void \\(void\\)\",description=\"void moduse::check_all\\(void\\);\"\},\{line=\"49\",name=\"moduse::check_var_x\",type=\"void \\(void\\)\",description=\"void moduse::check_var_x\\(void\\);\"\}\\\]\}\\\]\}"
67set state 0
68gdb_test_multiple $cmd $test -prompt $mi_gdb_prompt$ {
69    -re "104\\^done,symbols=\\\[" {
70	if { $state == 0 } { set state 1 }
71	exp_continue
72    }
73    -re "$mod1_re" {
74	if { $state == 1 } { incr state }
75	exp_continue
76    }
77    -re "$mod2_re" {
78	if { $state == 2 } { incr state }
79	exp_continue
80    }
81    -re "$mod3_re" {
82	if { $state == 3 } { incr state }
83	exp_continue
84    }
85    -re "$modmany_re" {
86	if { $state == 4 } { incr state }
87	exp_continue
88    }
89    -re "$moduse_re" {
90	if { $state == 5 } { incr state }
91	exp_continue
92    }
93    -re ${system_module_symbols_pattern} {
94	exp_continue
95    }
96    -re "\\\]\r\n$mi_gdb_prompt$" {
97	if { $state == 6 } {
98	    pass $gdb_test_name
99	} else {
100	    fail $gdb_test_name
101	}
102    }
103}
104
105mi_gdb_test "105-symbol-info-module-functions --name _all" \
106    "105\\^done,symbols=\\\[\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"mod1::check_all\",type=\"void \\(void\\)\",description=\"void mod1::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"21\",name=\"mod3::check_all\",type=\"void \\(void\\)\",description=\"void mod3::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"moduse\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"44\",name=\"moduse::check_all\",type=\"void \\(void\\)\",description=\"void moduse::check_all\\(void\\);\"\}\\\]\}\\\]\}\\\]" \
107    "-symbol-info-module-functions --name _all"
108
109mi_gdb_test "106-symbol-info-module-functions --module mod\[123\]" \
110    "106\\^done,symbols=\\\[\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"mod1::check_all\",type=\"void \\(void\\)\",description=\"void mod1::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod2\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"30\",name=\"mod2::check_var_i\",type=\"void \\(void\\)\",description=\"void mod2::check_var_i\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"21\",name=\"mod3::check_all\",type=\"void \\(void\\)\",description=\"void mod3::check_all\\(void\\);\"\},\{line=\"27\",name=\"mod3::check_mod2\",type=\"void \\(void\\)\",description=\"void mod3::check_mod2\\(void\\);\"\}\\\]\}\\\]\}\\\]" \
111    "-symbol-info-module-functions --module mod\[123\]"
112
113set int4 [fortran_int4]
114
115set mod1_re \
116    "\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"18\",name=\"mod1::var_const\",type=\"$int4\",description=\"$int4 mod1::var_const;\"\},\{line=\"17\",name=\"mod1::var_i\",type=\"$int4\",description=\"$int4 mod1::var_i;\"\}\\\]\}\\\]\}"
117set mod2_re \
118    "\{module=\"mod2\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"28\",name=\"mod2::var_i\",type=\"$int4\",description=\"$int4 mod2::var_i;\"\}\\\]\}\\\]\}"
119set mod3_re \
120    "\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"18\",name=\"mod3::mod1\",type=\"$int4\",description=\"$int4 mod3::mod1;\"\},\{line=\"17\",name=\"mod3::mod2\",type=\"$int4\",description=\"$int4 mod3::mod2;\"\},\{line=\"19\",name=\"mod3::var_i\",type=\"$int4\",description=\"$int4 mod3::var_i;\"\}\\\]\}\\\]\}"
121set modmany_re \
122    "\{module=\"modmany\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"33\",name=\"modmany::var_a\",type=\"$int4\",description=\"$int4 modmany::var_a;\"\},\{line=\"33\",name=\"modmany::var_b\",type=\"$int4\",description=\"$int4 modmany::var_b;\"\},\{line=\"33\",name=\"modmany::var_c\",type=\"$int4\",description=\"$int4 modmany::var_c;\"\},\{line=\"33\",name=\"modmany::var_i\",type=\"$int4\",description=\"$int4 modmany::var_i;\"\}\\\]\}\\\]\}"
123set moduse_re \
124    ",\{module=\"moduse\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"42\",name=\"moduse::var_x\",type=\"$int4\",description=\"$int4 moduse::var_x;\"\},\{line=\"42\",name=\"moduse::var_y\",type=\"$int4\",description=\"$int4 moduse::var_y;\"\}\\\]\}\\\]\}"
125
126set cmd "107-symbol-info-module-variables"
127set test "-symbol-info-module-variables"
128set state 0
129gdb_test_multiple $cmd $test -prompt $mi_gdb_prompt$ {
130    -re "107\\^done,symbols=\\\[" {
131	if { $state == 0 } { set state 1 }
132	exp_continue
133    }
134    -re "$mod1_re" {
135	if { $state == 1 } { incr state }
136	exp_continue
137    }
138    -re "$mod2_re" {
139	if { $state == 2 } { incr state }
140	exp_continue
141    }
142    -re "$mod3_re" {
143	if { $state == 3 } { incr state }
144	exp_continue
145    }
146    -re "$modmany_re" {
147	if { $state == 4 } { incr state }
148	exp_continue
149    }
150    -re "$moduse_re" {
151	if { $state == 5 } { incr state }
152	exp_continue
153    }
154    -re ${system_module_symbols_pattern} {
155	exp_continue
156    }
157    -re "\\\]\r\n$mi_gdb_prompt$" {
158	if { $state == 6 } {
159	    pass $gdb_test_name
160	} else {
161	    fail $gdb_test_name
162	}
163    }
164}
165