[pushed/Ada,3/3] ada_evaluate_subexp<OP_VAR_VALUE>: Avoid static fixing when possible.

Message ID 1408375844-28020-4-git-send-email-brobecker@adacore.com
State Committed
Headers

Commit Message

Joel Brobecker Aug. 18, 2014, 3:30 p.m. UTC
  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) <OP_VAR_VALUE>:
        When noside is EVAL_AVOID_SIDE_EFFECTS, only return a statically
        fixed value for records and unions for which some GNAT encodings
        are present.
---
 gdb/ChangeLog  |  7 +++++++
 gdb/ada-lang.c | 18 ++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 23bc214..4ca5ea8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@ 
 2014-08-18  Joel Brobecker  <brobecker@adacore.com>
 
+	* ada-lang.c (ada_evaluate_subexp) <OP_VAR_VALUE>:
+	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  <brobecker@adacore.com>
+
 	* ada-lang.c (ada_evaluate_subexp) <OP_VAR_VALUE>: Slight code
 	rewrite to avoid "else if" and "else" constructs.  Should be
 	a no-op in practice.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index a9b5e6f..c4e85d2 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);