diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-08-15 14:57:13 +0100 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-10-03 21:25:22 +0100 |
commit | 0a4b09130aa8c2d2e1c1605a69962fe0a2499479 (patch) | |
tree | 771e8e48d59652033a80612cc3d35bd4cc74dec8 /gdb/testsuite/gdb.fortran/nested-funcs-2.f90 | |
parent | 082cce059d78bdb4a9fadbbacc2cd1dc3668f084 (diff) | |
download | binutils-0a4b09130aa8c2d2e1c1605a69962fe0a2499479.zip binutils-0a4b09130aa8c2d2e1c1605a69962fe0a2499479.tar.gz binutils-0a4b09130aa8c2d2e1c1605a69962fe0a2499479.tar.bz2 |
gdb/fortran: Nested subroutine support
This patch is a rebase and update of the following three patches:
https://sourceware.org/ml/gdb-patches/2018-11/msg00298.html
https://sourceware.org/ml/gdb-patches/2018-11/msg00302.html
https://sourceware.org/ml/gdb-patches/2018-11/msg00301.html
I have merged these together into a single commit as the second patch,
adding scope support to nested subroutines, means that some of the
changes in the first patch are now no longer useful and would have to
be backed out. The third patch is tightly coupled to the changes in
the second of these patches and I think deserves to live together with
it.
There is an extra change in cp-namespace.c that is new, this resolves
an issue with symbol lookup when placing breakpoints from within
nested subroutines.
There is also an extra test added to this commit 'nested-funcs-2.exp'
that was written by Richard Bunt from ARM, this offers some additional
testing of breakpoints on nested functions.
After this commit it is possible to place breakpoints on nested
Fortran subroutines and functions by using a fully scoped name, for
example, given this simple Fortran program:
program greeting
call message
contains
subroutine message
print *, "Hello World"
end subroutine message
end program greeting
It is possible to place a breakpoint in 'message' with:
(gdb) break greeting::message
Breakpoint 1 at 0x4006c9: file basic.f90, line 5.
What doesn't work with this commit is placing a breakpoint like this:
(gdb) break message
Function "message" not defined.
Making this work will come in a later commit.
gdb/ChangeLog:
* cp-namespace.c (cp_search_static_and_baseclasses): Only search
for nested static variables when searchin VAR_DOMAIN.
* dwarf2read.c (add_partial_symbol): Add nested subroutines to the
global scope, update comment.
(add_partial_subprogram): Call add_partial_subprogram recursively
for nested subroutines when processinng Fortran.
(load_partial_dies): Process the child entities of a subprogram
when processing Fortran.
(partial_die_parent_scope): Handle building scope
for Fortran nested functions.
(process_die): Record that nested functions have a scope.
(new_symbol): Always record Fortran subprograms on the global
symbol list.
(determine_prefix): How to build the prefix for Fortran
subprograms.
gdb/testsuite/ChangeLog:
* gdb.fortran/nested-funcs.exp: Tests for placing breakpoints on
nested functions.
* gdb.fortran/nested-funcs.f90: Update expected results.
* gdb.fortran/nested-funcs-2.exp: New file.
* gdb.fortran/nested-funcs-2.f90: New file.
gdb/doc/ChangeLog:
* doc/gdb.texinfo (Fortran Operators): Describe scope operator.
Diffstat (limited to 'gdb/testsuite/gdb.fortran/nested-funcs-2.f90')
-rw-r--r-- | gdb/testsuite/gdb.fortran/nested-funcs-2.f90 | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.fortran/nested-funcs-2.f90 b/gdb/testsuite/gdb.fortran/nested-funcs-2.f90 new file mode 100644 index 0000000..c3b4e2b --- /dev/null +++ b/gdb/testsuite/gdb.fortran/nested-funcs-2.f90 @@ -0,0 +1,62 @@ +! Copyright 2019 Free Software Foundation, Inc. +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program. If not, see <http://www.gnu.org/licenses/> . + +module container + implicit none + integer :: a + contains + subroutine print_from_module() + print *, "hello." + end subroutine +end module + +program contains_keyword + use container + implicit none + integer :: program_i, program_j + program_j = 12 ! pre_init + program_i = 7 + program_j = increment(program_j) ! pre_increment + program_i = increment_program_global() ! pre_increment_program_global + call subroutine_to_call() + call step() ! pre_step + call hidden_variable() + call print_from_module() + print '(I2)', program_j, program_i ! post_init + +contains + subroutine subroutine_to_call() + print *, "called" + end subroutine + integer function increment(i) + integer :: i + increment = i + 1 + print *, i ! post_increment + end function + integer function increment_program_global() + increment_program_global = program_i + 1 + ! Need to put in a dummy print here to break on as on some systems the + ! variables leave scope at "end function", but on others they do not. + print *, program_i ! post_increment_global + end function + subroutine step() + print '(A)', "step" ! post_step + end subroutine + subroutine hidden_variable() + integer :: program_i + program_i = 30 + print *, program_i ! post_hidden + end subroutine +end program contains_keyword |