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 {
align_is_aligned /**< The entity is aligned. Default */
} 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. */
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
if (verbosity & dump_verbosity_entattrs) {
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 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));
......
......@@ -143,6 +143,7 @@ new_rd_entity(dbg_info *db, ir_type *owner, ident *name, ir_type *type)
res->allocation = allocation_automatic;
res->visibility = visibility_local;
res->volatility = volatility_non_volatile;
res->align = align_is_aligned;
res->stickyness = stickyness_unsticky;
res->peculiarity = peculiarity_existent;
res->address_taken = ir_address_taken_unknown;
......@@ -493,6 +494,16 @@ const char *get_volatility_name(ir_volatility var)
#undef X
} /* 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. */
const char *get_align_name(ir_align a)
{
......@@ -500,7 +511,7 @@ const char *get_align_name(ir_align a)
switch (a) {
X(align_non_aligned);
X(align_is_aligned);
default: return "BAD VALUE";
default: return "BAD VALUE";
}
#undef X
} /* get_align_name */
......
......@@ -100,14 +100,15 @@ struct ir_entity {
ir_type *type; /**< The type of this entity, e.g., a method type, a
basic type of the language or a class itself. */
ir_type *owner; /**< The compound type (e.g. class type) this entity belongs to. */
ir_allocation allocation:3; /**< Distinguishes static and dynamically allocated
entities and some further cases. */
ir_visibility visibility:3; /**< Specifies visibility to external program fragments. */
ir_variability variability:3; /**< Specifies variability of entities content. */
ir_volatility volatility:2; /**< Specifies volatility of entities content. */
ir_stickyness stickyness:2; /**< Specifies whether this entity is sticky. */
ir_peculiarity peculiarity:3; /**< The peculiarity of this entity. */
ir_address_taken_state address_taken:3; /**< A flag that can be set to mark address taken entities. */
unsigned allocation:3; /**< Distinguishes static and dynamically allocated
entities and some further cases. */
unsigned visibility:3; /**< Specifies visibility to external program fragments. */
unsigned variability:3; /**< Specifies variability of entities content. */
unsigned volatility:1; /**< Specifies volatility of entities content. */
unsigned align:1; /**< Specifies alignment of entities content. */
unsigned stickyness:2; /**< Specifies whether this entity is sticky. */
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 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. */
......@@ -247,6 +248,18 @@ _set_entity_volatility(ir_entity *ent, ir_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
_get_entity_peculiarity(const ir_entity *ent) {
assert(ent && ent->kind == k_entity);
......@@ -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_volatility(ent) _get_entity_volatility(ent)
#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 set_entity_peculiarity(ent, pec) _set_entity_peculiarity(ent, pec)
#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