From: Fred Fish <fnf@specifix.com>
To: Daniel Jacobowitz <drow@false.org>
Cc: Jim Blandy <jimb@red-bean.com>,
gdb-patches@sourceware.org, fnf@specifix.com
Subject: Re: [PATCH] Fix ptype problem printing typedefs defined differently in different compilation units
Date: Sun, 12 Feb 2006 18:49:00 -0000 [thread overview]
Message-ID: <200602121349.07257.fnf@specifix.com> (raw)
In-Reply-To: <20060211202059.GB27289@nevyn.them.org>
On Saturday 11 February 2006 15:20, Daniel Jacobowitz wrote:
> Well, if the results of ptype_eval and evaluate_type are inconsistent
> here, won't the result of doing this be meaningless? And if they were
> already consistent, then I'm a little confused how your patch works.
ptype_eval extracted the type directly from the expression, while
evaluate_type creates a value, which it wasn't prepared to do from
just a typedef name.
In any case, I think I found a better solution, which is basically to
eliminate ptype_eval and let the expression evaluator create a value
with the right type. The actual value isn't important, since we're
only going to use it's type. This is how the ADA expression evaluator
handles evaluating an OP_TYPE expression.
> > > Also ptype will now do the RTTI lookup; I'm not sure whether it
> > > should or not.
> >
> > Not sure either, now that you point it out.
>
> Might as well let it.
OK, then we can let whatis_exp handle both ptype and whatis.
Attached is a reworked patch, with a couple of additional testsuite
changes.
-Fred
Gdb ChangeLog entry:
2006-02-12 Fred Fish <fnf@specifix.com>
* eval.c (evaluate_subexp_standard): For OP_VAR_VALUE, if exp
is a typedef, return a non lval value zero, of the appropriate
type, when avoiding side effects.
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-12 Fred Fish <fnf@specifix.com>
* gdb.base/ptype.c: Add afoo for typedef checks.
* gdb.base/ptype1.c: Add afoo for typedef checks.
* gdb.base/whatis.c: Add typedef foo and var afoo.
* gdb.base/ptype.exp: Add tests for 'file'::symbol and
'file'::typename syntax. Add tests using value history.
* gdb.base/whatis.exp: Ditto.
Index: eval.c
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/eval.c,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 eval.c
*** eval.c 30 Dec 2005 18:53:04 -0000 1.1.1.2
--- eval.c 12 Feb 2006 18:07:29 -0000
*************** evaluate_subexp_standard (struct type *e
*** 461,466 ****
--- 461,472 ----
value_rtti_target_type () if we are dealing with a pointer
or reference to a base class and print object is on. */
+ /* If asked to evaluate a typedef, and we are avoiding side effects,
+ then create a value of the appropriate type to return. */
+ if (noside == EVAL_AVOID_SIDE_EFFECTS
+ && SYMBOL_CLASS (exp->elts[pc + 2].symbol) == LOC_TYPEDEF)
+ return (allocate_value (SYMBOL_TYPE (exp->elts[2].symbol)));
+ else
return value_of_variable (exp->elts[pc + 2].symbol,
exp->elts[pc + 1].block);
*************** 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
--- 2092,2106 ----
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: /cvsroots/latest/src/gdb/gdb/typeprint.c,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 typeprint.c
*** typeprint.c 30 Dec 2005 18:53:06 -0000 1.1.1.2
--- typeprint.c 12 Feb 2006 18:07:29 -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 <typename>" */
! printf_filtered ("type = ");
! type_print (type, "", gdb_stdout, 1);
! printf_filtered ("\n");
! do_cleanups (old_chain);
! }
! else
! {
! /* User did "ptype <symbolname>" */
! 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/ptype.c
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/testsuite/gdb.base/ptype.c,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 ptype.c
*** testsuite/gdb.base/ptype.c 8 Jan 2006 20:37:18 -0000 1.1.1.2
--- testsuite/gdb.base/ptype.c 10 Feb 2006 21:38:14 -0000
*************** func_type v_func_type;
*** 260,265 ****
--- 260,266 ----
/***********/
typedef int foo;
+ static foo afoo = 2;
foo intfoo (afoo)
{
Index: testsuite/gdb.base/ptype.exp
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/testsuite/gdb.base/ptype.exp,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 ptype.exp
*** testsuite/gdb.base/ptype.exp 8 Jan 2006 20:37:19 -0000 1.1.1.2
--- testsuite/gdb.base/ptype.exp 12 Feb 2006 12:54:42 -0000
*************** gdb_test "list intfoo" ""
*** 593,598 ****
--- 593,610 ----
gdb_test "ptype foo" "type = int" "ptype foo typedef after second list of intfoo"
gdb_test "list charfoo" ""
gdb_test "ptype foo" "type = char" "ptype foo typedef after second list of charfoo"
+ # Test the 'file'::exp syntax for variables and types
+ gdb_test "ptype 'ptype.c'::afoo" "type = int" "ptype 'file'::symbol"
+ gdb_test "ptype 'ptype.c'::foo" "type = int" "ptype 'file'::typename"
+ gdb_test "ptype 'ptype1.c'::afoo" "type = char" "ptype 'file'::symbol"
+ gdb_test "ptype 'ptype1.c'::foo" "type = char" "ptype 'file'::typename"
+
+ # Test printing value history type
+
+ gdb_test "p (long)1" ""
+ gdb_test "ptype" "type = long" "ptype long value from value history"
+ gdb_test "p (short)1" ""
+ gdb_test "ptype" "type = short" "ptype short value from value history"
# Test printing type of string constants and array constants, but
# requires a running process. These call malloc, and can take a long
Index: testsuite/gdb.base/ptype1.c
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/testsuite/gdb.base/ptype1.c,v
retrieving revision 1.1.1.1
diff -c -p -r1.1.1.1 ptype1.c
*** testsuite/gdb.base/ptype1.c 8 Jan 2006 20:37:18 -0000 1.1.1.1
--- testsuite/gdb.base/ptype1.c 10 Feb 2006 21:37:55 -0000
***************
*** 1,4 ****
--- 1,5 ----
typedef char foo;
+ static foo afoo = 1;
foo charfoo (afoo)
{
Index: testsuite/gdb.base/whatis.c
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/testsuite/gdb.base/whatis.c,v
retrieving revision 1.1.1.1
diff -c -p -r1.1.1.1 whatis.c
*** testsuite/gdb.base/whatis.c 8 Oct 2005 19:36:19 -0000 1.1.1.1
--- testsuite/gdb.base/whatis.c 10 Feb 2006 21:35:00 -0000
*************** unsigned long v_unsigned_long;
*** 46,51 ****
--- 46,54 ----
float v_float;
double v_double;
+ typedef int foo;
+ static foo afoo = 1;
+
/*
* Now some derived types, which are arrays, functions-returning,
* pointers, structures, unions, and enumerations.
Index: testsuite/gdb.base/whatis.exp
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/testsuite/gdb.base/whatis.exp,v
retrieving revision 1.1.1.1
diff -c -p -r1.1.1.1 whatis.exp
*** testsuite/gdb.base/whatis.exp 8 Oct 2005 19:36:19 -0000 1.1.1.1
--- testsuite/gdb.base/whatis.exp 12 Feb 2006 12:55:26 -0000
*************** gdb_test "whatis nested_su.inner_union_i
*** 402,404 ****
--- 402,421 ----
gdb_test "whatis nested_su.inner_union_instance.inner_union_int" \
"type = int" \
"whatis inner union member"
+
+ # Test the 'file'::exp syntax for variables and types
+
+ gdb_test "whatis 'whatis.c'::afoo" \
+ "type = foo" \
+ "whatis 'file'::symbol"
+
+ gdb_test "whatis 'whatis.c'::foo" \
+ "type = int" \
+ "whatis 'file'::typename"
+
+ # Test printing value history type
+
+ gdb_test "p (long)1" ""
+ gdb_test "whatis" "type = long" "whatis long value from value history"
+ gdb_test "p (short)1" ""
+ gdb_test "whatis" "type = short" "whatis short value from value history"
next prev parent reply other threads:[~2006-02-12 18:49 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-01-03 20:17 Fred Fish
2006-01-03 23:15 ` Jim Blandy
2006-01-04 2:46 ` Fred Fish
2006-01-04 3:45 ` Jim Blandy
2006-01-04 11:15 ` Fred Fish
2006-01-04 21:04 ` Fred Fish
2006-01-05 0:21 ` Jim Blandy
2006-01-05 0:26 ` Jim Blandy
2006-01-05 0:54 ` Daniel Jacobowitz
2006-01-05 4:47 ` Jim Blandy
2006-01-15 18:48 ` Daniel Jacobowitz
2006-01-16 4:22 ` Jim Blandy
2006-01-23 15:27 ` Fred Fish
2006-01-23 16:12 ` Daniel Jacobowitz
2006-01-23 16:43 ` Fred Fish
2006-01-23 19:17 ` Jim Blandy
2006-01-23 19:35 ` Fred Fish
2006-01-23 20:45 ` Jim Blandy
2006-02-11 0:39 ` Fred Fish
2006-02-11 18:35 ` Daniel Jacobowitz
2006-02-11 19:08 ` Eli Zaretskii
2006-02-11 20:13 ` Daniel Jacobowitz
2006-02-11 20:01 ` Fred Fish
2006-02-11 20:21 ` Daniel Jacobowitz
2006-02-12 18:49 ` Fred Fish [this message]
2006-02-14 14:11 ` Daniel Jacobowitz
2006-02-14 18:47 ` Fred Fish
2006-02-17 0:17 ` Fred Fish
2006-02-17 9:15 ` Eli Zaretskii
2006-02-17 13:36 ` Fred Fish
2006-02-17 20:32 ` Fred Fish
2006-02-18 9:27 ` Eli Zaretskii
2006-02-18 22:19 ` Daniel Jacobowitz
2006-02-20 15:47 ` Fred Fish
2006-02-20 16:23 ` Daniel Jacobowitz
2006-05-17 19:04 ` Fred Fish
2006-02-11 0:39 ` Fred Fish
2006-01-24 15:23 ` [commit] " Fred Fish
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200602121349.07257.fnf@specifix.com \
--to=fnf@specifix.com \
--cc=drow@false.org \
--cc=gdb-patches@sourceware.org \
--cc=jimb@red-bean.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox