From 59bb4ed0cfcffa6d447d3ab1bf8d064c2f41c6a7 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Mon, 2 Oct 2006 08:14:29 +0000 Subject: [PATCH] Add the final property to entities [r8313] --- ir/tr/entity.c | 20 ++++++++++++++++++-- ir/tr/entity.h | 14 ++++++++++---- ir/tr/entity_t.h | 18 ++++++++++++++++-- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/ir/tr/entity.c b/ir/tr/entity.c index 9bd997b11..8c6b66bc4 100644 --- a/ir/tr/entity.c +++ b/ir/tr/entity.c @@ -113,6 +113,7 @@ new_rd_entity(dbg_info *db, ir_type *owner, ident *name, ir_type *type) res->volatility = volatility_non_volatile; res->stickyness = stickyness_unsticky; res->peculiarity = peculiarity_existent; + res->final = 0; res->compiler_gen = 0; res->offset = -1; res->link = NULL; @@ -471,6 +472,16 @@ void _set_entity_peculiarity(ent, pec); } +/* Checks if an entity cannot be overridden anymore. */ +int (get_entity_final)(const entity *ent) { + return _get_entity_final(ent); +} + +/* Sets/resets the final flag of an entity. */ +void (set_entity_final)(entity *ent, int final) { + _set_entity_final(ent, final); +} + /* Checks if an entity is compiler generated */ int is_entity_compiler_generated(const entity *ent) { assert(is_entity(ent)); @@ -1147,7 +1158,13 @@ void void add_entity_overwrites(entity *ent, entity *overwritten) { - assert(is_Class_type(get_entity_owner(ent))); +#ifndef NDEBUG + ir_type *owner = get_entity_owner(ent); + ir_type *ovw_ovner = get_entity_owner(overwritten); + assert(is_Class_type(owner)); + assert(is_Class_type(ovw_ovner)); + assert(! is_class_final(ovw_ovner)); +#endif /* NDEBUG */ ARR_APP1(entity *, ent->overwrites, overwritten); ARR_APP1(entity *, overwritten->overwrittenby, ent); } @@ -1197,7 +1214,6 @@ remove_entity_overwrites(entity *ent, entity *overwritten) { void add_entity_overwrittenby (entity *ent, entity *overwrites) { - assert(is_Class_type(get_entity_owner(ent))); add_entity_overwrites(overwrites, ent); } diff --git a/ir/tr/entity.h b/ir/tr/entity.h index 25de511c4..74fb084a2 100644 --- a/ir/tr/entity.h +++ b/ir/tr/entity.h @@ -284,10 +284,10 @@ typedef enum { program in any case. */ } ir_stickyness; -/** Get the entity's stickyness */ +/** Get the entity's stickyness. */ ir_stickyness get_entity_stickyness(const entity *ent); -/** Set the entity's stickyness */ +/** Set the entity's stickyness. */ void set_entity_stickyness(entity *ent, ir_stickyness stickyness); /** Returns the offset of an entity (in a compound) in bytes. Only set if layout = fixed. */ @@ -328,10 +328,16 @@ ir_peculiarity get_entity_peculiarity(const entity *ent); /** Sets the peculiarity of an entity. */ void set_entity_peculiarity(entity *ent, ir_peculiarity pec); -/** Checks if an entity is compiler generated */ +/** Checks if an entity cannot be overridden anymore. */ +int get_entity_final(const entity *ent); + +/** Sets/resets the final flag of an entity. */ +void set_entity_final(entity *ent, int final); + +/** Checks if an entity is compiler generated. */ int is_entity_compiler_generated(const entity *ent); -/** Sets/resets the compiler generated flag */ +/** Sets/resets the compiler generated flag. */ void set_entity_compiler_generated(entity *ent, int flag); /* -- Representation of constant values of entities -- */ diff --git a/ir/tr/entity_t.h b/ir/tr/entity_t.h index 86a65b7d0..dc5f12c42 100644 --- a/ir/tr/entity_t.h +++ b/ir/tr/entity_t.h @@ -114,6 +114,7 @@ struct entity { 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. */ + unsigned final:1; /**< If set, this entity cannot be overridden. */ unsigned compiler_gen:1; /**< If set, this entity was compiler generated. */ int offset; /**< Offset in bits for this entity. Fixed when layout of owner is determined. */ @@ -277,12 +278,23 @@ _get_entity_stickyness(const entity *ent) { } static INLINE void -_set_entity_stickyness(entity *ent, ir_stickyness stickyness) -{ +_set_entity_stickyness(entity *ent, ir_stickyness stickyness) { assert(ent && ent->kind == k_entity); ent->stickyness = stickyness; } +static INLINE int +_get_entity_final(const entity *ent) { + assert(ent && ent->kind == k_entity); + return (int)ent->final; +} + +static INLINE void +_set_entity_final(entity *ent, int final) { + assert(ent && ent->kind == k_entity); + ent->final = final ? 1 : 0; +} + static INLINE int _get_entity_offset_bits(const entity *ent) { assert(ent && ent->kind == k_entity); @@ -384,6 +396,8 @@ _get_entity_repr_class(const entity *ent) { #define set_entity_peculiarity(ent, pec) _set_entity_peculiarity(ent, pec) #define get_entity_stickyness(ent) _get_entity_stickyness(ent) #define set_entity_stickyness(ent, stickyness) _set_entity_stickyness(ent, stickyness) +#define get_entity_final(ent) _get_entity_final(ent) +#define set_entity_final(ent, final) _set_entity_final(ent, final) #define get_entity_offset_bits(ent) _get_entity_offset_bits(ent) #define get_entity_offset_bytes(ent) _get_entity_offset_bytes(ent) #define set_entity_offset_bits(ent, offset) _set_entity_offset_bits(ent, offset) -- 2.20.1