From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14526 invoked by alias); 24 Feb 2006 07:49:05 -0000 Received: (qmail 14516 invoked by uid 22791); 24 Feb 2006 07:49:03 -0000 X-Spam-Check-By: sourceware.org Received: from ausmtp04.au.ibm.com (HELO ausmtp04.au.ibm.com) (202.81.18.152) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 24 Feb 2006 07:49:01 +0000 Received: from sd0208e0.au.ibm.com (d23rh904.au.ibm.com [202.81.18.202]) by ausmtp04.au.ibm.com (8.12.10/8.13.5) with ESMTP id k1O7tX0t274916 for ; Fri, 24 Feb 2006 18:55:36 +1100 Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.250.243]) by sd0208e0.au.ibm.com (8.12.10/NCO/VERS6.8) with ESMTP id k1O7pnqA222798 for ; Fri, 24 Feb 2006 18:51:55 +1100 Received: from d23av02.au.ibm.com (loopback [127.0.0.1]) by d23av02.au.ibm.com (8.12.11/8.13.3) with ESMTP id k1O7mV1B013768 for ; Fri, 24 Feb 2006 18:48:31 +1100 Received: from [9.181.133.236] ([9.181.133.236]) by d23av02.au.ibm.com (8.12.11/8.12.11) with ESMTP id k1O7mRqJ013657; Fri, 24 Feb 2006 18:48:29 +1100 Date: Fri, 24 Feb 2006 07:53:00 -0000 From: Wu Zhou To: Daniel Jacobowitz cc: gdb-patches@sources.redhat.com, Thomas.Koenig@online.de Subject: Re: [RFC]: Patch to support Fortran derived type - Revised In-Reply-To: <20060220161050.GE16058@nevyn.them.org> Message-ID: References: <20051207232541.GB7483@nevyn.them.org> <20060220161050.GE16058@nevyn.them.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-02/txt/msg00453.txt.bz2 On Mon, 20 Feb 2006, Daniel Jacobowitz wrote: > On Sat, Dec 10, 2005 at 03:24:29PM +0800, Wu Zhou wrote: > > > > +name : NAME > > > > + { $$ = $1.stoken; } > > > > + ; > > > > + > > > > > > Why not just use name_not_typename instead of adding "name"? > > > > > > Also, the comments in name_not_typename don't apply here; you could > > > also handle exp : exp % NAME_OR_INT as a name. But, I don't think that > > > adds much value. The whole NAME_OR_INT thing seems like overkill. > > > > AFAICT, adding "name" might be a more direct and easier way to handle > > that. I am not sure yet how to handle name_not_typename or NAME_OR_INT, > > but it seems that some more work is needed in either the parsing or > > evaluation phase. What is more, using "name" is the same way as that in > > c and c++ expression parser, which looks to be more consistent. > > > > Does these make sense? > > I suppose. > > > 2005-12-10 Wu Zhou > > > > * gdb.fortran/derived-type.f90: New file. > > * .fortran/derived-type.exp: New testcase. > > Typo there. > > > +++ gdb.fortran/derived-type.f90 16 Nov 2005 06:50:22 -0000 > > @@ -0,0 +1,22 @@ > > +program main > > Please add a copyright notice to all new tests. > > Otherwise the code and testcase look fine; Eli had some additional > comments on the texinfo bits. Hi Daniel, Thanks for the review. I had fix the above typo and add the copyright notice to gdb.fortran/derived-type.f90 and committed them into the CVS. For the document patch, I will resend a modified version for review. Here is what I checked in: 2006-02-24 Wu Zhou * f-exp.y: Symbol '%' is not used as the modulus operator in Fortran. Delete this from Fortran expression. It is now used by Fortran 90 and later to access the member of derived type. Add this into Fortran expression. * f-valprint.c (f_val_print): Add code to handle TYPE_CODE_STRUCT. Print each elements in the derived type. * f-typeprint.c (print_equivalent_f77_float_type): Add a parameter level into the function definition to do indented printing. And call fprintfi_filtered instead to do indented printing. (f_type_print_base): Replace fprintf_filtered with the indented version (fprintfi_filtered). (f_type_print_base): Call indented print_equivalent_f77_float_type. (f_type_print_base): Add code to handle TYPE_CODE_STRUCT. Print the definition of the derived type. Index: f-exp.y =================================================================== RCS file: /cvs/src/src/gdb/f-exp.y,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- src/gdb/f-exp.y 2005/12/17 22:33:59 1.19 +++ src/gdb/f-exp.y 2006/02/24 07:26:10 1.20 @@ -1,6 +1,6 @@ /* YACC parser for Fortran expressions, for GDB. Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001, - 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Motorola. Adapted from the C parser by Farooq Butt (fmbutt@engage.sps.mot.com). @@ -178,6 +178,7 @@ %token BOOLEAN_LITERAL %token NAME %token TYPENAME +%type name %type name_not_typename /* A NAME_OR_INT is a symbol which is not known in the symbol table, @@ -217,8 +218,9 @@ %left LSH RSH %left '@' %left '+' '-' -%left '*' '/' '%' +%left '*' '/' %right STARSTAR +%right '%' %right UNARY %right '(' @@ -332,6 +334,12 @@ write_exp_elt_opcode (UNOP_CAST); } ; +exp : exp '%' name + { write_exp_elt_opcode (STRUCTOP_STRUCT); + write_exp_string ($3); + write_exp_elt_opcode (STRUCTOP_STRUCT); } + ; + /* Binary operators in order of decreasing precedence. */ exp : exp '@' exp @@ -350,10 +358,6 @@ { write_exp_elt_opcode (BINOP_DIV); } ; -exp : exp '%' exp - { write_exp_elt_opcode (BINOP_REM); } - ; - exp : exp '+' exp { write_exp_elt_opcode (BINOP_ADD); } ; @@ -635,6 +639,10 @@ } ; +name : NAME + { $$ = $1.stoken; } + ; + name_not_typename : NAME /* These would be useful if name_not_typename was useful, but it is just a fake for "variable", so these cause reduce/reduce conflicts because Index: f-valprint.c =================================================================== RCS file: /cvs/src/src/gdb/f-valprint.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- src/gdb/f-valprint.c 2006/01/18 21:24:19 1.32 +++ src/gdb/f-valprint.c 2006/02/24 07:26:10 1.33 @@ -366,6 +366,7 @@ struct type *elttype; LONGEST val; CORE_ADDR addr; + int index; CHECK_TYPEDEF (type); switch (TYPE_CODE (type)) @@ -583,6 +584,22 @@ fprintf_filtered (stream, ""); break; + case TYPE_CODE_STRUCT: + /* Starting from the Fortran 90 standard, Fortran supports derived + types. */ + fprintf_filtered (stream, "{ "); + for (index = 0; index < TYPE_NFIELDS (type); index++) + { + int offset = TYPE_FIELD_BITPOS (type, index) / 8; + f_val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset, + embedded_offset, address, stream, + format, deref_ref, recurse, pretty); + if (index != TYPE_NFIELDS (type) - 1) + fputs_filtered (", ", stream); + } + fprintf_filtered (stream, "}"); + break; + default: error (_("Invalid F77 type code %d in symbol table."), TYPE_CODE (type)); } Index: f-typeprint.c =================================================================== RCS file: /cvs/src/src/gdb/f-typeprint.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- src/gdb/f-typeprint.c 2005/12/17 22:33:59 1.14 +++ src/gdb/f-typeprint.c 2006/02/24 07:26:10 1.15 @@ -1,7 +1,7 @@ /* Support for printing Fortran types for GDB, the GNU debugger. Copyright (C) 1986, 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1998, - 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2006 Free Software Foundation, Inc. Contributed by Motorola. Adapted from the C version by Farooq Butt (fmbutt@engage.sps.mot.com). @@ -41,7 +41,7 @@ static void f_type_print_args (struct type *, struct ui_file *); #endif -static void print_equivalent_f77_float_type (struct type *, +static void print_equivalent_f77_float_type (int level, struct type *, struct ui_file *); static void f_type_print_varspec_suffix (struct type *, struct ui_file *, @@ -260,13 +260,14 @@ } static void -print_equivalent_f77_float_type (struct type *type, struct ui_file *stream) +print_equivalent_f77_float_type (int level, struct type *type, + struct ui_file *stream) { /* Override type name "float" and make it the appropriate real. XLC stupidly outputs -12 as a type for real when it really should be outputting -18 */ - fprintf_filtered (stream, "real*%d", TYPE_LENGTH (type)); + fprintfi_filtered (level, stream, "real*%d", TYPE_LENGTH (type)); } /* Print the name of the type (or the ultimate pointer target, @@ -289,6 +290,8 @@ int retcode; int upper_bound; + int index; + QUIT; wrap_here (" "); @@ -304,7 +307,7 @@ if ((show <= 0) && (TYPE_NAME (type) != NULL)) { if (TYPE_CODE (type) == TYPE_CODE_FLT) - print_equivalent_f77_float_type (type, stream); + print_equivalent_f77_float_type (level, type, stream); else fputs_filtered (TYPE_NAME (type), stream); return; @@ -335,25 +338,25 @@ break; case TYPE_CODE_VOID: - fprintf_filtered (stream, "VOID"); + fprintfi_filtered (level, stream, "VOID"); break; case TYPE_CODE_UNDEF: - fprintf_filtered (stream, "struct "); + fprintfi_filtered (level, stream, "struct "); break; case TYPE_CODE_ERROR: - fprintf_filtered (stream, ""); + fprintfi_filtered (level, stream, ""); break; case TYPE_CODE_RANGE: /* This should not occur */ - fprintf_filtered (stream, ""); + fprintfi_filtered (level, stream, ""); break; case TYPE_CODE_CHAR: /* Override name "char" and make it "character" */ - fprintf_filtered (stream, "character"); + fprintfi_filtered (level, stream, "character"); break; case TYPE_CODE_INT: @@ -362,24 +365,24 @@ C-oriented, we must change these to "character" from "char". */ if (strcmp (TYPE_NAME (type), "char") == 0) - fprintf_filtered (stream, "character"); + fprintfi_filtered (level, stream, "character"); else goto default_case; break; case TYPE_CODE_COMPLEX: - fprintf_filtered (stream, "complex*%d", TYPE_LENGTH (type)); + fprintfi_filtered (level, stream, "complex*%d", TYPE_LENGTH (type)); break; case TYPE_CODE_FLT: - print_equivalent_f77_float_type (type, stream); + print_equivalent_f77_float_type (level, type, stream); break; case TYPE_CODE_STRING: /* Strings may have dynamic upperbounds (lengths) like arrays. */ if (TYPE_ARRAY_UPPER_BOUND_TYPE (type) == BOUND_CANNOT_BE_DETERMINED) - fprintf_filtered (stream, "character*(*)"); + fprintfi_filtered (level, stream, "character*(*)"); else { retcode = f77_get_dynamic_upperbound (type, &upper_bound); @@ -391,6 +394,21 @@ } break; + case TYPE_CODE_STRUCT: + fprintfi_filtered (level, stream, "Type "); + fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered ("\n", stream); + for (index = 0; index < TYPE_NFIELDS (type); index++) + { + f_print_type (TYPE_FIELD_TYPE (type, index), "", stream, show, level + 4); + fputs_filtered (" :: ", stream); + fputs_filtered (TYPE_FIELD_NAME (type, index), stream); + fputs_filtered ("\n", stream); + } + fprintfi_filtered (level, stream, "End Type "); + fputs_filtered (TYPE_TAG_NAME (type), stream); + break; + default_case: default: /* Handle types not explicitly handled by the other cases, @@ -398,7 +416,7 @@ the type name is, as recorded in the type itself. If there is no type name, then complain. */ if (TYPE_NAME (type) != NULL) - fputs_filtered (TYPE_NAME (type), stream); + fprintfi_filtered (level, stream, "%s ", TYPE_NAME (type)); else error (_("Invalid type code (%d) in symbol table."), TYPE_CODE (type)); break; Regards - Wu Zhou