From: Jerome Guitton Date: Thu, 29 Nov 2012 16:26:12 +0000 (+0000) Subject: Handle other cases than EVAL_NORMAL in the default case X-Git-Tag: cgen-snapshot-20121201~24 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ca1f964d4b41c778c8f2249e78990a5695645f23;p=platform%2Fupstream%2Fbinutils.git Handle other cases than EVAL_NORMAL in the default case In the evaluation of an expression in Ada mode, the default case unwraps the argument unconditionally. For an object of a variant record type, this unwrapping builds a fixed type from the specification of the variant type and the actual values of the object's discriminants. It means that unwrapping needs the "proper" value for the object, not just a zero value with the proper type. When not in EVAL_NORMAL, we cannot assume that the evaluation returns such a proper value; it may well return a zero value of the appropriate type e.g in EVAL_AVOID_SIDE_EFFECTS. It is wrong to try to unwrap in that case. In particular, a problem shows up when using expression of the form {VARIANT_TYPE}OBJ. GDB first evaluates this expression in EVAL_AVOID_SIDE_EFFECTS to compute the type, the evaluation of OBJ in most cases returns a zero value of its type, and as UNOP_MEMVAL is mapped to the default case its evaluation ends up trying to read memory around address 0. gdb/ChangeLog: * ada-lang.c (ada_evaluate_subexp): Unwrap only in EVAL_NORMAL. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 48c1845..cd86c84 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2012-11-29 Jerome Guitton + + * ada-lang.c (ada_evaluate_subexp): Unwrap only in EVAL_NORMAL. + 2012-11-29 Joel Brobecker GDB 7.5.1 released. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 0621c79..ee2f765 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -9453,7 +9453,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, default: *pos -= 1; arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside); - arg1 = unwrap_value (arg1); + + if (noside == EVAL_NORMAL) + arg1 = unwrap_value (arg1); /* If evaluating an OP_DOUBLE and an EXPECT_TYPE was provided, then we need to perform the conversion manually, because