From: Joel Brobecker Date: Thu, 14 Aug 2014 21:00:02 +0000 (-0700) Subject: ada_evaluate_subexp: Avoid static fixing when possible. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=84754697d2ac74094af81cd484d4471c2e58117b;p=binutils-gdb.git ada_evaluate_subexp: Avoid static fixing when possible. Now that the OP_VAR_VALUE section of this function has been reorganized a bit, we can fall-back on standard evaluation when static fixing is not required. This patch does that, but being exclusive about when static fixing has to be used, rather than doing it all the time when noside is EVAL_AVOID_SIDE_EFFECTS. This will pave the way for later when we want to evaluate entities that have no GNAT encodings related to them but dynamic properties instead. In that case, we expect the standard evaluation to resolve those dynamic properties for us, even in no-side-effect mode. gdb/ChangeLog: * ada-lang.c (ada_evaluate_subexp) : When noside is EVAL_AVOID_SIDE_EFFECTS, only return a statically fixed value for records and unions for which some GNAT encodings are present. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 23bc2149728..4ca5ea8b481 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2014-08-18 Joel Brobecker + + * ada-lang.c (ada_evaluate_subexp) : + When noside is EVAL_AVOID_SIDE_EFFECTS, only return a statically + fixed value for records and unions for which some GNAT encodings + are present. + 2014-08-18 Joel Brobecker * ada-lang.c (ada_evaluate_subexp) : Slight code diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index a9b5e6f2f80..c4e85d20386 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10185,8 +10185,22 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, } } - *pos += 4; - return value_zero (to_static_fixed_type (type), not_lval); + /* Records and unions for which GNAT encodings have been + generated need to be statically fixed as well. + Otherwise, non-static fixing produces a type where + all dynamic properties are removed, which prevents "ptype" + from being able to completely describe the type. + For instance, a case statement in a variant record would be + replaced by the relevant components based on the actual + value of the discriminants. */ + if ((TYPE_CODE (type) == TYPE_CODE_STRUCT + && dynamic_template_type (type) != NULL) + || (TYPE_CODE (type) == TYPE_CODE_UNION + && ada_find_parallel_type (type, "___XVU") != NULL)) + { + *pos += 4; + return value_zero (to_static_fixed_type (type), not_lval); + } } arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside);