[2/2] gdb/fortran: Allow for matching symbols with missing scope

Message ID e911a4dabf53b9c34f3f64d83f2c83a9a9eedbba.1567546519.git.andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess Sept. 3, 2019, 9:39 p.m. UTC
  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

Simon Marchi Sept. 25, 2019, 2:28 a.m. UTC | #1
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
  

Patch

diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index ce7f1471c52..5681379b3b3 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -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,
diff --git a/gdb/testsuite/gdb.fortran/nested-funcs-2.exp b/gdb/testsuite/gdb.fortran/nested-funcs-2.exp
index e23d8bad4b2..9fa04ae9af3 100644
--- a/gdb/testsuite/gdb.fortran/nested-funcs-2.exp
+++ b/gdb/testsuite/gdb.fortran/nested-funcs-2.exp
@@ -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}
     }
 }