[2/2] gdb/fortran: Allow for matching symbols with missing scope
Commit Message
This commit allows symbol matching within Fortran code without having
to specify all of the symbol's scope. For example, given this Fortran
code:
module aaa
contains
subroutine foo
print *, "hello."
end subroutine foo
end module aaa
subroutine foo
print *, "hello."
end subroutine foo
program test
call foo
contains
subroutine foo
print *, "hello."
end subroutine foo
subroutine bar
use aaa
call foo
end subroutine bar
end program test
The user can now do this:
(gdb) b foo
Breakpoint 1 at 0x4006c2: foo. (3 locations)
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x00000000004006c2 in aaa::foo at nest.f90:4
1.2 y 0x0000000000400730 in foo at nest.f90:9
1.3 y 0x00000000004007c3 in test::foo at nest.f90:16
The user asks for a breakpoint on 'foo' and is given a breakpoint on
all three possible 'foo' locations. The user is, of course, still
able to specify the scope in order to place a single breakpoint on
just one of the foo functions (or use 'break -qualified foo' to break
on just the global foo).
gdb/ChangeLog:
* f-lang.c (f_language_defn): Use cp_get_symbol_name_matcher and
cp_search_name_hash.
gdb/testsuite/ChangeLog:
* gdb.fortran/nested-funcs-2.exp: Run tests with and without the
nested function prefix.
---
gdb/ChangeLog | 5 +++++
gdb/f-lang.c | 4 ++--
gdb/testsuite/ChangeLog | 5 +++++
gdb/testsuite/gdb.fortran/nested-funcs-2.exp | 11 +----------
4 files changed, 13 insertions(+), 12 deletions(-)
Comments
On 2019-09-03 5:39 p.m., Andrew Burgess wrote:
> This commit allows symbol matching within Fortran code without having
> to specify all of the symbol's scope. For example, given this Fortran
> code:
>
> module aaa
> contains
> subroutine foo
> print *, "hello."
> end subroutine foo
> end module aaa
>
> subroutine foo
> print *, "hello."
> end subroutine foo
>
> program test
> call foo
> contains
> subroutine foo
> print *, "hello."
> end subroutine foo
>
> subroutine bar
> use aaa
> call foo
> end subroutine bar
> end program test
>
> The user can now do this:
>
> (gdb) b foo
> Breakpoint 1 at 0x4006c2: foo. (3 locations)
> (gdb) info breakpoints
> Num Type Disp Enb Address What
> 1 breakpoint keep y <MULTIPLE>
> 1.1 y 0x00000000004006c2 in aaa::foo at nest.f90:4
> 1.2 y 0x0000000000400730 in foo at nest.f90:9
> 1.3 y 0x00000000004007c3 in test::foo at nest.f90:16
>
> The user asks for a breakpoint on 'foo' and is given a breakpoint on
> all three possible 'foo' locations. The user is, of course, still
> able to specify the scope in order to place a single breakpoint on
> just one of the foo functions (or use 'break -qualified foo' to break
> on just the global foo).
That's nice, it would now match the C++ behavior. Please consider adding some NEWS
entries for this (and maybe the previous patch too, or a combined entry for both).
Simon
@@ -673,9 +673,9 @@ extern const struct language_defn f_language_defn =
default_pass_by_reference,
default_get_string,
c_watch_location_expression,
- NULL, /* la_get_symbol_name_matcher */
+ cp_get_symbol_name_matcher, /* la_get_symbol_name_matcher */
iterate_over_symbols,
- default_search_name_hash,
+ cp_search_name_hash,
&default_varobj_ops,
NULL,
NULL,
@@ -121,12 +121,6 @@ proc do_bp_tests {with_src_prefix_p with_nest_prefix_p} {
".*print \\\*, program_i ! post_hidden"
gdb_test "p program_i" " = 30" "printing hidden global"
- # Check that the methods in the container module still require the
- # module name as context.
- gdb_test_no_output "set confirm off"
- gdb_test "break print_from_module" \
- "Function \\\"print_from_module\\\" not defined."
-
# Check info symbol, whatis and ptype can find information on
# these nested functions.
foreach entry \
@@ -147,10 +141,7 @@ proc do_bp_tests {with_src_prefix_p with_nest_prefix_p} {
}
foreach_with_prefix src_prefix { 0 1 } {
- # For now this loop is only run with a value of '1'. A later
- # patch will extend this with the value '0', at which point this
- # comment will be removed.
- foreach_with_prefix nest_prefix { 1 } {
+ foreach_with_prefix nest_prefix { 0 1 } {
do_bp_tests ${src_prefix} ${nest_prefix}
}
}