xref: /dflybsd-src/contrib/gdb-7/gdb/ada-varobj.c (revision de8e141f24382815c10a4012d209bbbf7abf1112)
1*ef5ccd6cSJohn Marino /* varobj support for Ada.
2*ef5ccd6cSJohn Marino 
3*ef5ccd6cSJohn Marino    Copyright (C) 2012-2013 Free Software Foundation, Inc.
4*ef5ccd6cSJohn Marino 
5*ef5ccd6cSJohn Marino    This file is part of GDB.
6*ef5ccd6cSJohn Marino 
7*ef5ccd6cSJohn Marino    This program is free software; you can redistribute it and/or modify
8*ef5ccd6cSJohn Marino    it under the terms of the GNU General Public License as published by
9*ef5ccd6cSJohn Marino    the Free Software Foundation; either version 3 of the License, or
10*ef5ccd6cSJohn Marino    (at your option) any later version.
11*ef5ccd6cSJohn Marino 
12*ef5ccd6cSJohn Marino    This program is distributed in the hope that it will be useful,
13*ef5ccd6cSJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*ef5ccd6cSJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*ef5ccd6cSJohn Marino    GNU General Public License for more details.
16*ef5ccd6cSJohn Marino 
17*ef5ccd6cSJohn Marino    You should have received a copy of the GNU General Public License
18*ef5ccd6cSJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19*ef5ccd6cSJohn Marino 
20*ef5ccd6cSJohn Marino #include "defs.h"
21*ef5ccd6cSJohn Marino #include "ada-varobj.h"
22*ef5ccd6cSJohn Marino #include "ada-lang.h"
23*ef5ccd6cSJohn Marino #include "language.h"
24*ef5ccd6cSJohn Marino #include "valprint.h"
25*ef5ccd6cSJohn Marino 
26*ef5ccd6cSJohn Marino /* Implementation principle used in this unit:
27*ef5ccd6cSJohn Marino 
28*ef5ccd6cSJohn Marino    For our purposes, the meat of the varobj object is made of two
29*ef5ccd6cSJohn Marino    elements: The varobj's (struct) value, and the varobj's (struct)
30*ef5ccd6cSJohn Marino    type.  In most situations, the varobj has a non-NULL value, and
31*ef5ccd6cSJohn Marino    the type becomes redundant, as it can be directly derived from
32*ef5ccd6cSJohn Marino    the value.  In the initial implementation of this unit, most
33*ef5ccd6cSJohn Marino    routines would only take a value, and return a value.
34*ef5ccd6cSJohn Marino 
35*ef5ccd6cSJohn Marino    But there are many situations where it is possible for a varobj
36*ef5ccd6cSJohn Marino    to have a NULL value.  For instance, if the varobj becomes out of
37*ef5ccd6cSJohn Marino    scope.  Or better yet, when the varobj is the child of another
38*ef5ccd6cSJohn Marino    NULL pointer varobj.  In that situation, we must rely on the type
39*ef5ccd6cSJohn Marino    instead of the value to create the child varobj.
40*ef5ccd6cSJohn Marino 
41*ef5ccd6cSJohn Marino    That's why most functions below work with a (value, type) pair.
42*ef5ccd6cSJohn Marino    The value may or may not be NULL.  But the type is always expected
43*ef5ccd6cSJohn Marino    to be set.  When the value is NULL, then we work with the type
44*ef5ccd6cSJohn Marino    alone, and keep the value NULL.  But when the value is not NULL,
45*ef5ccd6cSJohn Marino    then we work using the value, because it provides more information.
46*ef5ccd6cSJohn Marino    But we still always set the type as well, even if that type could
47*ef5ccd6cSJohn Marino    easily be derived from the value.  The reason behind this is that
48*ef5ccd6cSJohn Marino    it allows the code to use the type without having to worry about
49*ef5ccd6cSJohn Marino    it being set or not.  It makes the code clearer.  */
50*ef5ccd6cSJohn Marino 
51*ef5ccd6cSJohn Marino /* A convenience function that decodes the VALUE_PTR/TYPE_PTR couple:
52*ef5ccd6cSJohn Marino    If there is a value (*VALUE_PTR not NULL), then perform the decoding
53*ef5ccd6cSJohn Marino    using it, and compute the associated type from the resulting value.
54*ef5ccd6cSJohn Marino    Otherwise, compute a static approximation of *TYPE_PTR, leaving
55*ef5ccd6cSJohn Marino    *VALUE_PTR unchanged.
56*ef5ccd6cSJohn Marino 
57*ef5ccd6cSJohn Marino    The results are written in place.  */
58*ef5ccd6cSJohn Marino 
59*ef5ccd6cSJohn Marino static void
ada_varobj_decode_var(struct value ** value_ptr,struct type ** type_ptr)60*ef5ccd6cSJohn Marino ada_varobj_decode_var (struct value **value_ptr, struct type **type_ptr)
61*ef5ccd6cSJohn Marino {
62*ef5ccd6cSJohn Marino   if (*value_ptr)
63*ef5ccd6cSJohn Marino     {
64*ef5ccd6cSJohn Marino       *value_ptr = ada_get_decoded_value (*value_ptr);
65*ef5ccd6cSJohn Marino       *type_ptr = ada_check_typedef (value_type (*value_ptr));
66*ef5ccd6cSJohn Marino     }
67*ef5ccd6cSJohn Marino   else
68*ef5ccd6cSJohn Marino     *type_ptr = ada_get_decoded_type (*type_ptr);
69*ef5ccd6cSJohn Marino }
70*ef5ccd6cSJohn Marino 
71*ef5ccd6cSJohn Marino /* Return a string containing an image of the given scalar value.
72*ef5ccd6cSJohn Marino    VAL is the numeric value, while TYPE is the value's type.
73*ef5ccd6cSJohn Marino    This is useful for plain integers, of course, but even more
74*ef5ccd6cSJohn Marino    so for enumerated types.
75*ef5ccd6cSJohn Marino 
76*ef5ccd6cSJohn Marino    The result should be deallocated by xfree after use.  */
77*ef5ccd6cSJohn Marino 
78*ef5ccd6cSJohn Marino static char *
ada_varobj_scalar_image(struct type * type,LONGEST val)79*ef5ccd6cSJohn Marino ada_varobj_scalar_image (struct type *type, LONGEST val)
80*ef5ccd6cSJohn Marino {
81*ef5ccd6cSJohn Marino   struct ui_file *buf = mem_fileopen ();
82*ef5ccd6cSJohn Marino   struct cleanup *cleanups = make_cleanup_ui_file_delete (buf);
83*ef5ccd6cSJohn Marino   char *result;
84*ef5ccd6cSJohn Marino 
85*ef5ccd6cSJohn Marino   ada_print_scalar (type, val, buf);
86*ef5ccd6cSJohn Marino   result = ui_file_xstrdup (buf, NULL);
87*ef5ccd6cSJohn Marino   do_cleanups (cleanups);
88*ef5ccd6cSJohn Marino 
89*ef5ccd6cSJohn Marino   return result;
90*ef5ccd6cSJohn Marino }
91*ef5ccd6cSJohn Marino 
92*ef5ccd6cSJohn Marino /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair designates
93*ef5ccd6cSJohn Marino    a struct or union, compute the (CHILD_VALUE, CHILD_TYPE) couple
94*ef5ccd6cSJohn Marino    corresponding to the field number FIELDNO.  */
95*ef5ccd6cSJohn Marino 
96*ef5ccd6cSJohn Marino static void
ada_varobj_struct_elt(struct value * parent_value,struct type * parent_type,int fieldno,struct value ** child_value,struct type ** child_type)97*ef5ccd6cSJohn Marino ada_varobj_struct_elt (struct value *parent_value,
98*ef5ccd6cSJohn Marino 		       struct type *parent_type,
99*ef5ccd6cSJohn Marino 		       int fieldno,
100*ef5ccd6cSJohn Marino 		       struct value **child_value,
101*ef5ccd6cSJohn Marino 		       struct type **child_type)
102*ef5ccd6cSJohn Marino {
103*ef5ccd6cSJohn Marino   struct value *value = NULL;
104*ef5ccd6cSJohn Marino   struct type *type = NULL;
105*ef5ccd6cSJohn Marino 
106*ef5ccd6cSJohn Marino   if (parent_value)
107*ef5ccd6cSJohn Marino     {
108*ef5ccd6cSJohn Marino       value = value_field (parent_value, fieldno);
109*ef5ccd6cSJohn Marino       type = value_type (value);
110*ef5ccd6cSJohn Marino     }
111*ef5ccd6cSJohn Marino   else
112*ef5ccd6cSJohn Marino     type = TYPE_FIELD_TYPE (parent_type, fieldno);
113*ef5ccd6cSJohn Marino 
114*ef5ccd6cSJohn Marino   if (child_value)
115*ef5ccd6cSJohn Marino     *child_value = value;
116*ef5ccd6cSJohn Marino   if (child_type)
117*ef5ccd6cSJohn Marino     *child_type = type;
118*ef5ccd6cSJohn Marino }
119*ef5ccd6cSJohn Marino 
120*ef5ccd6cSJohn Marino /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair is a pointer or
121*ef5ccd6cSJohn Marino    reference, return a (CHILD_VALUE, CHILD_TYPE) couple corresponding
122*ef5ccd6cSJohn Marino    to the dereferenced value.  */
123*ef5ccd6cSJohn Marino 
124*ef5ccd6cSJohn Marino static void
ada_varobj_ind(struct value * parent_value,struct type * parent_type,struct value ** child_value,struct type ** child_type)125*ef5ccd6cSJohn Marino ada_varobj_ind (struct value *parent_value,
126*ef5ccd6cSJohn Marino 		struct type *parent_type,
127*ef5ccd6cSJohn Marino 		struct value **child_value,
128*ef5ccd6cSJohn Marino 		struct type **child_type)
129*ef5ccd6cSJohn Marino {
130*ef5ccd6cSJohn Marino   struct value *value = NULL;
131*ef5ccd6cSJohn Marino   struct type *type = NULL;
132*ef5ccd6cSJohn Marino 
133*ef5ccd6cSJohn Marino   if (ada_is_array_descriptor_type (parent_type))
134*ef5ccd6cSJohn Marino     {
135*ef5ccd6cSJohn Marino       /* This can only happen when PARENT_VALUE is NULL.  Otherwise,
136*ef5ccd6cSJohn Marino 	 ada_get_decoded_value would have transformed our parent_type
137*ef5ccd6cSJohn Marino 	 into a simple array pointer type.  */
138*ef5ccd6cSJohn Marino       gdb_assert (parent_value == NULL);
139*ef5ccd6cSJohn Marino       gdb_assert (TYPE_CODE (parent_type) == TYPE_CODE_TYPEDEF);
140*ef5ccd6cSJohn Marino 
141*ef5ccd6cSJohn Marino       /* Decode parent_type by the equivalent pointer to (decoded)
142*ef5ccd6cSJohn Marino 	 array.  */
143*ef5ccd6cSJohn Marino       while (TYPE_CODE (parent_type) == TYPE_CODE_TYPEDEF)
144*ef5ccd6cSJohn Marino 	parent_type = TYPE_TARGET_TYPE (parent_type);
145*ef5ccd6cSJohn Marino       parent_type = ada_coerce_to_simple_array_type (parent_type);
146*ef5ccd6cSJohn Marino       parent_type = lookup_pointer_type (parent_type);
147*ef5ccd6cSJohn Marino     }
148*ef5ccd6cSJohn Marino 
149*ef5ccd6cSJohn Marino   /* If parent_value is a null pointer, then only perform static
150*ef5ccd6cSJohn Marino      dereferencing.  We cannot dereference null pointers.  */
151*ef5ccd6cSJohn Marino   if (parent_value && value_as_address (parent_value) == 0)
152*ef5ccd6cSJohn Marino     parent_value = NULL;
153*ef5ccd6cSJohn Marino 
154*ef5ccd6cSJohn Marino   if (parent_value)
155*ef5ccd6cSJohn Marino     {
156*ef5ccd6cSJohn Marino       value = ada_value_ind (parent_value);
157*ef5ccd6cSJohn Marino       type = value_type (value);
158*ef5ccd6cSJohn Marino     }
159*ef5ccd6cSJohn Marino   else
160*ef5ccd6cSJohn Marino     type = TYPE_TARGET_TYPE (parent_type);
161*ef5ccd6cSJohn Marino 
162*ef5ccd6cSJohn Marino   if (child_value)
163*ef5ccd6cSJohn Marino     *child_value = value;
164*ef5ccd6cSJohn Marino   if (child_type)
165*ef5ccd6cSJohn Marino     *child_type = type;
166*ef5ccd6cSJohn Marino }
167*ef5ccd6cSJohn Marino 
168*ef5ccd6cSJohn Marino /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair is a simple
169*ef5ccd6cSJohn Marino    array (TYPE_CODE_ARRAY), return the (CHILD_VALUE, CHILD_TYPE)
170*ef5ccd6cSJohn Marino    pair corresponding to the element at ELT_INDEX.  */
171*ef5ccd6cSJohn Marino 
172*ef5ccd6cSJohn Marino static void
ada_varobj_simple_array_elt(struct value * parent_value,struct type * parent_type,int elt_index,struct value ** child_value,struct type ** child_type)173*ef5ccd6cSJohn Marino ada_varobj_simple_array_elt (struct value *parent_value,
174*ef5ccd6cSJohn Marino 			     struct type *parent_type,
175*ef5ccd6cSJohn Marino 			     int elt_index,
176*ef5ccd6cSJohn Marino 			     struct value **child_value,
177*ef5ccd6cSJohn Marino 			     struct type **child_type)
178*ef5ccd6cSJohn Marino {
179*ef5ccd6cSJohn Marino   struct value *value = NULL;
180*ef5ccd6cSJohn Marino   struct type *type = NULL;
181*ef5ccd6cSJohn Marino 
182*ef5ccd6cSJohn Marino   if (parent_value)
183*ef5ccd6cSJohn Marino     {
184*ef5ccd6cSJohn Marino       struct value *index_value =
185*ef5ccd6cSJohn Marino 	value_from_longest (TYPE_INDEX_TYPE (parent_type), elt_index);
186*ef5ccd6cSJohn Marino 
187*ef5ccd6cSJohn Marino       value = ada_value_subscript (parent_value, 1, &index_value);
188*ef5ccd6cSJohn Marino       type = value_type (value);
189*ef5ccd6cSJohn Marino     }
190*ef5ccd6cSJohn Marino   else
191*ef5ccd6cSJohn Marino     type = TYPE_TARGET_TYPE (parent_type);
192*ef5ccd6cSJohn Marino 
193*ef5ccd6cSJohn Marino   if (child_value)
194*ef5ccd6cSJohn Marino     *child_value = value;
195*ef5ccd6cSJohn Marino   if (child_type)
196*ef5ccd6cSJohn Marino     *child_type = type;
197*ef5ccd6cSJohn Marino }
198*ef5ccd6cSJohn Marino 
199*ef5ccd6cSJohn Marino /* Given the decoded value and decoded type of a variable object,
200*ef5ccd6cSJohn Marino    adjust the value and type to those necessary for getting children
201*ef5ccd6cSJohn Marino    of the variable object.
202*ef5ccd6cSJohn Marino 
203*ef5ccd6cSJohn Marino    The replacement is performed in place.  */
204*ef5ccd6cSJohn Marino 
205*ef5ccd6cSJohn Marino static void
ada_varobj_adjust_for_child_access(struct value ** value,struct type ** type)206*ef5ccd6cSJohn Marino ada_varobj_adjust_for_child_access (struct value **value,
207*ef5ccd6cSJohn Marino 				    struct type **type)
208*ef5ccd6cSJohn Marino {
209*ef5ccd6cSJohn Marino    /* Pointers to struct/union types are special: Instead of having
210*ef5ccd6cSJohn Marino       one child (the struct), their children are the components of
211*ef5ccd6cSJohn Marino       the struct/union type.  We handle this situation by dereferencing
212*ef5ccd6cSJohn Marino       the (value, type) couple.  */
213*ef5ccd6cSJohn Marino   if (TYPE_CODE (*type) == TYPE_CODE_PTR
214*ef5ccd6cSJohn Marino       && (TYPE_CODE (TYPE_TARGET_TYPE (*type)) == TYPE_CODE_STRUCT
215*ef5ccd6cSJohn Marino           || TYPE_CODE (TYPE_TARGET_TYPE (*type)) == TYPE_CODE_UNION)
216*ef5ccd6cSJohn Marino       && !ada_is_array_descriptor_type (TYPE_TARGET_TYPE (*type))
217*ef5ccd6cSJohn Marino       && !ada_is_constrained_packed_array_type (TYPE_TARGET_TYPE (*type)))
218*ef5ccd6cSJohn Marino     ada_varobj_ind (*value, *type, value, type);
219*ef5ccd6cSJohn Marino }
220*ef5ccd6cSJohn Marino 
221*ef5ccd6cSJohn Marino /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair is an array
222*ef5ccd6cSJohn Marino    (any type of array, "simple" or not), return the number of children
223*ef5ccd6cSJohn Marino    that this array contains.  */
224*ef5ccd6cSJohn Marino 
225*ef5ccd6cSJohn Marino static int
ada_varobj_get_array_number_of_children(struct value * parent_value,struct type * parent_type)226*ef5ccd6cSJohn Marino ada_varobj_get_array_number_of_children (struct value *parent_value,
227*ef5ccd6cSJohn Marino 					 struct type *parent_type)
228*ef5ccd6cSJohn Marino {
229*ef5ccd6cSJohn Marino   LONGEST lo, hi;
230*ef5ccd6cSJohn Marino 
231*ef5ccd6cSJohn Marino   if (!get_array_bounds (parent_type, &lo, &hi))
232*ef5ccd6cSJohn Marino     {
233*ef5ccd6cSJohn Marino       /* Could not get the array bounds.  Pretend this is an empty array.  */
234*ef5ccd6cSJohn Marino       warning (_("unable to get bounds of array, assuming null array"));
235*ef5ccd6cSJohn Marino       return 0;
236*ef5ccd6cSJohn Marino     }
237*ef5ccd6cSJohn Marino 
238*ef5ccd6cSJohn Marino   /* Ada allows the upper bound to be less than the lower bound,
239*ef5ccd6cSJohn Marino      in order to specify empty arrays...  */
240*ef5ccd6cSJohn Marino   if (hi < lo)
241*ef5ccd6cSJohn Marino     return 0;
242*ef5ccd6cSJohn Marino 
243*ef5ccd6cSJohn Marino   return hi - lo + 1;
244*ef5ccd6cSJohn Marino }
245*ef5ccd6cSJohn Marino 
246*ef5ccd6cSJohn Marino /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair is a struct or
247*ef5ccd6cSJohn Marino    union, return the number of children this struct contains.  */
248*ef5ccd6cSJohn Marino 
249*ef5ccd6cSJohn Marino static int
ada_varobj_get_struct_number_of_children(struct value * parent_value,struct type * parent_type)250*ef5ccd6cSJohn Marino ada_varobj_get_struct_number_of_children (struct value *parent_value,
251*ef5ccd6cSJohn Marino 					  struct type *parent_type)
252*ef5ccd6cSJohn Marino {
253*ef5ccd6cSJohn Marino   int n_children = 0;
254*ef5ccd6cSJohn Marino   int i;
255*ef5ccd6cSJohn Marino 
256*ef5ccd6cSJohn Marino   gdb_assert (TYPE_CODE (parent_type) == TYPE_CODE_STRUCT
257*ef5ccd6cSJohn Marino 	      || TYPE_CODE (parent_type) == TYPE_CODE_UNION);
258*ef5ccd6cSJohn Marino 
259*ef5ccd6cSJohn Marino   for (i = 0; i < TYPE_NFIELDS (parent_type); i++)
260*ef5ccd6cSJohn Marino     {
261*ef5ccd6cSJohn Marino       if (ada_is_ignored_field (parent_type, i))
262*ef5ccd6cSJohn Marino 	continue;
263*ef5ccd6cSJohn Marino 
264*ef5ccd6cSJohn Marino       if (ada_is_wrapper_field (parent_type, i))
265*ef5ccd6cSJohn Marino 	{
266*ef5ccd6cSJohn Marino 	  struct value *elt_value;
267*ef5ccd6cSJohn Marino 	  struct type *elt_type;
268*ef5ccd6cSJohn Marino 
269*ef5ccd6cSJohn Marino 	  ada_varobj_struct_elt (parent_value, parent_type, i,
270*ef5ccd6cSJohn Marino 				 &elt_value, &elt_type);
271*ef5ccd6cSJohn Marino 	  if (ada_is_tagged_type (elt_type, 0))
272*ef5ccd6cSJohn Marino 	    {
273*ef5ccd6cSJohn Marino 	      /* We must not use ada_varobj_get_number_of_children
274*ef5ccd6cSJohn Marino 		 to determine is element's number of children, because
275*ef5ccd6cSJohn Marino 		 this function first calls ada_varobj_decode_var,
276*ef5ccd6cSJohn Marino 		 which "fixes" the element.  For tagged types, this
277*ef5ccd6cSJohn Marino 		 includes reading the object's tag to determine its
278*ef5ccd6cSJohn Marino 		 real type, which happens to be the parent_type, and
279*ef5ccd6cSJohn Marino 		 leads to an infinite loop (because the element gets
280*ef5ccd6cSJohn Marino 		 fixed back into the parent).  */
281*ef5ccd6cSJohn Marino 	      n_children += ada_varobj_get_struct_number_of_children
282*ef5ccd6cSJohn Marino 		(elt_value, elt_type);
283*ef5ccd6cSJohn Marino 	    }
284*ef5ccd6cSJohn Marino 	  else
285*ef5ccd6cSJohn Marino 	    n_children += ada_varobj_get_number_of_children (elt_value, elt_type);
286*ef5ccd6cSJohn Marino 	}
287*ef5ccd6cSJohn Marino       else if (ada_is_variant_part (parent_type, i))
288*ef5ccd6cSJohn Marino 	{
289*ef5ccd6cSJohn Marino 	  /* In normal situations, the variant part of the record should
290*ef5ccd6cSJohn Marino 	     have been "fixed". Or, in other words, it should have been
291*ef5ccd6cSJohn Marino 	     replaced by the branch of the variant part that is relevant
292*ef5ccd6cSJohn Marino 	     for our value.  But there are still situations where this
293*ef5ccd6cSJohn Marino 	     can happen, however (Eg. when our parent is a NULL pointer).
294*ef5ccd6cSJohn Marino 	     We do not support showing this part of the record for now,
295*ef5ccd6cSJohn Marino 	     so just pretend this field does not exist.  */
296*ef5ccd6cSJohn Marino 	}
297*ef5ccd6cSJohn Marino       else
298*ef5ccd6cSJohn Marino 	n_children++;
299*ef5ccd6cSJohn Marino     }
300*ef5ccd6cSJohn Marino 
301*ef5ccd6cSJohn Marino   return n_children;
302*ef5ccd6cSJohn Marino }
303*ef5ccd6cSJohn Marino 
304*ef5ccd6cSJohn Marino /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair designates
305*ef5ccd6cSJohn Marino    a pointer, return the number of children this pointer has.  */
306*ef5ccd6cSJohn Marino 
307*ef5ccd6cSJohn Marino static int
ada_varobj_get_ptr_number_of_children(struct value * parent_value,struct type * parent_type)308*ef5ccd6cSJohn Marino ada_varobj_get_ptr_number_of_children (struct value *parent_value,
309*ef5ccd6cSJohn Marino 				       struct type *parent_type)
310*ef5ccd6cSJohn Marino {
311*ef5ccd6cSJohn Marino   struct type *child_type = TYPE_TARGET_TYPE (parent_type);
312*ef5ccd6cSJohn Marino 
313*ef5ccd6cSJohn Marino   /* Pointer to functions and to void do not have a child, since
314*ef5ccd6cSJohn Marino      you cannot print what they point to.  */
315*ef5ccd6cSJohn Marino   if (TYPE_CODE (child_type) == TYPE_CODE_FUNC
316*ef5ccd6cSJohn Marino       || TYPE_CODE (child_type) == TYPE_CODE_VOID)
317*ef5ccd6cSJohn Marino     return 0;
318*ef5ccd6cSJohn Marino 
319*ef5ccd6cSJohn Marino   /* All other types have 1 child.  */
320*ef5ccd6cSJohn Marino   return 1;
321*ef5ccd6cSJohn Marino }
322*ef5ccd6cSJohn Marino 
323*ef5ccd6cSJohn Marino /* Return the number of children for the (PARENT_VALUE, PARENT_TYPE)
324*ef5ccd6cSJohn Marino    pair.  */
325*ef5ccd6cSJohn Marino 
326*ef5ccd6cSJohn Marino int
ada_varobj_get_number_of_children(struct value * parent_value,struct type * parent_type)327*ef5ccd6cSJohn Marino ada_varobj_get_number_of_children (struct value *parent_value,
328*ef5ccd6cSJohn Marino 				   struct type *parent_type)
329*ef5ccd6cSJohn Marino {
330*ef5ccd6cSJohn Marino   ada_varobj_decode_var (&parent_value, &parent_type);
331*ef5ccd6cSJohn Marino   ada_varobj_adjust_for_child_access (&parent_value, &parent_type);
332*ef5ccd6cSJohn Marino 
333*ef5ccd6cSJohn Marino   /* A typedef to an array descriptor in fact represents a pointer
334*ef5ccd6cSJohn Marino      to an unconstrained array.  These types always have one child
335*ef5ccd6cSJohn Marino      (the unconstrained array).  */
336*ef5ccd6cSJohn Marino   if (ada_is_array_descriptor_type (parent_type)
337*ef5ccd6cSJohn Marino       && TYPE_CODE (parent_type) == TYPE_CODE_TYPEDEF)
338*ef5ccd6cSJohn Marino     return 1;
339*ef5ccd6cSJohn Marino 
340*ef5ccd6cSJohn Marino   if (TYPE_CODE (parent_type) == TYPE_CODE_ARRAY)
341*ef5ccd6cSJohn Marino     return ada_varobj_get_array_number_of_children (parent_value,
342*ef5ccd6cSJohn Marino 						    parent_type);
343*ef5ccd6cSJohn Marino 
344*ef5ccd6cSJohn Marino   if (TYPE_CODE (parent_type) == TYPE_CODE_STRUCT
345*ef5ccd6cSJohn Marino       || TYPE_CODE (parent_type) == TYPE_CODE_UNION)
346*ef5ccd6cSJohn Marino     return ada_varobj_get_struct_number_of_children (parent_value,
347*ef5ccd6cSJohn Marino 						     parent_type);
348*ef5ccd6cSJohn Marino 
349*ef5ccd6cSJohn Marino   if (TYPE_CODE (parent_type) == TYPE_CODE_PTR)
350*ef5ccd6cSJohn Marino     return ada_varobj_get_ptr_number_of_children (parent_value,
351*ef5ccd6cSJohn Marino 						  parent_type);
352*ef5ccd6cSJohn Marino 
353*ef5ccd6cSJohn Marino   /* All other types have no child.  */
354*ef5ccd6cSJohn Marino   return 0;
355*ef5ccd6cSJohn Marino }
356*ef5ccd6cSJohn Marino 
357*ef5ccd6cSJohn Marino /* Describe the child of the (PARENT_VALUE, PARENT_TYPE) pair
358*ef5ccd6cSJohn Marino    whose index is CHILD_INDEX:
359*ef5ccd6cSJohn Marino 
360*ef5ccd6cSJohn Marino      - If CHILD_NAME is not NULL, then a copy of the child's name
361*ef5ccd6cSJohn Marino        is saved in *CHILD_NAME.  This copy must be deallocated
362*ef5ccd6cSJohn Marino        with xfree after use.
363*ef5ccd6cSJohn Marino 
364*ef5ccd6cSJohn Marino      - If CHILD_VALUE is not NULL, then save the child's value
365*ef5ccd6cSJohn Marino        in *CHILD_VALUE. Same thing for the child's type with
366*ef5ccd6cSJohn Marino        CHILD_TYPE if not NULL.
367*ef5ccd6cSJohn Marino 
368*ef5ccd6cSJohn Marino      - If CHILD_PATH_EXPR is not NULL, then compute the child's
369*ef5ccd6cSJohn Marino        path expression.  The resulting string must be deallocated
370*ef5ccd6cSJohn Marino        after use with xfree.
371*ef5ccd6cSJohn Marino 
372*ef5ccd6cSJohn Marino        Computing the child's path expression requires the PARENT_PATH_EXPR
373*ef5ccd6cSJohn Marino        to be non-NULL.  Otherwise, PARENT_PATH_EXPR may be null if
374*ef5ccd6cSJohn Marino        CHILD_PATH_EXPR is NULL.
375*ef5ccd6cSJohn Marino 
376*ef5ccd6cSJohn Marino   PARENT_NAME is the name of the parent, and should never be NULL.  */
377*ef5ccd6cSJohn Marino 
378*ef5ccd6cSJohn Marino static void ada_varobj_describe_child (struct value *parent_value,
379*ef5ccd6cSJohn Marino 				       struct type *parent_type,
380*ef5ccd6cSJohn Marino 				       const char *parent_name,
381*ef5ccd6cSJohn Marino 				       const char *parent_path_expr,
382*ef5ccd6cSJohn Marino 				       int child_index,
383*ef5ccd6cSJohn Marino 				       char **child_name,
384*ef5ccd6cSJohn Marino 				       struct value **child_value,
385*ef5ccd6cSJohn Marino 				       struct type **child_type,
386*ef5ccd6cSJohn Marino 				       char **child_path_expr);
387*ef5ccd6cSJohn Marino 
388*ef5ccd6cSJohn Marino /* Same as ada_varobj_describe_child, but limited to struct/union
389*ef5ccd6cSJohn Marino    objects.  */
390*ef5ccd6cSJohn Marino 
391*ef5ccd6cSJohn Marino static void
ada_varobj_describe_struct_child(struct value * parent_value,struct type * parent_type,const char * parent_name,const char * parent_path_expr,int child_index,char ** child_name,struct value ** child_value,struct type ** child_type,char ** child_path_expr)392*ef5ccd6cSJohn Marino ada_varobj_describe_struct_child (struct value *parent_value,
393*ef5ccd6cSJohn Marino 				  struct type *parent_type,
394*ef5ccd6cSJohn Marino 				  const char *parent_name,
395*ef5ccd6cSJohn Marino 				  const char *parent_path_expr,
396*ef5ccd6cSJohn Marino 				  int child_index,
397*ef5ccd6cSJohn Marino 				  char **child_name,
398*ef5ccd6cSJohn Marino 				  struct value **child_value,
399*ef5ccd6cSJohn Marino 				  struct type **child_type,
400*ef5ccd6cSJohn Marino 				  char **child_path_expr)
401*ef5ccd6cSJohn Marino {
402*ef5ccd6cSJohn Marino   int fieldno;
403*ef5ccd6cSJohn Marino   int childno = 0;
404*ef5ccd6cSJohn Marino 
405*ef5ccd6cSJohn Marino   gdb_assert (TYPE_CODE (parent_type) == TYPE_CODE_STRUCT);
406*ef5ccd6cSJohn Marino 
407*ef5ccd6cSJohn Marino   for (fieldno = 0; fieldno < TYPE_NFIELDS (parent_type); fieldno++)
408*ef5ccd6cSJohn Marino     {
409*ef5ccd6cSJohn Marino       if (ada_is_ignored_field (parent_type, fieldno))
410*ef5ccd6cSJohn Marino 	continue;
411*ef5ccd6cSJohn Marino 
412*ef5ccd6cSJohn Marino       if (ada_is_wrapper_field (parent_type, fieldno))
413*ef5ccd6cSJohn Marino 	{
414*ef5ccd6cSJohn Marino 	  struct value *elt_value;
415*ef5ccd6cSJohn Marino 	  struct type *elt_type;
416*ef5ccd6cSJohn Marino 	  int elt_n_children;
417*ef5ccd6cSJohn Marino 
418*ef5ccd6cSJohn Marino 	  ada_varobj_struct_elt (parent_value, parent_type, fieldno,
419*ef5ccd6cSJohn Marino 				 &elt_value, &elt_type);
420*ef5ccd6cSJohn Marino 	  if (ada_is_tagged_type (elt_type, 0))
421*ef5ccd6cSJohn Marino 	    {
422*ef5ccd6cSJohn Marino 	      /* Same as in ada_varobj_get_struct_number_of_children:
423*ef5ccd6cSJohn Marino 		 For tagged types, we must be careful to not call
424*ef5ccd6cSJohn Marino 		 ada_varobj_get_number_of_children, to prevent our
425*ef5ccd6cSJohn Marino 		 element from being fixed back into the parent.  */
426*ef5ccd6cSJohn Marino 	      elt_n_children = ada_varobj_get_struct_number_of_children
427*ef5ccd6cSJohn Marino 		(elt_value, elt_type);
428*ef5ccd6cSJohn Marino 	    }
429*ef5ccd6cSJohn Marino 	  else
430*ef5ccd6cSJohn Marino 	    elt_n_children =
431*ef5ccd6cSJohn Marino 	      ada_varobj_get_number_of_children (elt_value, elt_type);
432*ef5ccd6cSJohn Marino 
433*ef5ccd6cSJohn Marino 	  /* Is the child we're looking for one of the children
434*ef5ccd6cSJohn Marino 	     of this wrapper field?  */
435*ef5ccd6cSJohn Marino 	  if (child_index - childno < elt_n_children)
436*ef5ccd6cSJohn Marino 	    {
437*ef5ccd6cSJohn Marino 	      if (ada_is_tagged_type (elt_type, 0))
438*ef5ccd6cSJohn Marino 		{
439*ef5ccd6cSJohn Marino 		  /* Same as in ada_varobj_get_struct_number_of_children:
440*ef5ccd6cSJohn Marino 		     For tagged types, we must be careful to not call
441*ef5ccd6cSJohn Marino 		     ada_varobj_describe_child, to prevent our element
442*ef5ccd6cSJohn Marino 		     from being fixed back into the parent.  */
443*ef5ccd6cSJohn Marino 		  ada_varobj_describe_struct_child
444*ef5ccd6cSJohn Marino 		    (elt_value, elt_type, parent_name, parent_path_expr,
445*ef5ccd6cSJohn Marino 		     child_index - childno, child_name, child_value,
446*ef5ccd6cSJohn Marino 		     child_type, child_path_expr);
447*ef5ccd6cSJohn Marino 		}
448*ef5ccd6cSJohn Marino 	      else
449*ef5ccd6cSJohn Marino 		ada_varobj_describe_child (elt_value, elt_type,
450*ef5ccd6cSJohn Marino 					   parent_name, parent_path_expr,
451*ef5ccd6cSJohn Marino 					   child_index - childno,
452*ef5ccd6cSJohn Marino 					   child_name, child_value,
453*ef5ccd6cSJohn Marino 					   child_type, child_path_expr);
454*ef5ccd6cSJohn Marino 	      return;
455*ef5ccd6cSJohn Marino 	    }
456*ef5ccd6cSJohn Marino 
457*ef5ccd6cSJohn Marino 	  /* The child we're looking for is beyond this wrapper
458*ef5ccd6cSJohn Marino 	     field, so skip all its children.  */
459*ef5ccd6cSJohn Marino 	  childno += elt_n_children;
460*ef5ccd6cSJohn Marino 	  continue;
461*ef5ccd6cSJohn Marino 	}
462*ef5ccd6cSJohn Marino       else if (ada_is_variant_part (parent_type, fieldno))
463*ef5ccd6cSJohn Marino 	{
464*ef5ccd6cSJohn Marino 	  /* In normal situations, the variant part of the record should
465*ef5ccd6cSJohn Marino 	     have been "fixed". Or, in other words, it should have been
466*ef5ccd6cSJohn Marino 	     replaced by the branch of the variant part that is relevant
467*ef5ccd6cSJohn Marino 	     for our value.  But there are still situations where this
468*ef5ccd6cSJohn Marino 	     can happen, however (Eg. when our parent is a NULL pointer).
469*ef5ccd6cSJohn Marino 	     We do not support showing this part of the record for now,
470*ef5ccd6cSJohn Marino 	     so just pretend this field does not exist.  */
471*ef5ccd6cSJohn Marino 	  continue;
472*ef5ccd6cSJohn Marino 	}
473*ef5ccd6cSJohn Marino 
474*ef5ccd6cSJohn Marino       if (childno == child_index)
475*ef5ccd6cSJohn Marino 	{
476*ef5ccd6cSJohn Marino 	  if (child_name)
477*ef5ccd6cSJohn Marino 	    {
478*ef5ccd6cSJohn Marino 	      /* The name of the child is none other than the field's
479*ef5ccd6cSJohn Marino 		 name, except that we need to strip suffixes from it.
480*ef5ccd6cSJohn Marino 		 For instance, fields with alignment constraints will
481*ef5ccd6cSJohn Marino 		 have an __XVA suffix added to them.  */
482*ef5ccd6cSJohn Marino 	      const char *field_name = TYPE_FIELD_NAME (parent_type, fieldno);
483*ef5ccd6cSJohn Marino 	      int child_name_len = ada_name_prefix_len (field_name);
484*ef5ccd6cSJohn Marino 
485*ef5ccd6cSJohn Marino 	      *child_name = xstrprintf ("%.*s", child_name_len, field_name);
486*ef5ccd6cSJohn Marino 	    }
487*ef5ccd6cSJohn Marino 
488*ef5ccd6cSJohn Marino 	  if (child_value && parent_value)
489*ef5ccd6cSJohn Marino 	    ada_varobj_struct_elt (parent_value, parent_type, fieldno,
490*ef5ccd6cSJohn Marino 				   child_value, NULL);
491*ef5ccd6cSJohn Marino 
492*ef5ccd6cSJohn Marino 	  if (child_type)
493*ef5ccd6cSJohn Marino 	    ada_varobj_struct_elt (parent_value, parent_type, fieldno,
494*ef5ccd6cSJohn Marino 				   NULL, child_type);
495*ef5ccd6cSJohn Marino 
496*ef5ccd6cSJohn Marino 	  if (child_path_expr)
497*ef5ccd6cSJohn Marino 	    {
498*ef5ccd6cSJohn Marino 	      /* The name of the child is none other than the field's
499*ef5ccd6cSJohn Marino 		 name, except that we need to strip suffixes from it.
500*ef5ccd6cSJohn Marino 		 For instance, fields with alignment constraints will
501*ef5ccd6cSJohn Marino 		 have an __XVA suffix added to them.  */
502*ef5ccd6cSJohn Marino 	      const char *field_name = TYPE_FIELD_NAME (parent_type, fieldno);
503*ef5ccd6cSJohn Marino 	      int child_name_len = ada_name_prefix_len (field_name);
504*ef5ccd6cSJohn Marino 
505*ef5ccd6cSJohn Marino 	      *child_path_expr =
506*ef5ccd6cSJohn Marino 		xstrprintf ("(%s).%.*s", parent_path_expr,
507*ef5ccd6cSJohn Marino 			    child_name_len, field_name);
508*ef5ccd6cSJohn Marino 	    }
509*ef5ccd6cSJohn Marino 
510*ef5ccd6cSJohn Marino 	  return;
511*ef5ccd6cSJohn Marino 	}
512*ef5ccd6cSJohn Marino 
513*ef5ccd6cSJohn Marino       childno++;
514*ef5ccd6cSJohn Marino     }
515*ef5ccd6cSJohn Marino 
516*ef5ccd6cSJohn Marino   /* Something went wrong.  Either we miscounted the number of
517*ef5ccd6cSJohn Marino      children, or CHILD_INDEX was too high.  But we should never
518*ef5ccd6cSJohn Marino      reach here.  We don't have enough information to recover
519*ef5ccd6cSJohn Marino      nicely, so just raise an assertion failure.  */
520*ef5ccd6cSJohn Marino   gdb_assert_not_reached ("unexpected code path");
521*ef5ccd6cSJohn Marino }
522*ef5ccd6cSJohn Marino 
523*ef5ccd6cSJohn Marino /* Same as ada_varobj_describe_child, but limited to pointer objects.
524*ef5ccd6cSJohn Marino 
525*ef5ccd6cSJohn Marino    Note that CHILD_INDEX is unused in this situation, but still provided
526*ef5ccd6cSJohn Marino    for consistency of interface with other routines describing an object's
527*ef5ccd6cSJohn Marino    child.  */
528*ef5ccd6cSJohn Marino 
529*ef5ccd6cSJohn Marino static void
ada_varobj_describe_ptr_child(struct value * parent_value,struct type * parent_type,const char * parent_name,const char * parent_path_expr,int child_index,char ** child_name,struct value ** child_value,struct type ** child_type,char ** child_path_expr)530*ef5ccd6cSJohn Marino ada_varobj_describe_ptr_child (struct value *parent_value,
531*ef5ccd6cSJohn Marino 			       struct type *parent_type,
532*ef5ccd6cSJohn Marino 			       const char *parent_name,
533*ef5ccd6cSJohn Marino 			       const char *parent_path_expr,
534*ef5ccd6cSJohn Marino 			       int child_index,
535*ef5ccd6cSJohn Marino 			       char **child_name,
536*ef5ccd6cSJohn Marino 			       struct value **child_value,
537*ef5ccd6cSJohn Marino 			       struct type **child_type,
538*ef5ccd6cSJohn Marino 			       char **child_path_expr)
539*ef5ccd6cSJohn Marino {
540*ef5ccd6cSJohn Marino   if (child_name)
541*ef5ccd6cSJohn Marino     *child_name = xstrprintf ("%s.all", parent_name);
542*ef5ccd6cSJohn Marino 
543*ef5ccd6cSJohn Marino   if (child_value && parent_value)
544*ef5ccd6cSJohn Marino     ada_varobj_ind (parent_value, parent_type, child_value, NULL);
545*ef5ccd6cSJohn Marino 
546*ef5ccd6cSJohn Marino   if (child_type)
547*ef5ccd6cSJohn Marino     ada_varobj_ind (parent_value, parent_type, NULL, child_type);
548*ef5ccd6cSJohn Marino 
549*ef5ccd6cSJohn Marino   if (child_path_expr)
550*ef5ccd6cSJohn Marino     *child_path_expr = xstrprintf ("(%s).all", parent_path_expr);
551*ef5ccd6cSJohn Marino }
552*ef5ccd6cSJohn Marino 
553*ef5ccd6cSJohn Marino /* Same as ada_varobj_describe_child, limited to simple array objects
554*ef5ccd6cSJohn Marino    (TYPE_CODE_ARRAY only).
555*ef5ccd6cSJohn Marino 
556*ef5ccd6cSJohn Marino    Assumes that the (PARENT_VALUE, PARENT_TYPE) pair is properly decoded.
557*ef5ccd6cSJohn Marino    This is done by ada_varobj_describe_child before calling us.  */
558*ef5ccd6cSJohn Marino 
559*ef5ccd6cSJohn Marino static void
ada_varobj_describe_simple_array_child(struct value * parent_value,struct type * parent_type,const char * parent_name,const char * parent_path_expr,int child_index,char ** child_name,struct value ** child_value,struct type ** child_type,char ** child_path_expr)560*ef5ccd6cSJohn Marino ada_varobj_describe_simple_array_child (struct value *parent_value,
561*ef5ccd6cSJohn Marino 					struct type *parent_type,
562*ef5ccd6cSJohn Marino 					const char *parent_name,
563*ef5ccd6cSJohn Marino 					const char *parent_path_expr,
564*ef5ccd6cSJohn Marino 					int child_index,
565*ef5ccd6cSJohn Marino 					char **child_name,
566*ef5ccd6cSJohn Marino 					struct value **child_value,
567*ef5ccd6cSJohn Marino 					struct type **child_type,
568*ef5ccd6cSJohn Marino 					char **child_path_expr)
569*ef5ccd6cSJohn Marino {
570*ef5ccd6cSJohn Marino   struct type *index_desc_type;
571*ef5ccd6cSJohn Marino   struct type *index_type;
572*ef5ccd6cSJohn Marino   int real_index;
573*ef5ccd6cSJohn Marino 
574*ef5ccd6cSJohn Marino   gdb_assert (TYPE_CODE (parent_type) == TYPE_CODE_ARRAY);
575*ef5ccd6cSJohn Marino 
576*ef5ccd6cSJohn Marino   index_desc_type = ada_find_parallel_type (parent_type, "___XA");
577*ef5ccd6cSJohn Marino   ada_fixup_array_indexes_type (index_desc_type);
578*ef5ccd6cSJohn Marino   if (index_desc_type)
579*ef5ccd6cSJohn Marino     index_type = TYPE_FIELD_TYPE (index_desc_type, 0);
580*ef5ccd6cSJohn Marino   else
581*ef5ccd6cSJohn Marino     index_type = TYPE_INDEX_TYPE (parent_type);
582*ef5ccd6cSJohn Marino   real_index = child_index + ada_discrete_type_low_bound (index_type);
583*ef5ccd6cSJohn Marino 
584*ef5ccd6cSJohn Marino   if (child_name)
585*ef5ccd6cSJohn Marino     *child_name = ada_varobj_scalar_image (index_type, real_index);
586*ef5ccd6cSJohn Marino 
587*ef5ccd6cSJohn Marino   if (child_value && parent_value)
588*ef5ccd6cSJohn Marino     ada_varobj_simple_array_elt (parent_value, parent_type, real_index,
589*ef5ccd6cSJohn Marino 				 child_value, NULL);
590*ef5ccd6cSJohn Marino 
591*ef5ccd6cSJohn Marino   if (child_type)
592*ef5ccd6cSJohn Marino     ada_varobj_simple_array_elt (parent_value, parent_type, real_index,
593*ef5ccd6cSJohn Marino 				 NULL, child_type);
594*ef5ccd6cSJohn Marino 
595*ef5ccd6cSJohn Marino   if (child_path_expr)
596*ef5ccd6cSJohn Marino     {
597*ef5ccd6cSJohn Marino       char *index_img = ada_varobj_scalar_image (index_type, real_index);
598*ef5ccd6cSJohn Marino       struct cleanup *cleanups = make_cleanup (xfree, index_img);
599*ef5ccd6cSJohn Marino 
600*ef5ccd6cSJohn Marino       /* Enumeration litterals by themselves are potentially ambiguous.
601*ef5ccd6cSJohn Marino 	 For instance, consider the following package spec:
602*ef5ccd6cSJohn Marino 
603*ef5ccd6cSJohn Marino 	    package Pck is
604*ef5ccd6cSJohn Marino 	       type Color is (Red, Green, Blue, White);
605*ef5ccd6cSJohn Marino 	       type Blood_Cells is (White, Red);
606*ef5ccd6cSJohn Marino 	    end Pck;
607*ef5ccd6cSJohn Marino 
608*ef5ccd6cSJohn Marino 	 In this case, the litteral "red" for instance, or even
609*ef5ccd6cSJohn Marino 	 the fully-qualified litteral "pck.red" cannot be resolved
610*ef5ccd6cSJohn Marino 	 by itself.  Type qualification is needed to determine which
611*ef5ccd6cSJohn Marino 	 enumeration litterals should be used.
612*ef5ccd6cSJohn Marino 
613*ef5ccd6cSJohn Marino 	 The following variable will be used to contain the name
614*ef5ccd6cSJohn Marino 	 of the array index type when such type qualification is
615*ef5ccd6cSJohn Marino 	 needed.  */
616*ef5ccd6cSJohn Marino       const char *index_type_name = NULL;
617*ef5ccd6cSJohn Marino 
618*ef5ccd6cSJohn Marino       /* If the index type is a range type, find the base type.  */
619*ef5ccd6cSJohn Marino       while (TYPE_CODE (index_type) == TYPE_CODE_RANGE)
620*ef5ccd6cSJohn Marino 	index_type = TYPE_TARGET_TYPE (index_type);
621*ef5ccd6cSJohn Marino 
622*ef5ccd6cSJohn Marino       if (TYPE_CODE (index_type) == TYPE_CODE_ENUM
623*ef5ccd6cSJohn Marino 	  || TYPE_CODE (index_type) == TYPE_CODE_BOOL)
624*ef5ccd6cSJohn Marino 	{
625*ef5ccd6cSJohn Marino 	  index_type_name = ada_type_name (index_type);
626*ef5ccd6cSJohn Marino 	  if (index_type_name)
627*ef5ccd6cSJohn Marino 	    index_type_name = ada_decode (index_type_name);
628*ef5ccd6cSJohn Marino 	}
629*ef5ccd6cSJohn Marino 
630*ef5ccd6cSJohn Marino       if (index_type_name != NULL)
631*ef5ccd6cSJohn Marino 	*child_path_expr =
632*ef5ccd6cSJohn Marino 	  xstrprintf ("(%s)(%.*s'(%s))", parent_path_expr,
633*ef5ccd6cSJohn Marino 		      ada_name_prefix_len (index_type_name),
634*ef5ccd6cSJohn Marino 		      index_type_name, index_img);
635*ef5ccd6cSJohn Marino       else
636*ef5ccd6cSJohn Marino 	*child_path_expr =
637*ef5ccd6cSJohn Marino 	  xstrprintf ("(%s)(%s)", parent_path_expr, index_img);
638*ef5ccd6cSJohn Marino       do_cleanups (cleanups);
639*ef5ccd6cSJohn Marino     }
640*ef5ccd6cSJohn Marino }
641*ef5ccd6cSJohn Marino 
642*ef5ccd6cSJohn Marino /* See description at declaration above.  */
643*ef5ccd6cSJohn Marino 
644*ef5ccd6cSJohn Marino static void
ada_varobj_describe_child(struct value * parent_value,struct type * parent_type,const char * parent_name,const char * parent_path_expr,int child_index,char ** child_name,struct value ** child_value,struct type ** child_type,char ** child_path_expr)645*ef5ccd6cSJohn Marino ada_varobj_describe_child (struct value *parent_value,
646*ef5ccd6cSJohn Marino 			   struct type *parent_type,
647*ef5ccd6cSJohn Marino 			   const char *parent_name,
648*ef5ccd6cSJohn Marino 			   const char *parent_path_expr,
649*ef5ccd6cSJohn Marino 			   int child_index,
650*ef5ccd6cSJohn Marino 			   char **child_name,
651*ef5ccd6cSJohn Marino 			   struct value **child_value,
652*ef5ccd6cSJohn Marino 			   struct type **child_type,
653*ef5ccd6cSJohn Marino 			   char **child_path_expr)
654*ef5ccd6cSJohn Marino {
655*ef5ccd6cSJohn Marino   /* We cannot compute the child's path expression without
656*ef5ccd6cSJohn Marino      the parent's path expression.  This is a pre-condition
657*ef5ccd6cSJohn Marino      for calling this function.  */
658*ef5ccd6cSJohn Marino   if (child_path_expr)
659*ef5ccd6cSJohn Marino     gdb_assert (parent_path_expr != NULL);
660*ef5ccd6cSJohn Marino 
661*ef5ccd6cSJohn Marino   ada_varobj_decode_var (&parent_value, &parent_type);
662*ef5ccd6cSJohn Marino   ada_varobj_adjust_for_child_access (&parent_value, &parent_type);
663*ef5ccd6cSJohn Marino 
664*ef5ccd6cSJohn Marino   if (child_name)
665*ef5ccd6cSJohn Marino     *child_name = NULL;
666*ef5ccd6cSJohn Marino   if (child_value)
667*ef5ccd6cSJohn Marino     *child_value = NULL;
668*ef5ccd6cSJohn Marino   if (child_type)
669*ef5ccd6cSJohn Marino     *child_type = NULL;
670*ef5ccd6cSJohn Marino   if (child_path_expr)
671*ef5ccd6cSJohn Marino     *child_path_expr = NULL;
672*ef5ccd6cSJohn Marino 
673*ef5ccd6cSJohn Marino   if (ada_is_array_descriptor_type (parent_type)
674*ef5ccd6cSJohn Marino       && TYPE_CODE (parent_type) == TYPE_CODE_TYPEDEF)
675*ef5ccd6cSJohn Marino     {
676*ef5ccd6cSJohn Marino       ada_varobj_describe_ptr_child (parent_value, parent_type,
677*ef5ccd6cSJohn Marino 				     parent_name, parent_path_expr,
678*ef5ccd6cSJohn Marino 				     child_index, child_name,
679*ef5ccd6cSJohn Marino 				     child_value, child_type,
680*ef5ccd6cSJohn Marino 				     child_path_expr);
681*ef5ccd6cSJohn Marino       return;
682*ef5ccd6cSJohn Marino     }
683*ef5ccd6cSJohn Marino 
684*ef5ccd6cSJohn Marino   if (TYPE_CODE (parent_type) == TYPE_CODE_ARRAY)
685*ef5ccd6cSJohn Marino     {
686*ef5ccd6cSJohn Marino       ada_varobj_describe_simple_array_child
687*ef5ccd6cSJohn Marino 	(parent_value, parent_type, parent_name, parent_path_expr,
688*ef5ccd6cSJohn Marino 	 child_index, child_name, child_value, child_type,
689*ef5ccd6cSJohn Marino 	 child_path_expr);
690*ef5ccd6cSJohn Marino       return;
691*ef5ccd6cSJohn Marino     }
692*ef5ccd6cSJohn Marino 
693*ef5ccd6cSJohn Marino   if (TYPE_CODE (parent_type) == TYPE_CODE_STRUCT)
694*ef5ccd6cSJohn Marino     {
695*ef5ccd6cSJohn Marino       ada_varobj_describe_struct_child (parent_value, parent_type,
696*ef5ccd6cSJohn Marino 					parent_name, parent_path_expr,
697*ef5ccd6cSJohn Marino 					child_index, child_name,
698*ef5ccd6cSJohn Marino 					child_value, child_type,
699*ef5ccd6cSJohn Marino 					child_path_expr);
700*ef5ccd6cSJohn Marino       return;
701*ef5ccd6cSJohn Marino     }
702*ef5ccd6cSJohn Marino 
703*ef5ccd6cSJohn Marino   if (TYPE_CODE (parent_type) == TYPE_CODE_PTR)
704*ef5ccd6cSJohn Marino     {
705*ef5ccd6cSJohn Marino       ada_varobj_describe_ptr_child (parent_value, parent_type,
706*ef5ccd6cSJohn Marino 				     parent_name, parent_path_expr,
707*ef5ccd6cSJohn Marino 				     child_index, child_name,
708*ef5ccd6cSJohn Marino 				     child_value, child_type,
709*ef5ccd6cSJohn Marino 				     child_path_expr);
710*ef5ccd6cSJohn Marino       return;
711*ef5ccd6cSJohn Marino     }
712*ef5ccd6cSJohn Marino 
713*ef5ccd6cSJohn Marino   /* It should never happen.  But rather than crash, report dummy names
714*ef5ccd6cSJohn Marino      and return a NULL child_value.  */
715*ef5ccd6cSJohn Marino   if (child_name)
716*ef5ccd6cSJohn Marino     *child_name = xstrdup ("???");
717*ef5ccd6cSJohn Marino }
718*ef5ccd6cSJohn Marino 
719*ef5ccd6cSJohn Marino /* Return the name of the child number CHILD_INDEX of the (PARENT_VALUE,
720*ef5ccd6cSJohn Marino    PARENT_TYPE) pair.  PARENT_NAME is the name of the PARENT.
721*ef5ccd6cSJohn Marino 
722*ef5ccd6cSJohn Marino    The result should be deallocated after use with xfree.  */
723*ef5ccd6cSJohn Marino 
724*ef5ccd6cSJohn Marino char *
ada_varobj_get_name_of_child(struct value * parent_value,struct type * parent_type,const char * parent_name,int child_index)725*ef5ccd6cSJohn Marino ada_varobj_get_name_of_child (struct value *parent_value,
726*ef5ccd6cSJohn Marino 			      struct type *parent_type,
727*ef5ccd6cSJohn Marino 			      const char *parent_name, int child_index)
728*ef5ccd6cSJohn Marino {
729*ef5ccd6cSJohn Marino   char *child_name;
730*ef5ccd6cSJohn Marino 
731*ef5ccd6cSJohn Marino   ada_varobj_describe_child (parent_value, parent_type, parent_name,
732*ef5ccd6cSJohn Marino 			     NULL, child_index, &child_name, NULL,
733*ef5ccd6cSJohn Marino 			     NULL, NULL);
734*ef5ccd6cSJohn Marino   return child_name;
735*ef5ccd6cSJohn Marino }
736*ef5ccd6cSJohn Marino 
737*ef5ccd6cSJohn Marino /* Return the path expression of the child number CHILD_INDEX of
738*ef5ccd6cSJohn Marino    the (PARENT_VALUE, PARENT_TYPE) pair.  PARENT_NAME is the name
739*ef5ccd6cSJohn Marino    of the parent, and PARENT_PATH_EXPR is the parent's path expression.
740*ef5ccd6cSJohn Marino    Both must be non-NULL.
741*ef5ccd6cSJohn Marino 
742*ef5ccd6cSJohn Marino    The result must be deallocated after use with xfree.  */
743*ef5ccd6cSJohn Marino 
744*ef5ccd6cSJohn Marino char *
ada_varobj_get_path_expr_of_child(struct value * parent_value,struct type * parent_type,const char * parent_name,const char * parent_path_expr,int child_index)745*ef5ccd6cSJohn Marino ada_varobj_get_path_expr_of_child (struct value *parent_value,
746*ef5ccd6cSJohn Marino 				   struct type *parent_type,
747*ef5ccd6cSJohn Marino 				   const char *parent_name,
748*ef5ccd6cSJohn Marino 				   const char *parent_path_expr,
749*ef5ccd6cSJohn Marino 				   int child_index)
750*ef5ccd6cSJohn Marino {
751*ef5ccd6cSJohn Marino   char *child_path_expr;
752*ef5ccd6cSJohn Marino 
753*ef5ccd6cSJohn Marino   ada_varobj_describe_child (parent_value, parent_type, parent_name,
754*ef5ccd6cSJohn Marino 			     parent_path_expr, child_index, NULL,
755*ef5ccd6cSJohn Marino 			     NULL, NULL, &child_path_expr);
756*ef5ccd6cSJohn Marino 
757*ef5ccd6cSJohn Marino   return child_path_expr;
758*ef5ccd6cSJohn Marino }
759*ef5ccd6cSJohn Marino 
760*ef5ccd6cSJohn Marino /* Return the value of child number CHILD_INDEX of the (PARENT_VALUE,
761*ef5ccd6cSJohn Marino    PARENT_TYPE) pair.  PARENT_NAME is the name of the parent.  */
762*ef5ccd6cSJohn Marino 
763*ef5ccd6cSJohn Marino struct value *
ada_varobj_get_value_of_child(struct value * parent_value,struct type * parent_type,const char * parent_name,int child_index)764*ef5ccd6cSJohn Marino ada_varobj_get_value_of_child (struct value *parent_value,
765*ef5ccd6cSJohn Marino 			       struct type *parent_type,
766*ef5ccd6cSJohn Marino 			       const char *parent_name, int child_index)
767*ef5ccd6cSJohn Marino {
768*ef5ccd6cSJohn Marino   struct value *child_value;
769*ef5ccd6cSJohn Marino 
770*ef5ccd6cSJohn Marino   ada_varobj_describe_child (parent_value, parent_type, parent_name,
771*ef5ccd6cSJohn Marino 			     NULL, child_index, NULL, &child_value,
772*ef5ccd6cSJohn Marino 			     NULL, NULL);
773*ef5ccd6cSJohn Marino 
774*ef5ccd6cSJohn Marino   return child_value;
775*ef5ccd6cSJohn Marino }
776*ef5ccd6cSJohn Marino 
777*ef5ccd6cSJohn Marino /* Return the type of child number CHILD_INDEX of the (PARENT_VALUE,
778*ef5ccd6cSJohn Marino    PARENT_TYPE) pair.  */
779*ef5ccd6cSJohn Marino 
780*ef5ccd6cSJohn Marino struct type *
ada_varobj_get_type_of_child(struct value * parent_value,struct type * parent_type,int child_index)781*ef5ccd6cSJohn Marino ada_varobj_get_type_of_child (struct value *parent_value,
782*ef5ccd6cSJohn Marino 			      struct type *parent_type,
783*ef5ccd6cSJohn Marino 			      int child_index)
784*ef5ccd6cSJohn Marino {
785*ef5ccd6cSJohn Marino   struct type *child_type;
786*ef5ccd6cSJohn Marino 
787*ef5ccd6cSJohn Marino   ada_varobj_describe_child (parent_value, parent_type, NULL, NULL,
788*ef5ccd6cSJohn Marino 			     child_index, NULL, NULL, &child_type, NULL);
789*ef5ccd6cSJohn Marino 
790*ef5ccd6cSJohn Marino   return child_type;
791*ef5ccd6cSJohn Marino }
792*ef5ccd6cSJohn Marino 
793*ef5ccd6cSJohn Marino /* Return a string that contains the image of the given VALUE, using
794*ef5ccd6cSJohn Marino    the print options OPTS as the options for formatting the result.
795*ef5ccd6cSJohn Marino 
796*ef5ccd6cSJohn Marino    The resulting string must be deallocated after use with xfree.  */
797*ef5ccd6cSJohn Marino 
798*ef5ccd6cSJohn Marino static char *
ada_varobj_get_value_image(struct value * value,struct value_print_options * opts)799*ef5ccd6cSJohn Marino ada_varobj_get_value_image (struct value *value,
800*ef5ccd6cSJohn Marino 			    struct value_print_options *opts)
801*ef5ccd6cSJohn Marino {
802*ef5ccd6cSJohn Marino   char *result;
803*ef5ccd6cSJohn Marino   struct ui_file *buffer;
804*ef5ccd6cSJohn Marino   struct cleanup *old_chain;
805*ef5ccd6cSJohn Marino 
806*ef5ccd6cSJohn Marino   buffer = mem_fileopen ();
807*ef5ccd6cSJohn Marino   old_chain = make_cleanup_ui_file_delete (buffer);
808*ef5ccd6cSJohn Marino 
809*ef5ccd6cSJohn Marino   common_val_print (value, buffer, 0, opts, current_language);
810*ef5ccd6cSJohn Marino   result = ui_file_xstrdup (buffer, NULL);
811*ef5ccd6cSJohn Marino 
812*ef5ccd6cSJohn Marino   do_cleanups (old_chain);
813*ef5ccd6cSJohn Marino   return result;
814*ef5ccd6cSJohn Marino }
815*ef5ccd6cSJohn Marino 
816*ef5ccd6cSJohn Marino /* Assuming that the (VALUE, TYPE) pair designates an array varobj,
817*ef5ccd6cSJohn Marino    return a string that is suitable for use in the "value" field of
818*ef5ccd6cSJohn Marino    the varobj output.  Most of the time, this is the number of elements
819*ef5ccd6cSJohn Marino    in the array inside square brackets, but there are situations where
820*ef5ccd6cSJohn Marino    it's useful to add more info.
821*ef5ccd6cSJohn Marino 
822*ef5ccd6cSJohn Marino    OPTS are the print options used when formatting the result.
823*ef5ccd6cSJohn Marino 
824*ef5ccd6cSJohn Marino    The result should be deallocated after use using xfree.  */
825*ef5ccd6cSJohn Marino 
826*ef5ccd6cSJohn Marino static char *
ada_varobj_get_value_of_array_variable(struct value * value,struct type * type,struct value_print_options * opts)827*ef5ccd6cSJohn Marino ada_varobj_get_value_of_array_variable (struct value *value,
828*ef5ccd6cSJohn Marino 					struct type *type,
829*ef5ccd6cSJohn Marino 					struct value_print_options *opts)
830*ef5ccd6cSJohn Marino {
831*ef5ccd6cSJohn Marino   char *result;
832*ef5ccd6cSJohn Marino   const int numchild = ada_varobj_get_array_number_of_children (value, type);
833*ef5ccd6cSJohn Marino 
834*ef5ccd6cSJohn Marino   /* If we have a string, provide its contents in the "value" field.
835*ef5ccd6cSJohn Marino      Otherwise, the only other way to inspect the contents of the string
836*ef5ccd6cSJohn Marino      is by looking at the value of each element, as in any other array,
837*ef5ccd6cSJohn Marino      which is not very convenient...  */
838*ef5ccd6cSJohn Marino   if (value
839*ef5ccd6cSJohn Marino       && ada_is_string_type (type)
840*ef5ccd6cSJohn Marino       && (opts->format == 0 || opts->format == 's'))
841*ef5ccd6cSJohn Marino     {
842*ef5ccd6cSJohn Marino       char *str;
843*ef5ccd6cSJohn Marino       struct cleanup *old_chain;
844*ef5ccd6cSJohn Marino 
845*ef5ccd6cSJohn Marino       str = ada_varobj_get_value_image (value, opts);
846*ef5ccd6cSJohn Marino       old_chain = make_cleanup (xfree, str);
847*ef5ccd6cSJohn Marino       result = xstrprintf ("[%d] %s", numchild, str);
848*ef5ccd6cSJohn Marino       do_cleanups (old_chain);
849*ef5ccd6cSJohn Marino     }
850*ef5ccd6cSJohn Marino   else
851*ef5ccd6cSJohn Marino     result = xstrprintf ("[%d]", numchild);
852*ef5ccd6cSJohn Marino 
853*ef5ccd6cSJohn Marino   return result;
854*ef5ccd6cSJohn Marino }
855*ef5ccd6cSJohn Marino 
856*ef5ccd6cSJohn Marino /* Return a string representation of the (VALUE, TYPE) pair, using
857*ef5ccd6cSJohn Marino    the given print options OPTS as our formatting options.  */
858*ef5ccd6cSJohn Marino 
859*ef5ccd6cSJohn Marino char *
ada_varobj_get_value_of_variable(struct value * value,struct type * type,struct value_print_options * opts)860*ef5ccd6cSJohn Marino ada_varobj_get_value_of_variable (struct value *value,
861*ef5ccd6cSJohn Marino 				  struct type *type,
862*ef5ccd6cSJohn Marino 				  struct value_print_options *opts)
863*ef5ccd6cSJohn Marino {
864*ef5ccd6cSJohn Marino   char *result = NULL;
865*ef5ccd6cSJohn Marino 
866*ef5ccd6cSJohn Marino   ada_varobj_decode_var (&value, &type);
867*ef5ccd6cSJohn Marino 
868*ef5ccd6cSJohn Marino   switch (TYPE_CODE (type))
869*ef5ccd6cSJohn Marino     {
870*ef5ccd6cSJohn Marino     case TYPE_CODE_STRUCT:
871*ef5ccd6cSJohn Marino     case TYPE_CODE_UNION:
872*ef5ccd6cSJohn Marino       result = xstrdup ("{...}");
873*ef5ccd6cSJohn Marino       break;
874*ef5ccd6cSJohn Marino     case TYPE_CODE_ARRAY:
875*ef5ccd6cSJohn Marino       result = ada_varobj_get_value_of_array_variable (value, type, opts);
876*ef5ccd6cSJohn Marino       break;
877*ef5ccd6cSJohn Marino     default:
878*ef5ccd6cSJohn Marino       if (!value)
879*ef5ccd6cSJohn Marino 	result = xstrdup ("");
880*ef5ccd6cSJohn Marino       else
881*ef5ccd6cSJohn Marino 	result = ada_varobj_get_value_image (value, opts);
882*ef5ccd6cSJohn Marino       break;
883*ef5ccd6cSJohn Marino     }
884*ef5ccd6cSJohn Marino 
885*ef5ccd6cSJohn Marino   return result;
886*ef5ccd6cSJohn Marino }
887*ef5ccd6cSJohn Marino 
888*ef5ccd6cSJohn Marino 
889