Commit d88be975 authored by Götz Lindenmaier's avatar Götz Lindenmaier
Browse files

Added support for lowering to entites, types.

added support for visibilit of entities, allocation mode

[r215]
parent dc6419a8
...@@ -39,6 +39,8 @@ new_entity (type *owner, ident *name, type *type) ...@@ -39,6 +39,8 @@ new_entity (type *owner, ident *name, type *type)
res->owner = owner; res->owner = owner;
res->name = name; res->name = name;
res->type = type; res->type = type;
res->allocation = dynamic_allocated;
res->visibility = local;
res->ld_name = NULL; res->ld_name = NULL;
res->visit = 0; res->visit = 0;
...@@ -122,6 +124,29 @@ set_entity_type (entity *ent, type *type) { ...@@ -122,6 +124,29 @@ set_entity_type (entity *ent, type *type) {
ent->type = type; ent->type = type;
} }
inline ent_allocation
get_entity_allocation (entity *ent) {
return ent->allocation;
}
inline void
set_entity_allocation (entity *ent, ent_allocation al) {
ent->allocation = al;
}
inline ent_visibility
get_entity_visibility (entity *ent) {
return ent->visibility;
}
inline void
set_entity_visibility (entity *ent, ent_visibility vis) {
if (vis != local) assert(ent->allocation == static_allocated);
ent->visibility = vis;
}
inline int inline int
get_entity_offset (entity *ent) { get_entity_offset (entity *ent) {
return ent->offset; return ent->offset;
......
...@@ -97,6 +97,32 @@ inline void assert_legal_owner_of_ent(type *owner); ...@@ -97,6 +97,32 @@ inline void assert_legal_owner_of_ent(type *owner);
type *get_entity_type (entity *ent); type *get_entity_type (entity *ent);
void set_entity_type (entity *ent, type *type); void set_entity_type (entity *ent, type *type);
typedef enum {
dynamic_allocated, /* The entity is allocated during runtime, either explicitly
by an Alloc node or implicitly as component of a compound
type. This is the default. */
static_allocated /* The entity is allocated statically. We can use a
SymConst as address of the entity. */
} ent_allocation;
ent_allocation get_entity_allocation (entity *ent);
void set_entity_allocation (entity *ent, ent_allocation al);
/* This enumeration flags the visibility of entities. This is necessary
for partial compilation. */
typedef enum {
local, /* The entity is only visible locally. This is the default. */
external_visible, /* The entity is visible to other external program parts, but
it is defined here. It may not be optimized away. The entity must
be static_allocated. */
external_allocated /* The entity is defined and allocated externaly. This compilation
must not allocate memory for this entity. The entity must
be static_allocated. */
} ent_visibility;
ent_visibility get_entity_visibility (entity *ent);
void set_entity_visibility (entity *ent, ent_visibility vis);
int get_entity_offset (entity *ent); int get_entity_offset (entity *ent);
void set_entity_offset (entity *ent, int offset); void set_entity_offset (entity *ent, int offset);
......
...@@ -47,6 +47,10 @@ struct entity { ...@@ -47,6 +47,10 @@ struct entity {
basic type of the language or a class itself */ basic type of the language or a class itself */
type *owner; /* The class this entity belongs to. In case of local type *owner; /* The class this entity belongs to. In case of local
variables the method they are defined in. */ variables the method they are defined in. */
ent_allocation allocation; /* Distinguishes static and dynamically allocated
entities. */
ent_visibility visibility; /* Specifies visibility to external program
fragments */
int offset; /* Offset in byte for this entity. Fixed when layout int offset; /* Offset in byte for this entity. Fixed when layout
of owner is determined. */ of owner is determined. */
/* for methods */ /* for methods */
......
...@@ -52,6 +52,7 @@ new_type(tp_op *type_op, ir_mode *mode, ident* name) { ...@@ -52,6 +52,7 @@ new_type(tp_op *type_op, ir_mode *mode, ident* name) {
res->type_op = type_op; res->type_op = type_op;
res->mode = mode; res->mode = mode;
res->name = name; res->name = name;
res->state = layout_undefined;
res->size = -1; res->size = -1;
res->visit = 0; res->visit = 0;
...@@ -102,16 +103,34 @@ int get_type_size(type *tp) { ...@@ -102,16 +103,34 @@ int get_type_size(type *tp) {
assert(tp); assert(tp);
return tp->size; return tp->size;
} }
void set_type_size(type *tp, int size) {
void
set_type_size(type *tp, int size) {
assert(tp); assert(tp);
/* For pointer and primitive size depends on the mode. */ /* For pointer and primitive size depends on the mode. */
assert((tp->type_op != type_pointer) && (tp->type_op != type_primitive)); if ((tp->type_op != type_pointer) && (tp->type_op != type_primitive))
tp->size = size; tp->size = size;
} }
type_state
get_type_state(type *tp) {
assert(tp);
return tp->state;
}
void
set_type_state(type *tp, type_state state) {
assert(tp);
/* For pointer and primitive always fixed. */
if ((tp->type_op != type_pointer) && (tp->type_op != type_primitive))
tp->state = state;
}
unsigned long get_type_visited(type *tp) { unsigned long get_type_visited(type *tp) {
assert(tp); assert(tp);
return tp->visit; return tp->visit;
} }
void set_type_visited(type *tp, unsigned long num) { void set_type_visited(type *tp, unsigned long num) {
assert(tp); assert(tp);
tp->visit = num; tp->visit = num;
...@@ -475,6 +494,7 @@ type *new_type_pointer (ident *name, type *points_to) { ...@@ -475,6 +494,7 @@ type *new_type_pointer (ident *name, type *points_to) {
res = new_type(type_pointer, mode_p, name); res = new_type(type_pointer, mode_p, name);
res->attr.pa.points_to = points_to; res->attr.pa.points_to = points_to;
res->size = get_mode_size(res->mode); res->size = get_mode_size(res->mode);
res->state = layout_fixed;
return res; return res;
} }
/* manipulate fields of type_pointer */ /* manipulate fields of type_pointer */
...@@ -503,6 +523,7 @@ type *new_type_primitive (ident *name, ir_mode *mode) { ...@@ -503,6 +523,7 @@ type *new_type_primitive (ident *name, ir_mode *mode) {
type *res; type *res;
res = new_type(type_primitive, mode, name); res = new_type(type_primitive, mode, name);
res->size = get_mode_size(mode); res->size = get_mode_size(mode);
res->state = layout_fixed;
return res; return res;
} }
......
...@@ -105,8 +105,28 @@ void set_type_nameid(type *tp, ident* id); ...@@ -105,8 +105,28 @@ void set_type_nameid(type *tp, ident* id);
const char* get_type_name(type *tp); const char* get_type_name(type *tp);
int get_type_size(type *tp); int get_type_size(type *tp);
/* For primitives and pointer types the size is always fixed.
This call is legal but has no effect. */
void set_type_size(type *tp, int size); void set_type_size(type *tp, int size);
typedef enum {
layout_undefined, /* The layout of this type is not defined.
Address computation to access fields is not
possible, fields must be accessed by Sel nodes.
This is the default value except for pointer and
primitive types. */
layout_fixed /* The layout is fixed, all component/member entities
have an offset assigned. Size of the type is known.
Arrays can be accessed by explicit address
computation. Default for pointer and primitive types.
*/
} type_state;
type_state get_type_state(type *tp);
/* For primitives and pointer types the layout is always fixed.
This call is legal but has no effect. */
void set_type_state(type *tp, type_state state);
unsigned long get_type_visited(type *tp); unsigned long get_type_visited(type *tp);
void set_type_visited(type *tp, unsigned long num); void set_type_visited(type *tp, unsigned long num);
/* Sets visited field in type to type_visited. */ /* Sets visited field in type to type_visited. */
......
...@@ -91,6 +91,8 @@ struct type { ...@@ -91,6 +91,8 @@ struct type {
tp_op *type_op; tp_op *type_op;
ir_mode *mode; ir_mode *mode;
ident *name; ident *name;
type_state state; /* Represents the types state: layout undefined or
fixed. */
int size; /* Size of an entity of this type. This is determined int size; /* Size of an entity of this type. This is determined
when fixing the layout of this class. Size must be when fixing the layout of this class. Size must be
given in bytes. */ given in bytes. */
...@@ -111,7 +113,7 @@ struct type { ...@@ -111,7 +113,7 @@ struct type {
* name - an ident for the name of this type. * name - an ident for the name of this type.
* RESULT * RESULT
* a new type of the given type. The remaining private attributes are not * a new type of the given type. The remaining private attributes are not
* initalized. * initalized. The type is in state layout_undefined.
*** ***
*/ */
inline type * inline type *
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment