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.
This commit is contained in:
Andrew Burgess 2019-09-02 23:31:10 +01:00
parent 0a4b09130a
commit 179aed7fdc
5 changed files with 23 additions and 12 deletions

View File

@ -1,3 +1,9 @@
2019-10-03 Andrew Burgess <andrew.burgess@embecosm.com>
* f-lang.c (f_language_defn): Use cp_get_symbol_name_matcher and
cp_search_name_hash.
* NEWS: Add entry about nested function support.
2019-10-03 Bernhard Heckel <bernhard.heckel@intel.com>
Andrew Burgess <andrew.burgess@embecosm.com>

View File

@ -37,6 +37,15 @@
* New convenience variable $_ada_exception holds the address of the
Ada exception being thrown. This is set by Ada-related catchpoints.
* 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

View File

@ -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,

View File

@ -1,3 +1,8 @@
2019-10-03 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.fortran/nested-funcs-2.exp: Run tests with and without the
nested function prefix.
2019-10-03 Bernhard Heckel <bernhard.heckel@intel.com>
Richard Bunt <richard.bunt@arm.com>
Andrew Burgess <andrew.burgess@embecosm.com>

View File

@ -124,12 +124,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 \
@ -150,10 +144,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}
}
}