From 7f9b20bb352768e14cfa7361a82373b8539bebed Mon Sep 17 00:00:00 2001 From: Keven Boell Date: Fri, 25 Oct 2013 12:10:57 +0100 Subject: [PATCH] fortran: enable ptype/whatis for user defined types. (gdb) ptype type old> No symbol "type" in current context. new> type = Type type integer(kind=4) :: t_i End Type type 2013-11-19 Sanimir Agovic Keven Boell * f-exp.y (yylex): Add domain array to enable lookup in multiple domains. Loop over lookup domains and try to find requested symbol. Add STRUCT_DOMAIN to lookup domains to be able to query for user defined types. testsuite/ * gdb.fortran/type.f90: New file. * gdb.fortran/whatis_type.f90: New file. --- ChangeLog | 7 +++++ gdb/f-exp.y | 33 +++++++++++++-------- gdb/testsuite/ChangeLog | 5 ++++ gdb/testsuite/gdb.fortran/type.f90 | 28 ++++++++++++++++++ gdb/testsuite/gdb.fortran/whatis_type.exp | 48 +++++++++++++++++++++++++++++++ 5 files changed, 109 insertions(+), 12 deletions(-) create mode 100644 gdb/testsuite/gdb.fortran/type.f90 create mode 100644 gdb/testsuite/gdb.fortran/whatis_type.exp diff --git a/ChangeLog b/ChangeLog index 2d78f36..c2b071a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-12-19 Keven Boell + + * f-exp.y (yylex): Add domain array to enable lookup + in multiple domains. Loop over lookup domains and try + to find requested symbol. Add STRUCT_DOMAIN to lookup + domains to be able to query for user defined types. + 2013-12-13 Francois-Xavier Coudert * configure.ac: Add user-friendly check for native x86_64-linux diff --git a/gdb/f-exp.y b/gdb/f-exp.y index 567cd00..a7e59df 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -1175,21 +1175,30 @@ yylex (void) char *tmp = copy_name (yylval.sval); struct symbol *sym; struct field_of_this_result is_a_field_of_this; + enum domain_enum_tag lookup_domains[] = {STRUCT_DOMAIN, VAR_DOMAIN}; + int i; int hextype; - - /* Initialize this in case we *don't* use it in this call; that - way we can refer to it unconditionally below. */ - memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this)); - - sym = lookup_symbol (tmp, expression_context_block, - VAR_DOMAIN, - parse_language->la_language == language_cplus - ? &is_a_field_of_this : NULL); - if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) + + for (i = 0; i < ARRAY_SIZE (lookup_domains); ++i) { - yylval.tsym.type = SYMBOL_TYPE (sym); - return TYPENAME; + /* Initialize this in case we *don't* use it in this call; that + way we can refer to it unconditionally below. */ + memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this)); + + sym = lookup_symbol (tmp, expression_context_block, + lookup_domains[i], + parse_language->la_language == language_cplus + ? &is_a_field_of_this : NULL); + if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) + { + yylval.tsym.type = SYMBOL_TYPE (sym); + return TYPENAME; + } + + if (sym) + break; } + yylval.tsym.type = language_lookup_primitive_type_by_name (parse_language, parse_gdbarch, tmp); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e36e835..b5983cd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-19 Keven Boell + + * gdb.fortran/type.f90: New file. + * gdb.fortran/whatis_type.f90: New file. + 2013-12-18 Sergio Durigan Junior * gdb.base/catch-syscall.c: Include . diff --git a/gdb/testsuite/gdb.fortran/type.f90 b/gdb/testsuite/gdb.fortran/type.f90 new file mode 100644 index 0000000..e0c699e --- /dev/null +++ b/gdb/testsuite/gdb.fortran/type.f90 @@ -0,0 +1,28 @@ +! Copyright 2013 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 . + +program type + implicit none + + type :: t1 + integer :: t1_i + real :: t1_r + end type t1 + + type (t1) :: t1v + + t1v%t1_i = 42 + t1v%t1_r = 42.24 ! bp1 +end program type diff --git a/gdb/testsuite/gdb.fortran/whatis_type.exp b/gdb/testsuite/gdb.fortran/whatis_type.exp new file mode 100644 index 0000000..9d6151f --- /dev/null +++ b/gdb/testsuite/gdb.fortran/whatis_type.exp @@ -0,0 +1,48 @@ +# Copyright 2013 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 . + +if { [skip_fortran_tests] } { continue } + +standard_testfile type.f90 + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + ${srcfile} {debug f90}] } { + return -1 +} + +if ![runto MAIN__] { + fail "run to MAIN__" + return +} + +gdb_breakpoint [gdb_get_line_number "bp1"] +gdb_continue_to_breakpoint "bp1" + +set t1_i "integer\\\(kind=4\\\) :: t1_i" +set t1_r "real\\\(kind=4\\\) :: t1_r" + +gdb_test "whatis t1" \ + "type = Type t1\r\n${t1_i}\r\n${t1_r}\r\nEnd Type t1" \ + "whatis t1" +gdb_test "whatis t1v" \ + "type = Type t1\r\n${t1_i}\r\n${t1_r}\r\nEnd Type t1" \ + "whatis t1v" + +gdb_test "ptype t1" \ + "type = Type t1\r\n ${t1_i}\r\n ${t1_r}\r\nEnd Type t1" \ + "ptype t1" +gdb_test "ptype t1v" \ + "type = Type t1\r\n ${t1_i}\r\n ${t1_r}\r\nEnd Type t1" \ + "ptype t1v" -- 2.7.4