Commit 0f3f5dcf authored by Michael Beck's avatar Michael Beck
Browse files

added support for unaligned entities

[r15439]
parent 132dc691
...@@ -315,6 +315,12 @@ typedef enum { ...@@ -315,6 +315,12 @@ typedef enum {
align_is_aligned /**< The entity is aligned. Default */ align_is_aligned /**< The entity is aligned. Default */
} ir_align; } ir_align;
/** Returns the alignment of an entity. */
ir_align get_entity_align(const ir_entity *ent);
/** Sets the alignment of an entity. */
void set_entity_align(ir_entity *ent, ir_align a);
/** Return the name of the alignment. */ /** Return the name of the alignment. */
const char *get_align_name(ir_align a); const char *get_align_name(ir_align a);
......
...@@ -667,6 +667,7 @@ void dump_entity_to_file_prefix(FILE *F, ir_entity *ent, char *prefix, unsigned ...@@ -667,6 +667,7 @@ void dump_entity_to_file_prefix(FILE *F, ir_entity *ent, char *prefix, unsigned
if (verbosity & dump_verbosity_entattrs) { if (verbosity & dump_verbosity_entattrs) {
fprintf(F, "%s volatility: %s", prefix, get_volatility_name(get_entity_volatility(ent))); fprintf(F, "%s volatility: %s", prefix, get_volatility_name(get_entity_volatility(ent)));
fprintf(F, "\n%s alignment: %s", prefix, get_align_name(get_entity_align(ent)));
fprintf(F, "\n%s peculiarity: %s", prefix, get_peculiarity_name(get_entity_peculiarity(ent))); fprintf(F, "\n%s peculiarity: %s", prefix, get_peculiarity_name(get_entity_peculiarity(ent)));
fprintf(F, "\n%s ld_name: %s", prefix, ent->ld_name ? get_entity_ld_name(ent) : "no yet set"); fprintf(F, "\n%s ld_name: %s", prefix, ent->ld_name ? get_entity_ld_name(ent) : "no yet set");
fprintf(F, "\n%s offset: %d bytes, %d rem bits", prefix, get_entity_offset(ent), get_entity_offset_bits_remainder(ent)); fprintf(F, "\n%s offset: %d bytes, %d rem bits", prefix, get_entity_offset(ent), get_entity_offset_bits_remainder(ent));
......
...@@ -143,6 +143,7 @@ new_rd_entity(dbg_info *db, ir_type *owner, ident *name, ir_type *type) ...@@ -143,6 +143,7 @@ new_rd_entity(dbg_info *db, ir_type *owner, ident *name, ir_type *type)
res->allocation = allocation_automatic; res->allocation = allocation_automatic;
res->visibility = visibility_local; res->visibility = visibility_local;
res->volatility = volatility_non_volatile; res->volatility = volatility_non_volatile;
res->align = align_is_aligned;
res->stickyness = stickyness_unsticky; res->stickyness = stickyness_unsticky;
res->peculiarity = peculiarity_existent; res->peculiarity = peculiarity_existent;
res->address_taken = ir_address_taken_unknown; res->address_taken = ir_address_taken_unknown;
...@@ -493,6 +494,16 @@ const char *get_volatility_name(ir_volatility var) ...@@ -493,6 +494,16 @@ const char *get_volatility_name(ir_volatility var)
#undef X #undef X
} /* get_volatility_name */ } /* get_volatility_name */
ir_align
(get_entity_align)(const ir_entity *ent) {
return _get_entity_align(ent);
} /* get_entity_align */
void
(set_entity_align)(ir_entity *ent, ir_align a) {
_set_entity_align(ent, a);
} /* set_entity_align */
/* Return the name of the alignment. */ /* Return the name of the alignment. */
const char *get_align_name(ir_align a) const char *get_align_name(ir_align a)
{ {
...@@ -500,7 +511,7 @@ const char *get_align_name(ir_align a) ...@@ -500,7 +511,7 @@ const char *get_align_name(ir_align a)
switch (a) { switch (a) {
X(align_non_aligned); X(align_non_aligned);
X(align_is_aligned); X(align_is_aligned);
default: return "BAD VALUE"; default: return "BAD VALUE";
} }
#undef X #undef X
} /* get_align_name */ } /* get_align_name */
......
...@@ -100,14 +100,15 @@ struct ir_entity { ...@@ -100,14 +100,15 @@ struct ir_entity {
ir_type *type; /**< The type of this entity, e.g., a method type, a ir_type *type; /**< The type of this entity, e.g., a method type, a
basic type of the language or a class itself. */ basic type of the language or a class itself. */
ir_type *owner; /**< The compound type (e.g. class type) this entity belongs to. */ ir_type *owner; /**< The compound type (e.g. class type) this entity belongs to. */
ir_allocation allocation:3; /**< Distinguishes static and dynamically allocated unsigned allocation:3; /**< Distinguishes static and dynamically allocated
entities and some further cases. */ entities and some further cases. */
ir_visibility visibility:3; /**< Specifies visibility to external program fragments. */ unsigned visibility:3; /**< Specifies visibility to external program fragments. */
ir_variability variability:3; /**< Specifies variability of entities content. */ unsigned variability:3; /**< Specifies variability of entities content. */
ir_volatility volatility:2; /**< Specifies volatility of entities content. */ unsigned volatility:1; /**< Specifies volatility of entities content. */
ir_stickyness stickyness:2; /**< Specifies whether this entity is sticky. */ unsigned align:1; /**< Specifies alignment of entities content. */
ir_peculiarity peculiarity:3; /**< The peculiarity of this entity. */ unsigned stickyness:2; /**< Specifies whether this entity is sticky. */
ir_address_taken_state address_taken:3; /**< A flag that can be set to mark address taken entities. */ unsigned peculiarity:3; /**< The peculiarity of this entity. */
unsigned address_taken:3; /**< A flag that can be set to mark address taken entities. */
unsigned final:1; /**< If set, this entity cannot be overridden. */ unsigned final:1; /**< If set, this entity cannot be overridden. */
unsigned compiler_gen:1; /**< If set, this entity was compiler generated. */ unsigned compiler_gen:1; /**< If set, this entity was compiler generated. */
unsigned backend_marked:1; /**< If set, this entity was marked by the backend for emission. */ unsigned backend_marked:1; /**< If set, this entity was marked by the backend for emission. */
...@@ -247,6 +248,18 @@ _set_entity_volatility(ir_entity *ent, ir_volatility vol) { ...@@ -247,6 +248,18 @@ _set_entity_volatility(ir_entity *ent, ir_volatility vol) {
ent->volatility = vol; ent->volatility = vol;
} }
static INLINE ir_align
_get_entity_align(const ir_entity *ent) {
assert(ent && ent->kind == k_entity);
return ent->align;
}
static INLINE void
_set_entity_align(ir_entity *ent, ir_align a) {
assert(ent && ent->kind == k_entity);
ent->align = a;
}
static INLINE ir_peculiarity static INLINE ir_peculiarity
_get_entity_peculiarity(const ir_entity *ent) { _get_entity_peculiarity(const ir_entity *ent) {
assert(ent && ent->kind == k_entity); assert(ent && ent->kind == k_entity);
...@@ -439,6 +452,8 @@ _set_entity_dbg_info(ir_entity *ent, dbg_info *db) { ...@@ -439,6 +452,8 @@ _set_entity_dbg_info(ir_entity *ent, dbg_info *db) {
#define get_entity_variability(ent) _get_entity_variability(ent) #define get_entity_variability(ent) _get_entity_variability(ent)
#define get_entity_volatility(ent) _get_entity_volatility(ent) #define get_entity_volatility(ent) _get_entity_volatility(ent)
#define set_entity_volatility(ent, vol) _set_entity_volatility(ent, vol) #define set_entity_volatility(ent, vol) _set_entity_volatility(ent, vol)
#define get_entity_align(ent) _get_entity_align(ent)
#define set_entity_align(ent, a) _set_entity_align(ent, a)
#define get_entity_peculiarity(ent) _get_entity_peculiarity(ent) #define get_entity_peculiarity(ent) _get_entity_peculiarity(ent)
#define set_entity_peculiarity(ent, pec) _set_entity_peculiarity(ent, pec) #define set_entity_peculiarity(ent, pec) _set_entity_peculiarity(ent, pec)
#define get_entity_stickyness(ent) _get_entity_stickyness(ent) #define get_entity_stickyness(ent) _get_entity_stickyness(ent)
......
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