[2/2] gdb/fortran: Allow for matching symbols with missing scope
Commit Message
* Simon Marchi <simark@simark.ca> [2019-09-24 22:28:46 -0400]:
>
> 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).
Thanks for the review. The only change in the patch below is the
addition of a NEWS entry - I guess for Eli to review.
Thanks,
Andrew
---
commit 7b1377da89bf23df400ddf51299c7e0955372607
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date: Mon Sep 2 23:31:10 2019 +0100
gdb/fortran: Allow for matching symbols with missing scope
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.
* NEWS: Add entry about nested function support.
gdb/testsuite/ChangeLog:
* gdb.fortran/nested-funcs-2.exp: Run tests with and without the
nested function prefix.
Comments
> Date: Wed, 25 Sep 2019 23:53:08 +0100
> From: Andrew Burgess <andrew.burgess@embecosm.com>
> Cc: gdb-patches@sourceware.org, Richard Bunt <Richard.Bunt@arm.com>
>
> gdb/ChangeLog:
>
> * f-lang.c (f_language_defn): Use cp_get_symbol_name_matcher and
> cp_search_name_hash.
> * NEWS: Add entry about nested function support.
>
> gdb/testsuite/ChangeLog:
>
> * gdb.fortran/nested-funcs-2.exp: Run tests with and without the
> nested function prefix.
OK for the NEWS part.
@@ -34,6 +34,15 @@
* GDB can now be compiled with Python 3 on Windows.
+* GDB can now place breakpoints on nested functions and subroutines in
+ Fortran code. The '::' operator can be used between parent and
+ child scopes when placing breakpoints, for example:
+
+ (gdb) break outer_function::inner_function
+
+ The 'outer_function::' prefix is only needed if 'inner_function' is
+ not visible in the current scope.
+
* Python API
** The gdb.Value type has a new method 'format_string' which returns a
@@ -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}
}
}