X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Ftyperep.h;h=fdc888006521cbe6ea2b1b662ce30b2187c1257f;hb=f7a0dee11313faad6f2ff54edc8eaadabd03e433;hp=ab39ae8db4859faa7f21d4153bb5e9583c22f133;hpb=cf79ddfe6713891acdc41aa3ecd5f5a61034ee94;p=libfirm diff --git a/include/libfirm/typerep.h b/include/libfirm/typerep.h index ab39ae8db..fdc888006 100644 --- a/include/libfirm/typerep.h +++ b/include/libfirm/typerep.h @@ -143,11 +143,14 @@ typedef enum { GCC: __attribute__((naked)). */ mtp_property_malloc = 0x00000020, /**< This method returns newly allocate memory. GCC: __attribute__((malloc)). */ - mtp_property_intrinsic = 0x00000040, /**< This method is intrinsic. It is expected that + mtp_property_weak = 0x00000040, /**< This method is weak. It is expected that + GCC: __attribute__((weak)). */ + mtp_property_intrinsic = 0x00000080, /**< This method is intrinsic. It is expected that a lowering phase will remove all calls to it. */ - mtp_property_runtime = 0x00000080, /**< This method represents a runtime routine. */ - mtp_property_private = 0x00000100, /**< All method invocations are known, the backend is free to + mtp_property_runtime = 0x00000100, /**< This method represents a runtime routine. */ + mtp_property_private = 0x00000200, /**< All method invocations are known, the backend is free to optimize the call in any possible way. */ + mtp_property_has_loop = 0x00000400, /**< Set, if this method contains one possible endless loop. */ mtp_property_inherited = (1<<31) /**< Internal. Used only in irg's, means property is inherited from type. */ } mtp_additional_property; @@ -326,11 +329,12 @@ const char *get_align_name(ir_align a); /** This enumeration flags the stickyness of an entity. */ typedef enum { - stickyness_unsticky, /**< The entity can be removed from - the program, unless contraindicated - by other attributes. Default. */ - stickyness_sticky /**< The entity must remain in the - program in any case. */ + stickyness_unsticky, /**< The entity can be removed from + the program, unless contraindicated + by other attributes. Default. */ + stickyness_sticky /**< The entity must remain in the + program in any case. There might be external + callers. */ } ir_stickyness; /** Get the entity's stickyness. */ @@ -396,22 +400,26 @@ int is_entity_backend_marked(const ir_entity *ent); void set_entity_backend_marked(ir_entity *ent, int flag); /** - * The state of the address_taken flag. + * Bitfield type indicating the way an entity is used. */ typedef enum { - ir_address_not_taken = 0, /**< The address is NOT taken. */ - ir_address_taken_unknown = 1, /**< The state of the address taken flag is unknown. */ - ir_address_taken = 2 /**< The address IS taken. */ -} ir_address_taken_state; - -/** Return the state of the address taken flag of an entity. */ -ir_address_taken_state get_entity_address_taken(const ir_entity *ent); + ir_usage_none = 0, /**< This entity is unused. */ + ir_usage_address_taken = 1 << 0, /**< The address of this entity was taken. */ + ir_usage_write = 1 << 1, /**< The entity was written to. */ + ir_usage_read = 1 << 2, /**< The entity was read. */ + ir_usage_reinterpret_cast = 1 << 3, /**< The entity was read but with a wrong mode + (an implicit reinterpret cast) */ + /** Unknown access */ + ir_usage_unknown + = ir_usage_address_taken | ir_usage_write | ir_usage_read + | ir_usage_reinterpret_cast +} ir_entity_usage; + +/** Return the entity usage */ +ir_entity_usage get_entity_usage(const ir_entity *ent); /** Sets/resets the state of the address taken flag of an entity. */ -void set_entity_address_taken(ir_entity *ent, ir_address_taken_state flag); - -/** Return the name of the address_taken state. */ -const char *get_address_taken_state_name(ir_address_taken_state state); +void set_entity_usage(ir_entity *ent, ir_entity_usage flag); /** * Returns the debug information of an entity. @@ -456,13 +464,13 @@ void set_atomic_ent_value(ir_entity *ent, ir_node *val); /** the kind (type) of an initializer */ typedef enum ir_initializer_kind_t { - /* initializer containing an ir_node from the const-code irg */ + /** initializer containing an ir_node from the const-code irg */ IR_INITIALIZER_CONST, - /* initializer containing a tarval */ + /** initializer containing a tarval */ IR_INITIALIZER_TARVAL, - /* initializes type with default values (usually 0) */ + /** initializes type with default values (usually 0) */ IR_INITIALIZER_NULL, - /* list of initializers used to initializer a compound or array type */ + /** list of initializers used to initializer a compound or array type */ IR_INITIALIZER_COMPOUND } ir_initializer_kind_t; @@ -515,10 +523,16 @@ void free_compound_graph_path(compound_graph_path *gr); /** Returns the length of a graph path */ int get_compound_graph_path_length(const compound_graph_path *gr); +/** Get the entity node of an compound graph path at position pos. */ ir_entity *get_compound_graph_path_node(const compound_graph_path *gr, int pos); -void set_compound_graph_path_node(compound_graph_path *gr, int pos, ir_entity *node); -int get_compound_graph_path_array_index(const compound_graph_path *gr, int pos); -void set_compound_graph_path_array_index(compound_graph_path *gr, int pos, int index); +/** Set the entity node of an compound graph path at position pos. */ +void set_compound_graph_path_node(compound_graph_path *gr, int pos, ir_entity *node); +/** Get the index of an compound graph path at position pos. */ +int get_compound_graph_path_array_index(const compound_graph_path *gr, int pos); +/** Set the index of an compound graph path at position pos. */ +void set_compound_graph_path_array_index(compound_graph_path *gr, int pos, int index); +/** Get the type of an compound graph path. */ +ir_type *get_compound_graph_path_type(const compound_graph_path *gr); /** Checks whether the path up to pos is correct. If the path contains a NULL, * assumes the path is not complete and returns non-zero. */ @@ -564,8 +578,10 @@ ir_entity *get_compound_ent_value_member(ir_entity *ent, int pos); /** Sets the path at pos 0 */ void set_compound_ent_value(ir_entity *ent, ir_node *val, ir_entity *member, int pos); +/** Sets the new style initializers of an entity. */ void set_entity_initializer(ir_entity *entity, ir_initializer_t *initializer); +/** Return the new style initializers of an entity. */ ir_initializer_t *get_entity_initializer(const ir_entity *entity); /** Initializes the entity ent which must be of a one dimensional @@ -656,10 +672,10 @@ int equal_entity(ir_entity *ent1, ir_entity *ent2); long get_entity_nr(const ir_entity *ent); /** Returns the entities visited count. */ -unsigned long get_entity_visited(ir_entity *ent); +ir_visited_t get_entity_visited(ir_entity *ent); /** Sets the entities visited count. */ -void set_entity_visited(ir_entity *ent, unsigned long num); +void set_entity_visited(ir_entity *ent, ir_visited_t num); /** Sets visited field in entity to entity_visited. */ void mark_entity_visited(ir_entity *ent); @@ -745,22 +761,6 @@ typedef enum acc_bits { #define IS_WRITTEN(a) ((a) & ptr_access_write) #define IS_STORED(a) ((a) & ptr_access_store) -/** - * Supported image sections. - * Currently only methods can be placed in different sections. - */ -typedef enum { - section_text, /**< The code segment. This is the default for methods. */ - section_constructors /**< The constructor section. */ -} ir_img_section; - -/** Returns the section of a method. */ -ir_img_section get_method_img_section(const ir_entity *method); - -/** Sets the section of a method. */ -void set_method_img_section(ir_entity *method, ir_img_section section); - - /** * @page tyop type operations * This module specifies the kinds of types available in firm. @@ -1394,10 +1394,7 @@ unsigned get_type_size_bytes(const ir_type *tp); */ void set_type_size_bytes(ir_type *tp, unsigned size); -/** Returns the alignment of a type in bytes. - * - * Returns -1 if the alignment is NOT - * a byte size, i.e. not dividable by 8. Calls get_type_alignment_bits(). */ +/** Returns the alignment of a type in bytes. */ unsigned get_type_alignment_bytes(ir_type *tp); /** Returns the alignment of a type in bits. @@ -1413,9 +1410,9 @@ unsigned get_type_alignment_bytes(ir_type *tp); void set_type_alignment_bytes(ir_type *tp, unsigned align); /** Returns the visited count of a type. */ -unsigned long get_type_visited(const ir_type *tp); +ir_visited_t get_type_visited(const ir_type *tp); /** Sets the visited count of a type to num. */ -void set_type_visited(ir_type *tp, unsigned long num); +void set_type_visited(ir_type *tp, ir_visited_t num); /** Sets visited field in type to type_visited. */ void mark_type_visited(ir_type *tp); /** Returns non-zero if the type is already visited */ @@ -1440,9 +1437,9 @@ void set_type_link(ir_type *tp, void *l); * * @see typewalk */ -void set_master_type_visited(unsigned long val); -unsigned long get_master_type_visited(void); -void inc_master_type_visited(void); +void set_master_type_visited(ir_visited_t val); +ir_visited_t get_master_type_visited(void); +void inc_master_type_visited(void); /** * Sets the debug information of a type. @@ -1976,21 +1973,22 @@ void set_method_additional_property(ir_type *method, mtp_additional_property fla * upper 8 encode the calling conventions. */ typedef enum { - cc_reg_param = 0x01000000, /**< Transmit parameters in registers, else the stack is used. - This flag may be set as default on some architectures. */ - cc_last_on_top = 0x02000000, /**< The last non-register parameter is transmitted on top of - the stack. This is equivalent to the pascal - calling convention. If this flag is not set, the first - non-register parameter is used (stdcall or cdecl - calling convention) */ - cc_callee_clear_stk = 0x04000000, /**< The callee clears the stack. This forbids variadic - function calls (stdcall). */ - cc_this_call = 0x08000000, /**< The first parameter is a this pointer and is transmitted - in a special way. */ - cc_compound_ret = 0x10000000, /**< the method returns a compound - type */ - - cc_bits = (0xFF << 24) /**< the calling convention bits */ + cc_reg_param = 0x01000000, /**< Transmit parameters in registers, else the stack is used. + This flag may be set as default on some architectures. */ + cc_last_on_top = 0x02000000, /**< The last non-register parameter is transmitted on top of + the stack. This is equivalent to the pascal + calling convention. If this flag is not set, the first + non-register parameter is used (stdcall or cdecl + calling convention) */ + cc_callee_clear_stk = 0x04000000, /**< The callee clears the stack. This forbids variadic + function calls (stdcall). */ + cc_this_call = 0x08000000, /**< The first parameter is a this pointer and is transmitted + in a special way. */ + cc_compound_ret = 0x10000000, /**< The method returns a compound type. */ + cc_frame_on_caller_stk = 0x20000000, /**< The method did not allocate an own stack frame, instead the + caller must reserve size on its own stack. */ + cc_fpreg_param = 0x40000000, /**< Transmit floating point parameters in registers, else the stack is used. */ + cc_bits = (0xFF << 24)/**< The calling convention bits. */ } calling_convention; /* some often used cases: made as defines because firmjni cannot handle two @@ -2417,6 +2415,13 @@ int is_lowered_type(const ir_type *tp); */ ir_type *new_type_frame(ident *name); +/** + * Makes a clone of a frame type. + * Sets entity links from old frame entities to new onces and + * vice versa. + */ +ir_type *clone_frame_type(ir_type *type); + /** * Sets a lowered type for a type. This sets both associations * and marks lowered_type as a "lowered" one. @@ -2574,7 +2579,7 @@ typedef union { * @param tore points to the visited type or entity * @param env free environment pointer */ -typedef void type_walk_func(type_or_ent *tore, void *env); +typedef void type_walk_func(type_or_ent tore, void *env); /** The class walk function *