{
struct type *real_type = check_typedef (type);
struct type *resolved_type = type;
- const struct dynamic_prop *prop;
+ struct dynamic_prop *prop;
CORE_ADDR value;
if (!is_dynamic_type_internal (real_type, top_level))
/* Resolve data_location attribute. */
prop = TYPE_DATA_LOCATION (resolved_type);
- if (dwarf2_evaluate_property (prop, addr_stack, &value))
+ if (prop != NULL && dwarf2_evaluate_property (prop, addr_stack, &value))
{
- TYPE_DATA_LOCATION_ADDR (resolved_type) = value;
- TYPE_DATA_LOCATION_KIND (resolved_type) = PROP_CONST;
+ TYPE_DYN_PROP_ADDR (prop) = value;
+ TYPE_DYN_PROP_KIND (prop) = PROP_CONST;
}
- else
- TYPE_DATA_LOCATION (resolved_type) = NULL;
return resolved_type;
}
return resolve_dynamic_type_internal (type, &pinfo, 1);
}
+/* See gdbtypes.h */
+
+struct dynamic_prop *
+get_dyn_prop (enum dynamic_prop_node_kind prop_kind, const struct type *type)
+{
+ struct dynamic_prop_list *node = TYPE_DYN_PROP_LIST (type);
+
+ while (node != NULL)
+ {
+ if (node->prop_kind == prop_kind)
+ return node->prop;
+ node = node->next;
+ }
+ return NULL;
+}
+
+/* See gdbtypes.h */
+
+void
+add_dyn_prop (enum dynamic_prop_node_kind prop_kind, struct dynamic_prop prop,
+ struct type *type, struct objfile *objfile)
+{
+ struct dynamic_prop_list *temp;
+
+ gdb_assert (TYPE_OBJFILE_OWNED (type));
+
+ temp = obstack_alloc (&objfile->objfile_obstack,
+ sizeof (struct dynamic_prop_list));
+ temp->prop_kind = prop_kind;
+ temp->prop = obstack_copy (&objfile->objfile_obstack, &prop, sizeof (prop));
+ temp->next = TYPE_DYN_PROP_LIST (type);
+
+ TYPE_DYN_PROP_LIST (type) = temp;
+}
+
+
/* Find the real type of TYPE. This function returns the real type,
after removing all layers of typedefs, and completing opaque or stub
types. Completion changes the TYPE argument, but stripping of
dummy_obstack_deallocate);
}
+/* Recursively copy (deep copy) a dynamic attribute list of a type. */
+
+static struct dynamic_prop_list *
+copy_dynamic_prop_list (struct obstack *objfile_obstack,
+ struct dynamic_prop_list *list)
+{
+ struct dynamic_prop_list *copy = list;
+ struct dynamic_prop_list **node_ptr = ©
+
+ while (*node_ptr != NULL)
+ {
+ struct dynamic_prop_list *node_copy;
+
+ node_copy = obstack_copy (objfile_obstack, *node_ptr,
+ sizeof (struct dynamic_prop_list));
+ node_copy->prop = obstack_copy (objfile_obstack, (*node_ptr)->prop,
+ sizeof (struct dynamic_prop));
+ *node_ptr = node_copy;
+
+ node_ptr = &node_copy->next;
+ }
+
+ return copy;
+}
+
/* Recursively copy (deep copy) TYPE, if it is associated with
OBJFILE. Return a new type allocated using malloc, a saved type if
we have already visited TYPE (using COPIED_TYPES), or TYPE if it is
*TYPE_RANGE_DATA (new_type) = *TYPE_RANGE_DATA (type);
}
- /* Copy the data location information. */
- if (TYPE_DATA_LOCATION (type) != NULL)
- {
- TYPE_DATA_LOCATION (new_type)
- = TYPE_ALLOC (new_type, sizeof (struct dynamic_prop));
- memcpy (TYPE_DATA_LOCATION (new_type), TYPE_DATA_LOCATION (type),
- sizeof (struct dynamic_prop));
- }
+ if (TYPE_DYN_PROP_LIST (type) != NULL)
+ TYPE_DYN_PROP_LIST (new_type)
+ = copy_dynamic_prop_list (&objfile->objfile_obstack,
+ TYPE_DYN_PROP_LIST (type));
+
/* Copy pointers to other types. */
if (TYPE_TARGET_TYPE (type))
TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
sizeof (struct main_type));
- if (TYPE_DATA_LOCATION (type) != NULL)
- {
- TYPE_DATA_LOCATION (new_type)
- = TYPE_ALLOC (new_type, sizeof (struct dynamic_prop));
- memcpy (TYPE_DATA_LOCATION (new_type), TYPE_DATA_LOCATION (type),
- sizeof (struct dynamic_prop));
- }
+ if (TYPE_DYN_PROP_LIST (type) != NULL)
+ TYPE_DYN_PROP_LIST (new_type)
+ = copy_dynamic_prop_list (&TYPE_OBJFILE (type) -> objfile_obstack,
+ TYPE_DYN_PROP_LIST (type));
return new_type;
}
union dynamic_prop_data data;
};
+/* * Define a type's dynamic property node kind. */
+enum dynamic_prop_node_kind
+{
+ /* A property providing a type's data location.
+ Evaluating this field yields to the location of an object's data. */
+ DYN_ATTR_DATA_LOCATION,
+};
+
+/* * List for dynamic type attributes. */
+struct dynamic_prop_list
+{
+ /* The kind of dynamic prop in this node. */
+ enum dynamic_prop_node_kind prop_kind;
+
+ /* The dynamic property itself. */
+ struct dynamic_prop *prop;
+
+ /* A pointer to the next dynamic property. */
+ struct dynamic_prop_list *next;
+};
/* * Determine which field of the union main_type.fields[x].loc is
used. */
union type_specific type_specific;
- /* * Contains a location description value for the current type. Evaluating
- this field yields to the location of the data for an object. */
-
- struct dynamic_prop *data_location;
+ /* * Contains all dynamic type properties. */
+ struct dynamic_prop_list *dyn_prop_list;
};
/* * A ``struct type'' describes a particular instance of a type, with
#define TYPE_LOW_BOUND_KIND(range_type) \
TYPE_RANGE_DATA(range_type)->low.kind
-/* Attribute accessors for the type data location. */
+/* Property accessors for the type data location. */
#define TYPE_DATA_LOCATION(thistype) \
- TYPE_MAIN_TYPE(thistype)->data_location
+ get_dyn_prop (DYN_ATTR_DATA_LOCATION, thistype)
#define TYPE_DATA_LOCATION_BATON(thistype) \
TYPE_DATA_LOCATION (thistype)->data.baton
#define TYPE_DATA_LOCATION_ADDR(thistype) \
#define TYPE_DATA_LOCATION_KIND(thistype) \
TYPE_DATA_LOCATION (thistype)->kind
+/* Attribute accessors for dynamic properties. */
+#define TYPE_DYN_PROP_LIST(thistype) \
+ TYPE_MAIN_TYPE(thistype)->dyn_prop_list
+#define TYPE_DYN_PROP_BATON(dynprop) \
+ dynprop->data.baton
+#define TYPE_DYN_PROP_ADDR(dynprop) \
+ dynprop->data.const_val
+#define TYPE_DYN_PROP_KIND(dynprop) \
+ dynprop->kind
+
+
/* Moto-specific stuff for FORTRAN arrays. */
#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \
/* * Predicate if the type has dynamic values, which are not resolved yet. */
extern int is_dynamic_type (struct type *type);
+/* * Return the dynamic property of the requested KIND from TYPE's
+ list of dynamic properties. */
+extern struct dynamic_prop *get_dyn_prop
+ (enum dynamic_prop_node_kind kind, const struct type *type);
+
+/* * Given a dynamic property PROP of a given KIND, add this dynamic
+ property to the given TYPE.
+
+ This function assumes that TYPE is objfile-owned, and that OBJFILE
+ is the TYPE's objfile. */
+extern void add_dyn_prop
+ (enum dynamic_prop_node_kind kind, struct dynamic_prop prop,
+ struct type *type, struct objfile *objfile);
+
extern struct type *check_typedef (struct type *);
#define CHECK_TYPEDEF(TYPE) \