# ifndef _ENTITY_T_H_
# define _ENTITY_T_H_
+#include "firm_common_t.h"
+
# include "entity.h"
# include "typegmod.h"
# include "mangle.h"
+
/** A path in a compund graph. */
struct compound_graph_path {
firm_kind kind; /**< dynamic type tag for compound graph path. */
- type *tp;
- int len;
- entity *nodes[1];
+ type *tp; /**< The type this path belongs to. */
+ int len; /**< length of the path */
+ int *arr_indicees; /**< List of array indicees. To compute position of
+ array elements */
+ entity *nodes[1]; /**< List of entities of length len to express the
+ access path. */
};
/** the type of an entity */
struct dbg_info* dbi; /**< A pointer to information for debug support. */
/* ------------- fields for atomic entities ---------------*/
+
ir_node *value; /**< value if entity is not of variability uninitialized.
Only for atomic entities. */
/* ------------- fields for compound entities ---------------*/
+
ir_node **values; /**< constant values of compound entities. Only available if
- variablility not uninitialized. Must be set for variability constant
+ variablility not uninitialized. Must be set for variability constant
*/
- compound_graph_path **val_paths; /**< paths corresponding to constant values. Only available if
- variablility not uninitialized. Must be set for variability constant */
+ compound_graph_path **val_paths; /**< paths corresponding to constant values. Only available if
+ variablility not uninitialized. Must be set for variability constant */
/* ------------- fields for entities owned by a class type ---------------*/
- entity **overwrites; /**< A list of entities this entity overwrites. */
+
+ entity **overwrites; /**< A list of entities this entity overwrites. */
entity **overwrittenby; /**< A list of entities that overwrite this entity. */
/* ------------- fields for methods ---------------*/
+
enum peculiarity peculiarity;
ir_graph *irg; /**< If (type == method_type) this is the corresponding irg.
- The ir_graph constructor automatically sets this field.
- Yes, it must be here. */
+ The ir_graph constructor automatically sets this field.
+ Yes, it must be here. */
+
+ /* ------------- fields for analyses ---------------*/
+
+ ir_node **accesses; /**< accessing nodes: loads, stores. */
+
#ifdef DEBUG_libfirm
int nr; /**< a unique node number for each node to make output
- readable. */
+ readable. */
#endif
};
/* ----------------------- inline functions ------------------------ */
static INLINE int
-__is_entity(void *thing) {
+__is_entity(const void *thing) {
return get_kind(thing) == k_entity;
}
static INLINE const char *
-__get_entity_name(entity *ent) {
+__get_entity_name(const entity *ent) {
assert(ent && ent->kind == k_entity);
return get_id_str(get_entity_ident(ent));
}
static INLINE ident *
-__get_entity_ident(entity *ent) {
+__get_entity_ident(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->name;
}
}
static INLINE ent_allocation
-__get_entity_allocation(entity *ent) {
+__get_entity_allocation(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->allocation;
}
}
static INLINE ent_visibility
-__get_entity_visibility(entity *ent) {
+__get_entity_visibility(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->visibility;
}
static INLINE ent_variability
-__get_entity_variability(entity *ent) {
+__get_entity_variability(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->variability;
}
static INLINE ent_volatility
-__get_entity_volatility(entity *ent) {
+__get_entity_volatility(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->volatility;
}
}
static INLINE peculiarity
-__get_entity_peculiarity(entity *ent) {
+__get_entity_peculiarity(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->peculiarity;
}
}
static INLINE ent_stickyness
-__get_entity_stickyness(entity *ent) {
+__get_entity_stickyness(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->stickyness;
}
}
static INLINE int
-__get_entity_offset_bits(entity *ent) {
+__get_entity_offset_bits(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->offset;
}
static INLINE int
-__get_entity_offset_bytes(entity *ent) {
+__get_entity_offset_bytes(const entity *ent) {
int bits = __get_entity_offset_bits(ent);
if (bits & 7) return -1;
}
static INLINE void *
-__get_entity_link(entity *ent) {
+__get_entity_link(const entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->link;
}
}
static INLINE ir_graph *
-__get_entity_irg(entity *ent) {
+__get_entity_irg(const entity *ent) {
assert(ent && ent->kind == k_entity);
assert(is_method_type(ent->type));
return ent->irg;