* @file
* @brief Representation of all program known entities -- private header.
* @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
- * @version $Id$
*/
#ifndef FIRM_TR_ENTITY_T_H
#define FIRM_TR_ENTITY_T_H
lowering...) */
} parameter_ent_attr;
+typedef enum ir_entity_kind {
+ IR_ENTITY_NORMAL,
+ IR_ENTITY_METHOD,
+ IR_ENTITY_COMPOUND_MEMBER,
+ IR_ENTITY_PARAMETER,
+ IR_ENTITY_LABEL,
+ IR_ENTITY_UNKNOWN,
+} ir_entity_kind;
/**
* An abstract data type to represent program entities.
ir_type *type; /**< The type of this entity */
ir_type *owner; /**< The compound type (e.g. class type) this
entity belongs to. */
+ unsigned entity_kind:3; /**< entity kind */
unsigned linkage:10; /**< Specifies linkage type */
unsigned volatility:1; /**< Specifies volatility of entities content.*/
unsigned aligned:1; /**< Specifies alignment of entities content. */
/**< If the entity is a bit field, this is the
offset of the start of the bit field
within the byte specified by offset. */
- unsigned is_parameter:1; /**< 1 if this represents a function parameter */
int offset; /**< Offset in bytes for this entity. Fixed
when layout of owner is determined. */
unsigned alignment; /**< entity alignment in bytes */
};
/** Initialize the entity module. */
-void ir_init_entity(void);
+void ir_init_entity(ir_prog *irp);
/** Cleanup entity module */
-void ir_finish_entity(void);
+void ir_finish_entity(ir_prog *irp);
+
+/**
+ * Creates an entity corresponding to the start address of a basic block
+ * (the basic block is marked with a label id).
+ */
+ir_entity *new_label_entity(ir_label_t label);
+
+/**
+ * Like new_label_entity() but with debug information.
+ */
+ir_entity *new_d_label_entity(ir_label_t label, dbg_info *dbgi);
+
+void set_entity_irg(ir_entity *ent, ir_graph *irg);
/* ----------------------- inline functions ------------------------ */
static inline int _is_entity(const void *thing)
return ent->type;
}
-static inline void _set_entity_type(ir_entity *ent, ir_type *type)
-{
- assert(ent && ent->kind == k_entity);
- ent->type = type;
-}
-
static inline ir_linkage _get_entity_linkage(const ir_entity *ent)
{
assert(ent && ent->kind == k_entity);
static inline ir_graph *_get_entity_irg(const ir_entity *ent)
{
assert(ent && ent->kind == k_entity);
- if (!is_Method_type(ent->type) || ent == unknown_entity) {
+ if (!is_Method_type(ent->type) || is_unknown_entity(ent)) {
return NULL;
}
static inline int _is_parameter_entity(const ir_entity *entity)
{
- return entity->is_parameter;
+ return entity->entity_kind == IR_ENTITY_PARAMETER;
}
static inline size_t _get_entity_parameter_number(const ir_entity *entity)
{
- assert(entity->is_parameter);
+ assert(entity->entity_kind == IR_ENTITY_PARAMETER);
return entity->attr.parameter.number;
}
#define set_entity_ld_ident(ent, ld_ident) _set_entity_ld_ident(ent, ld_ident)
#define get_entity_ld_name(ent) _get_entity_ld_name(ent)
#define get_entity_type(ent) _get_entity_type(ent)
-#define set_entity_type(ent, type) _set_entity_type(ent, type)
#define get_entity_linkage(ent) _get_entity_linkage(ent)
#define get_entity_volatility(ent) _get_entity_volatility(ent)
#define set_entity_volatility(ent, vol) _set_entity_volatility(ent, vol)