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_PROP_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
check_typedef. */
int instance_flags;
- /* * Length of storage for a value of this type. This is what
- sizeof(type) would return; use it for address arithmetic, memory
- reads and writes, etc. This size includes padding. For example,
- an i386 extended-precision floating point value really only
- occupies ten bytes, but most ABI's declare its size to be 12
- bytes, to preserve alignment. A `struct type' representing such
- a floating-point type would have a `length' value of 12, even
- though the last two bytes are unused.
-
- There's a bit of a host/target mess here, if you're concerned
- about machines whose bytes aren't eight bits long, or who don't
- have byte-addressed memory. Various places pass this to memcpy
- and such, meaning it must be in units of host bytes. Various
- other places expect they can calculate addresses by adding it
- and such, meaning it must be in units of target bytes. For
- some DSP targets, in which HOST_CHAR_BIT will (presumably) be 8
- and TARGET_CHAR_BIT will be (say) 32, this is a problem.
-
- One fix would be to make this field in bits (requiring that it
- always be a multiple of HOST_CHAR_BIT and TARGET_CHAR_BIT) ---
- the other choice would be to make it consistently in units of
- HOST_CHAR_BIT. However, this would still fail to address
- machines based on a ternary or decimal representation. */
-
- unsigned length;
+ /* * Length of storage for a value of this type. The value is the
+ expression in host bytes of what sizeof(type) would return. This
+ size includes padding. For example, an i386 extended-precision
+ floating point value really only occupies ten bytes, but most
+ ABI's declare its size to be 12 bytes, to preserve alignment.
+ A `struct type' representing such a floating-point type would
+ have a `length' value of 12, even though the last two bytes are
+ unused.
+
+ Since this field is expressed in host bytes, its value is appropriate
+ to pass to memcpy and such (it is assumed that GDB itself always runs
+ on an 8-bits addressable architecture). However, when using it for
+ target address arithmetic (e.g. adding it to a target address), the
+ type_length_units function should be used in order to get the length
+ expressed in target addressable memory units. */
+
+ unsigned int length;
/* * Core type, shared by a group of qualified types. */
{
/* * Number of base classes this type derives from. The
baseclasses are stored in the first N_BASECLASSES fields
- (i.e. the `fields' field of the struct type). I think only the
- `type' field of such a field has any meaning. */
+ (i.e. the `fields' field of the struct type). The only fields
+ of struct field that are used are: type, name, loc.bitpos. */
short n_baseclasses;
#define INIT_FUNC_SPECIFIC(type) \
(TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FUNC, \
- TYPE_MAIN_TYPE (type)->type_specific.func_stuff \
- = TYPE_ZALLOC (type, \
- sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff)))
+ TYPE_MAIN_TYPE (type)->type_specific.func_stuff = (struct func_type *) \
+ TYPE_ZALLOC (type, \
+ sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff)))
#define TYPE_INSTANCE_FLAGS(thistype) (thistype)->instance_flags
#define TYPE_MAIN_TYPE(thistype) (thistype)->main_type
#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_PROP_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) \
extern struct type *get_target_type (struct type *type);
+/* Return the equivalent of TYPE_LENGTH, but in number of target
+ addressable memory units of the associated gdbarch instead of bytes. */
+
+extern unsigned int type_length_units (struct type *type);
+
/* * Helper function to construct objfile-owned types. */
extern struct type *init_type (enum type_code, int, int, const char *,
ADDR specifies the location of the variable the type is bound to.
If TYPE has no dynamic properties return TYPE; otherwise a new type with
static properties is returned. */
-extern struct type *resolve_dynamic_type (struct type *type, CORE_ADDR addr);
+extern struct type *resolve_dynamic_type (struct type *type,
+ const gdb_byte *valaddr,
+ CORE_ADDR addr);
/* * Predicate if the type has dynamic values, which are not resolved yet. */
extern int is_dynamic_type (struct type *type);
-extern struct type *check_typedef (struct 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);
-#define CHECK_TYPEDEF(TYPE) \
- do { \
- (TYPE) = check_typedef (TYPE); \
- } while (0)
+/* * 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 *);
extern void check_stub_method_group (struct type *, int);
extern int get_array_bounds (struct type *type, LONGEST *low_bound,
LONGEST *high_bound);
+extern int discrete_position (struct type *type, LONGEST val, LONGEST *pos);
+
extern int class_types_same_p (const struct type *, const struct type *);
extern int is_ancestor (struct type *, struct type *);