From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28982 invoked by alias); 17 Feb 2006 00:17:21 -0000 Received: (qmail 28964 invoked by uid 22791); 17 Feb 2006 00:17:19 -0000 X-Spam-Check-By: sourceware.org Received: from wsip-24-248-2-174.ph.ph.cox.net (HELO public.ninemoons.com) (24.248.2.174) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 17 Feb 2006 00:17:16 +0000 Received: from puffer.diveadx.com (dpc67446126.direcpc.com [67.44.6.126]) by public.ninemoons.com (8.13.4/8.13.4) with ESMTP id k1H0Flxo009263; Thu, 16 Feb 2006 17:15:51 -0700 Received: from [192.168.1.146] (unknown [192.168.1.146]) by puffer.diveadx.com (Postfix) with ESMTP id 1DD49297312; Thu, 16 Feb 2006 19:32:56 -0500 (EST) From: Fred Fish Reply-To: fnf@diveadx.com To: Daniel Jacobowitz Subject: Re: [PATCH] Fix ptype problem printing typedefs defined differently in different compilation units Date: Fri, 17 Feb 2006 00:17:00 -0000 User-Agent: KMail/1.9.1 Cc: Jim Blandy , gdb-patches@sourceware.org References: <200601031517.50309.fnf@specifix.com> <200602121349.07257.fnf@specifix.com> <20060214141056.GB21812@nevyn.them.org> In-Reply-To: <20060214141056.GB21812@nevyn.them.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200602161916.00761.fnf@diveadx.com> 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/msg00334.txt.bz2 On Tuesday 14 February 2006 09:10, Daniel Jacobowitz wrote: > This patch seems OK to me; but we really ought to fix up the comment > directly above this code that you're changing. I've think it would be best to split work on this issue up into two parts (1) Make ptype and whatis handle the same arguments. Currently ptype will work on typedefs, but whatis does not. This is the change that makes them both use whatis_exp and eliminates ptype_eval. (2) Make ptype and whatis handle printing types specified in a given context using 'file'::type. I have a fix that involves a fairly minor change to the parser and makes the patch you are commenting on obsolete. Here is the patch for (1). I believe we previously reached on consensus that this change was OK, so I'd like to get it checked in. I added some testsuite support for testing how whatis behaves with typedef names. Gdb ChangeLog entry: 2006-02-16 Fred Fish * eval.c (evaluate_subexp_standard): For OP_TYPE, return a non lval value zero, of the appropriate type, when avoiding side effects. * typeprint.c (ptype_eval): Remove function and declaration. (ptype_command): Simplify to just a call to whatis_exp. Testsuite ChangeLog entry: 2006-02-16 Fred Fish * gdb.base/whatis.c: Define variables using typedefs char_addr, ushort_addr, and slong_addr, so the typedefs are not optimized away. * gdb.base/whatis.exp: Add tests using type name for struct type, union type, enum type, and typedef. Index: eval.c =================================================================== RCS file: /cvs/src/src/gdb/eval.c,v retrieving revision 1.60 diff -c -p -r1.60 eval.c *** eval.c 17 Dec 2005 22:33:59 -0000 1.60 --- eval.c 16 Feb 2006 23:16:27 -0000 *************** evaluate_subexp_standard (struct type *e *** 2086,2092 **** return value_of_local ("self", 1); case OP_TYPE: ! error (_("Attempt to use a type name as an expression")); default: /* Removing this case and compiling with gcc -Wall reveals that --- 2086,2100 ---- return value_of_local ("self", 1); case OP_TYPE: ! /* The value is not supposed to be used. This is here to make it ! easier to accommodate expressions that contain types. */ ! (*pos) += 2; ! if (noside == EVAL_SKIP) ! goto nosideret; ! else if (noside == EVAL_AVOID_SIDE_EFFECTS) ! return allocate_value (exp->elts[pc + 1].type); ! else ! error (_("Attempt to use a type name as an expression")); default: /* Removing this case and compiling with gcc -Wall reveals that Index: typeprint.c =================================================================== RCS file: /cvs/src/src/gdb/typeprint.c,v retrieving revision 1.25 diff -c -p -r1.25 typeprint.c *** typeprint.c 17 Dec 2005 22:34:03 -0000 1.25 --- typeprint.c 16 Feb 2006 23:16:58 -0000 *************** extern void _initialize_typeprint (void) *** 45,52 **** static void ptype_command (char *, int); - static struct type *ptype_eval (struct expression *); - static void whatis_command (char *, int); static void whatis_exp (char *, int); --- 45,50 ---- *************** whatis_command (char *exp, int from_tty) *** 182,236 **** whatis_exp (exp, -1); } - /* Simple subroutine for ptype_command. */ - - static struct type * - ptype_eval (struct expression *exp) - { - if (exp->elts[0].opcode == OP_TYPE) - { - return (exp->elts[1].type); - } - else - { - return (NULL); - } - } - /* TYPENAME is either the name of a type, or an expression. */ static void ptype_command (char *typename, int from_tty) { ! struct type *type; ! struct expression *expr; ! struct cleanup *old_chain; ! ! if (typename == NULL) ! { ! /* Print type of last thing in value history. */ ! whatis_exp (typename, 1); ! } ! else ! { ! expr = parse_expression (typename); ! old_chain = make_cleanup (free_current_contents, &expr); ! type = ptype_eval (expr); ! if (type != NULL) ! { ! /* User did "ptype " */ ! printf_filtered ("type = "); ! type_print (type, "", gdb_stdout, 1); ! printf_filtered ("\n"); ! do_cleanups (old_chain); ! } ! else ! { ! /* User did "ptype " */ ! do_cleanups (old_chain); ! whatis_exp (typename, 1); ! } ! } } /* Print integral scalar data VAL, of type TYPE, onto stdio stream STREAM. --- 180,191 ---- whatis_exp (exp, -1); } /* TYPENAME is either the name of a type, or an expression. */ static void ptype_command (char *typename, int from_tty) { ! whatis_exp (typename, 1); } /* Print integral scalar data VAL, of type TYPE, onto stdio stream STREAM. Index: testsuite/gdb.base/whatis.c =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.base/whatis.c,v retrieving revision 1.3 diff -c -p -r1.3 whatis.c *** testsuite/gdb.base/whatis.c 23 Aug 2004 13:04:03 -0000 1.3 --- testsuite/gdb.base/whatis.c 16 Feb 2006 23:22:33 -0000 *************** double v_double_array[2]; *** 79,86 **** --- 79,89 ---- a special case kludge in GDB (Unix system include files like to define caddr_t), but for a variety of types. */ typedef char *char_addr; + static char_addr a_char_addr; typedef unsigned short *ushort_addr; + static ushort_addr a_ushort_addr; typedef signed long *slong_addr; + static slong_addr a_slong_addr; char *v_char_pointer; signed char *v_signed_char_pointer; Index: testsuite/gdb.base/whatis.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.base/whatis.exp,v retrieving revision 1.6 diff -c -p -r1.6 whatis.exp *** testsuite/gdb.base/whatis.exp 23 Aug 2004 13:04:03 -0000 1.6 --- testsuite/gdb.base/whatis.exp 16 Feb 2006 23:22:36 -0000 *************** gdb_test "whatis v_struct1" \ *** 273,278 **** --- 273,282 ---- "type = struct t_struct" \ "whatis named structure" + gdb_test "whatis struct t_struct" \ + "type = struct t_struct" \ + "whatis named structure using type name" + gdb_test "whatis v_struct2" \ "type = struct \{$unstruct\}" \ "whatis unnamed structure" *************** gdb_test "whatis v_union" \ *** 283,288 **** --- 287,296 ---- "type = union t_union" \ "whatis named union" + gdb_test "whatis union t_union" \ + "type = union t_union" \ + "whatis named union using type name" + gdb_test "whatis v_union2" \ "type = union \{$ununion\}" \ "whatis unnamed union" *************** gdb_test "whatis clunker" \ *** 371,376 **** --- 379,388 ---- "type = enum cars" \ "whatis enumeration" + gdb_test "whatis enum cars" \ + "type = enum cars" \ + "whatis enumeration using type name" + # test whatis command with nested struct and union gdb_test "whatis nested_su" \ *************** gdb_test "whatis nested_su.inner_union_i *** 402,404 **** --- 414,426 ---- gdb_test "whatis nested_su.inner_union_instance.inner_union_int" \ "type = int" \ "whatis inner union member" + + # test whatis command with typedefs + + gdb_test "whatis char_addr" \ + "type = char \\*" \ + "whatis using typedef type name" + + gdb_test "whatis a_char_addr" \ + "type = char_addr" \ + "whatis applied to variable defined by typedef"