X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fada-varobj.c;h=83d07073a298da8dc45b53a29bfe631281169102;hb=b08b78e7d4bb56f395d3212eed6184ede236c760;hp=aab7335eae39c23111016959b00ce523f08d68cf;hpb=ecd75fc8eed3bde86036141228074a20e55dcfc9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ada-varobj.c b/gdb/ada-varobj.c index aab7335eae..83d07073a2 100644 --- a/gdb/ada-varobj.c +++ b/gdb/ada-varobj.c @@ -1,6 +1,6 @@ /* varobj support for Ada. - Copyright (C) 2012-2014 Free Software Foundation, Inc. + Copyright (C) 2012-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -219,6 +219,15 @@ ada_varobj_adjust_for_child_access (struct value **value, && !ada_is_array_descriptor_type (TYPE_TARGET_TYPE (*type)) && !ada_is_constrained_packed_array_type (TYPE_TARGET_TYPE (*type))) ada_varobj_ind (*value, *type, value, type); + + /* If this is a tagged type, we need to transform it a bit in order + to be able to fetch its full view. As always with tagged types, + we can only do that if we have a value. */ + if (*value != NULL && ada_is_tagged_type (*type, 1)) + { + *value = ada_tag_value_at_base_address (*value); + *type = value_type (*value); + } } /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair is an array @@ -231,6 +240,18 @@ ada_varobj_get_array_number_of_children (struct value *parent_value, { LONGEST lo, hi; + if (parent_value == NULL + && is_dynamic_type (TYPE_INDEX_TYPE (parent_type))) + { + /* This happens when listing the children of an object + which does not exist in memory (Eg: when requesting + the children of a null pointer, which is allowed by + varobj). The array index type being dynamic, we cannot + determine how many elements this array has. Just assume + it has none. */ + return 0; + } + if (!get_array_bounds (parent_type, &lo, &hi)) { /* Could not get the array bounds. Pretend this is an empty array. */ @@ -570,18 +591,12 @@ ada_varobj_describe_simple_array_child (struct value *parent_value, struct type **child_type, char **child_path_expr) { - struct type *index_desc_type; struct type *index_type; int real_index; gdb_assert (TYPE_CODE (parent_type) == TYPE_CODE_ARRAY); - index_desc_type = ada_find_parallel_type (parent_type, "___XA"); - ada_fixup_array_indexes_type (index_desc_type); - if (index_desc_type) - index_type = TYPE_FIELD_TYPE (index_desc_type, 0); - else - index_type = TYPE_INDEX_TYPE (parent_type); + index_type = TYPE_INDEX_TYPE (parent_type); real_index = child_index + ada_discrete_type_low_bound (index_type); if (child_name) @@ -891,28 +906,28 @@ ada_varobj_get_value_of_variable (struct value *value, /* Ada specific callbacks for VAROBJs. */ static int -ada_number_of_children (struct varobj *var) +ada_number_of_children (const struct varobj *var) { return ada_varobj_get_number_of_children (var->value, var->type); } static char * -ada_name_of_variable (struct varobj *parent) +ada_name_of_variable (const struct varobj *parent) { return c_varobj_ops.name_of_variable (parent); } static char * -ada_name_of_child (struct varobj *parent, int index) +ada_name_of_child (const struct varobj *parent, int index) { return ada_varobj_get_name_of_child (parent->value, parent->type, parent->name, index); } static char* -ada_path_expr_of_child (struct varobj *child) +ada_path_expr_of_child (const struct varobj *child) { - struct varobj *parent = child->parent; + const struct varobj *parent = child->parent; const char *parent_path_expr = varobj_get_path_expr (parent); return ada_varobj_get_path_expr_of_child (parent->value, @@ -923,21 +938,22 @@ ada_path_expr_of_child (struct varobj *child) } static struct value * -ada_value_of_child (struct varobj *parent, int index) +ada_value_of_child (const struct varobj *parent, int index) { return ada_varobj_get_value_of_child (parent->value, parent->type, parent->name, index); } static struct type * -ada_type_of_child (struct varobj *parent, int index) +ada_type_of_child (const struct varobj *parent, int index) { return ada_varobj_get_type_of_child (parent->value, parent->type, index); } static char * -ada_value_of_variable (struct varobj *var, enum varobj_display_formats format) +ada_value_of_variable (const struct varobj *var, + enum varobj_display_formats format) { struct value_print_options opts; @@ -949,7 +965,7 @@ ada_value_of_variable (struct varobj *var, enum varobj_display_formats format) /* Implement the "value_is_changeable_p" routine for Ada. */ static int -ada_value_is_changeable_p (struct varobj *var) +ada_value_is_changeable_p (const struct varobj *var) { struct type *type = var->value ? value_type (var->value) : var->type; @@ -975,7 +991,7 @@ ada_value_is_changeable_p (struct varobj *var) /* Implement the "value_has_mutated" routine for Ada. */ static int -ada_value_has_mutated (struct varobj *var, struct value *new_val, +ada_value_has_mutated (const struct varobj *var, struct value *new_val, struct type *new_type) { int i; @@ -1023,5 +1039,6 @@ const struct lang_varobj_ops ada_varobj_ops = ada_type_of_child, ada_value_of_variable, ada_value_is_changeable_p, - ada_value_has_mutated + ada_value_has_mutated, + varobj_default_is_path_expr_parent };