X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftr%2Ftype.h;h=6e9d4c59fc33d013cd6c35dd4dd041b5e445c720;hb=ff244fb7355c6120cf0f15ba7911b473bb91c64b;hp=7abf38cf581fdfde39df22f984538bace7b2a8a7;hpb=6bd4b45f442292cce4c650c2bb10cae9e52323a0;p=libfirm diff --git a/ir/tr/type.h b/ir/tr/type.h index 7abf38cf5..6e9d4c59f 100644 --- a/ir/tr/type.h +++ b/ir/tr/type.h @@ -419,9 +419,9 @@ int smaller_type (ir_type *st, ir_type *lt); * The following two are dynamic lists that can be grown with an "add_" function, * but not shrinked: * - * - subtypes: A list of direct subclasses. + * - subtypes: A list of direct subclasses. * - * - supertypes: A list of direct superclasses. + * - supertypes: A list of direct superclasses. * * - peculiarity: The peculiarity of this class. If the class is of peculiarity * "description" it only is a description of requirements to a class, @@ -432,6 +432,17 @@ int smaller_type (ir_type *st, ir_type *lt); * no value for irg. * Values: description, existent, inherited. Default: existent. * + * - type_info: An entity representing the type information of this class. + * This entity can be of arbitrari type, Firm did not use it yet. + * It allows to express the coupling of a type with an entity + * representing this type. This information is useful for lowering + * of InstOf and TypeChk nodes. Default: NULL + * + * - final: A final class is always a leaf in the class hierarchy. Final + * classes cannot be super classes of other ones. As this information + * can only be computed in whole world compilations, we allow to + * set this flag. It is used in optimizations if get_opt_closed_world() + * is false. Default: false */ /** Creates a new class type. */ @@ -577,6 +588,18 @@ peculiarity get_class_peculiarity (const ir_type *clss); /** Sets the peculiarity of the class. */ void set_class_peculiarity (ir_type *clss, peculiarity pec); +/** Returns the type info entity of a class. */ +entity *get_class_type_info(const ir_type *clss); + +/** Set a type info entity for the class. */ +void set_class_type_info(ir_type *clss, entity *ent); + +/** Returns non-zero if a class is final. */ +int is_class_final(const ir_type *clss); + +/** Sets if a class is final. */ +void set_class_final(ir_type *clss, int flag); + /* Set and get a class' dfn -- @todo This is an undocumented field, subject to change! */ void set_class_dfn (ir_type *clss, int dfn); @@ -1091,7 +1114,7 @@ int is_Pointer_type (const ir_type *pointer); /** Returns the first pointer type that has as points_to tp. * Not efficient: O(#types). - * If not found returns unknown_type. */ + * If not found returns firm_unknown_type. */ ir_type *find_pointer_type_to_type (ir_type *tp); /** @@ -1100,7 +1123,7 @@ ir_type *find_pointer_type_to_type (ir_type *tp); * Primitive types are types that represent indivisible data values that * map directly to modes. They don't have a private attribute. The * important information they carry is held in the common mode field. -*/ + */ /** Creates a new primitive type. */ ir_type *new_type_primitive (ident *name, ir_mode *mode); @@ -1112,7 +1135,7 @@ int is_Primitive_type (const ir_type *primitive); /** - * @page none_type + * @page none_type The None type * * This type is an auxiliary type dedicated to support type analyses. * @@ -1203,10 +1226,15 @@ int get_compound_member_index(const ir_type *tp, entity *member); int is_compound_type(const ir_type *tp); /** - * Checks, whether a type is a frame type + * Checks, whether a type is a frame type. */ int is_frame_type(const ir_type *tp); +/** + * Checks, whether a type is a lowered type. + */ +int is_lowered_type(const ir_type *tp); + /** * Makes a new frame type. Frame types are class types, * so all class access functions work. @@ -1214,6 +1242,32 @@ int is_frame_type(const ir_type *tp); */ ir_type *new_type_frame(ident *name); +/** + * Sets a lowered type for a type. This sets both associations + * and marks lowered type as a "lowered" one. + */ +void set_lowered_type(ir_type *tp, ir_type *lowered_type); + +/** + * Gets the lowered/unlowered type of a type or NULL if this type + * has no lowered/unlowered one. + */ +ir_type *get_associated_type(const ir_type *tp); + +/** + * Allocate an area of size bytes aligned at alignment + * at the start or the end of a frame type. + * The frame type must have already an fixed layout. + * + * @param frame_type a frame type + * @param size the size of the entity + * @param alignment the alignment of the entity + * @param at_start if true, put the area at the frame type's start, else at end + * + * @return the entity representing the area + */ +entity *frame_alloc_area(type *frame_type, int size, int alignment, int at_start); + /*-----------------------------------------------------------------*/ /** Debug aides **/ /*-----------------------------------------------------------------*/