From be9425454f2d15a1c2512faa81de8777731aa4af Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Tue, 20 Apr 2010 22:38:02 +0000 Subject: [PATCH] "unsupported language" error in info types when using Ada. This implements a rudimentary version of the la_print_typedef method for Ada. Ada usually does not use typedefs, but there is one exception: pointers to unconstrained arrays. Without this patch, we sometimes get an error in the "info types" output: (gdb) info types new_integer_type All types matching regular expression "new_integer_type": File foo.adb: Language not supported. For now, we treat the typedef as if it did not exist - using the underlying type instead. This is the right thing to do for most cases, the only exception being access to array types. Since we already have a general issue in handling these pointers (we confuse them with fat pointers), we will enhance ada_print_typedef to handle these pointers at the same time we address the general issue. gdb/ChangeLog: * ada-typeprint.c (ada_print_typedef): New function. * ada-lang.h (ada_print_typedef): Add declaration. * ada-lang.c (ada_language_defn): set la_print_typdef field to ada_print_typedef. gdb/testsuite/ChangeLog: * info_types.c, info_types.exp: New files. Tested on x86_64-linux. --- gdb/ChangeLog | 7 ++++++ gdb/ada-lang.c | 2 +- gdb/ada-lang.h | 3 +++ gdb/ada-typeprint.c | 11 +++++++++ gdb/testsuite/ChangeLog | 4 ++++ gdb/testsuite/gdb.ada/info_types.c | 35 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/info_types.exp | 31 ++++++++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.ada/info_types.c create mode 100644 gdb/testsuite/gdb.ada/info_types.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8684d81f1f..fe8bcb790c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-04-20 Joel Brobecker + + * ada-typeprint.c (ada_print_typedef): New function. + * ada-lang.h (ada_print_typedef): Add declaration. + * ada-lang.c (ada_language_defn): set la_print_typdef field + to ada_print_typedef. + 2010-04-20 Joel Brobecker * procfs.c (procfs_address_to_host_pointer): Only define when used. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index df8ff19f19..a598c6db79 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -11276,7 +11276,7 @@ const struct language_defn ada_language_defn = { ada_printstr, /* Function to print string constant */ emit_char, /* Function to print single char (not used) */ ada_print_type, /* Print a type using appropriate syntax */ - default_print_typedef, /* Print a typedef using appropriate syntax */ + ada_print_typedef, /* Print a typedef using appropriate syntax */ ada_val_print, /* Print a value using appropriate syntax */ ada_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h index 017cff2548..3d60f8f8a1 100644 --- a/gdb/ada-lang.h +++ b/gdb/ada-lang.h @@ -159,6 +159,9 @@ extern void ada_error (char *); /* Defined in ada-exp.y */ extern void ada_print_type (struct type *, char *, struct ui_file *, int, int); +extern void ada_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream); + extern int ada_val_print (struct type *, const gdb_byte *, int, CORE_ADDR, struct ui_file *, int, const struct value_print_options *); diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 74eaabf2af..17d3594250 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -828,3 +828,14 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream, break; } } + +/* Implement the la_print_typedef language method for Ada. */ + +void +ada_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + type = ada_check_typedef (type); + ada_print_type (type, "", stream, 0, 0); + fprintf_filtered (stream, "\n"); +} diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8913d8962b..1a1df4c779 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-04-20 Joel Brobecker + + * info_types.c, info_types.exp: New files. + 2010-04-20 Joel Brobecker * gdb.ada/dyn_loc: New testcase. diff --git a/gdb/testsuite/gdb.ada/info_types.c b/gdb/testsuite/gdb.ada/info_types.c new file mode 100644 index 0000000000..c7fd3f4d78 --- /dev/null +++ b/gdb/testsuite/gdb.ada/info_types.c @@ -0,0 +1,35 @@ +/* This test program is part of GDB, the GNU debugger. + + Copyright 2010 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 . + */ + +typedef int new_integer_type; + +void +do_something (int *val) +{ + *val = *val + 1; +} + +int +main (void) +{ + new_integer_type toto = 30; + + do_something(&toto); + return 0; +} + diff --git a/gdb/testsuite/gdb.ada/info_types.exp b/gdb/testsuite/gdb.ada/info_types.exp new file mode 100644 index 0000000000..a62da35deb --- /dev/null +++ b/gdb/testsuite/gdb.ada/info_types.exp @@ -0,0 +1,31 @@ +# Copyright 2010 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 . + +set testfile info_types +set srcfile ${testfile}.c +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { + return -1 +} + +# Force the language to Ada. We used a C program because it was trivial +# to get a typedef type, but the situation we are trying to reproduce is +# when the Ada language is being used. +gdb_test "set lang ada" "" + +set eol "\[\r\n\]+" + +gdb_test "info types new_integer_type" \ + "All types matching regular expression \"new_integer_type\":${eol}File .*info_types.c:${eol}int" +