Commit 93505902 authored by Michael Beck's avatar Michael Beck
Browse files

calling conventions are now stored in the type

additional properties are inherited from the type but can be set

[r6883]
parent 650602c3
......@@ -79,24 +79,10 @@ void (set_interprocedural_view)(int state) {
/** contains the suffix for frame type names */
static ident *frame_type_suffix = NULL;
/** The default firm calling convention mask. */
static unsigned firm_default_cc_mask = 0;
/* initialize the IR graph module */
void firm_init_irgraph(unsigned default_cc_mask) {
void firm_init_irgraph(void) {
frame_type_suffix = new_id_from_str(FRAME_TP_SUFFIX);
forbid_new_data = 1;
firm_default_cc_mask = default_cc_mask;
}
/* Gets the default calling convention for new constructed graphs. */
unsigned get_firm_default_calling_convention(void) {
return firm_default_cc_mask;
}
/* Sets the default calling convention for new constructed graphs. */
void set_firm_default_calling_convention(unsigned cc_mask) {
firm_default_cc_mask = cc_mask;
forbid_new_data = 1;
}
/**
......@@ -191,7 +177,7 @@ new_r_ir_graph (entity *ent, int n_loc)
res->outs = NULL;
res->inline_property = irg_inline_any;
res->additional_properties = irg_no_property;
res->additional_properties = mtp_property_inherited; /* inherited from type */
res->phase_state = phase_building;
res->op_pin_state_pinned = op_pin_state_pinned;
......@@ -204,7 +190,6 @@ new_r_ir_graph (entity *ent, int n_loc)
res->execfreq_state = exec_freq_none;
res->class_cast_state = ir_class_casts_transitive;
res->extblk_state = ir_extblk_info_none;
res->calling_conv = get_firm_default_calling_convention();
/*-- Type information for the procedure of the graph --*/
res->ent = ent;
......@@ -700,22 +685,10 @@ void
}
void
(set_irg_additional_property)(ir_graph *irg, irg_additional_property flag) {
(set_irg_additional_property)(ir_graph *irg, mtp_additional_property flag) {
_set_irg_additional_property(irg, flag);
}
/* Returns the calling convention of a graph. */
unsigned
(get_irg_calling_convention)(const ir_graph *irg) {
return _get_irg_calling_convention(irg);
}
/* Sets the calling convention of a graph. */
void
(set_irg_calling_convention)(ir_graph *irg, unsigned cc_mask) {
_set_irg_calling_convention(irg, cc_mask);
}
void
(set_irg_link)(ir_graph *irg, void *thing) {
_set_irg_link(irg, thing);
......
......@@ -25,6 +25,7 @@
#include "firm_types.h"
#include "irop.h"
#include "irextbb.h"
#include "type.h"
/**
* @page ir_graph The struct ir_graph
......@@ -414,86 +415,19 @@ irg_inline_property get_irg_inline_property(const ir_graph *irg);
/** Sets the inline property of a graph. */
void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
/** additional graph flags:
* Tell about special properties of a graph. Some
* of these may be discovered by analyses.
/**
* Returns the mask of the additional graph properties.
* The properties are automatically inherited from the method type
* if they were not set using set_irg_additional_properties() or
* set_irg_additional_property().
*/
typedef enum {
irg_no_property = 0x00000000, /**< no additional properties, default */
irg_const_function = 0x00000001, /**< This graph did not access memory and calculates
its return values solely from its parameters.
GCC: __attribute__((const)). */
irg_pure_function = 0x00000002, /**< This graph did NOT write to memory and calculates
its return values solely form its parameters and
the memory they points to (or global vars).
GCC: __attribute__((pure)). */
irg_noreturn_function = 0x00000004, /**< This graph did not return due to an aborting system
call.
GCC: __attribute__((noreturn)). */
irg_nothrow_function = 0x00000008, /**< This graph cannot throw an exception.
GCC: __attribute__((nothrow)). */
irg_naked_function = 0x00000010, /**< This graph is naked.
GCC: __attribute__((naked)). */
irg_malloc_function = 0x00000020 /**< This graph returns newly allocate memory.
GCC: __attribute__((malloc)). */
} irg_additional_property;
/** Returns the mask of the additional graph properties. */
unsigned get_irg_additional_properties(const ir_graph *irg);
/** Sets the mask of the additional graph properties. */
void set_irg_additional_properties(ir_graph *irg, unsigned property_mask);
/** Sets one additional graph property. */
void set_irg_additional_property(ir_graph *irg, irg_additional_property flag);
/**
* calling conventions
*/
typedef enum {
irg_cc_reg_param = 0x00000001, /**< Transmit parameters in registers, else the stack is used.
This flag may be set as default on some architectures. */
irg_cc_last_on_top = 0x00000002, /**< The last non-register parameter is transmitted on top of
the stack. This is equivalent to the stdcall or pascal
calling convention. If this flag is not set, the first
non-register parameter is used (cdecl calling convention) */
irg_cc_callee_clear_stk = 0x00000004, /**< The callee clears the stack. This forbids variadic
function calls (stdcall). */
irg_cc_this_call = 0x00000008 /**< The first parameter is a this pointer and is transmitted
in a special way. */
} irg_calling_convention;
/** Returns the calling convention of a graph. */
unsigned get_irg_calling_convention(const ir_graph *irg);
/** Sets the calling convention of a graph. */
void set_irg_calling_convention(ir_graph *irg, unsigned cc_mask);
/** Gets the default calling convention for new constructed graphs. */
unsigned get_firm_default_calling_convention(void);
/** Sets the default calling convention for new constructed graphs. */
void set_firm_default_calling_convention(unsigned cc_mask);
/**
* check for the CDECL calling convention
*/
#define IS_CDECL(cc_mask) (((cc_mask) & (irg_cc_callee_clear_stk|irg_cc_last_on_top)) == 0)
/**
* check for the STDCALL calling convention
*/
#define IS_STDCALL(cc_mask) (((cc_mask) & (irg_cc_callee_clear_stk|irg_cc_last_on_top)) == irg_cc_callee_clear_stk)
/**
* add the CDECL convention bits
*/
#define SET_CDECL(cc_mask) ((cc_mask) & ~(irg_cc_callee_clear_stk|irg_cc_last_on_top))
/**
* add the STDCALL convention bits
*/
#define SET_STDCALL(cc_mask) (((cc_mask) & ~irg_cc_last_on_top) | irg_cc_callee_clear_stk)
void set_irg_additional_property(ir_graph *irg, mtp_additional_property flag);
/** A void * field to link arbitrary information to the node. */
void set_irg_link (ir_graph *irg, void *thing);
......
......@@ -29,6 +29,7 @@
#include "irprog.h"
#include "pseudo_irg.h"
#include "type_t.h"
#include "entity_t.h"
#include "typegmod.h"
#include "tr_inheritance.h"
......@@ -97,7 +98,6 @@ struct ir_graph {
exec_freq_state execfreq_state; /**< state of execution frequency information */
ir_class_cast_state class_cast_state; /**< kind of cast operations in code. */
irg_extblk_info_state extblk_state; /**< state of extended basic block info */
unsigned calling_conv; /**< calling convention */
/* -- Fields for construction -- */
#if USE_EXPLICIT_PHI_IN_STACK
......@@ -147,10 +147,8 @@ struct ir_graph {
/**
* Initializes the graph construction module
*
* @param default_cc_mask The default calling convention.
*/
void firm_init_irgraph(unsigned default_cc_mask);
void firm_init_irgraph(void);
/* Internal constructor that does not add to irp_irgs or the like. */
ir_graph *new_r_ir_graph (entity *ent, int n_loc);
......@@ -449,27 +447,25 @@ _set_irg_inline_property(ir_graph *irg, irg_inline_property s) {
static INLINE unsigned
_get_irg_additional_properties(const ir_graph *irg) {
if (irg->additional_properties & mtp_property_inherited)
return get_method_additional_properties(get_entity_type(irg->ent));
return irg->additional_properties;
}
static INLINE void
_set_irg_additional_properties(ir_graph *irg, unsigned mask) {
irg->additional_properties = mask;
/* do not allow to set the mtp_property_inherited flag or
* the automatic inheritance of flags will not work */
irg->additional_properties = mask & ~mtp_property_inherited;
}
static INLINE void
_set_irg_additional_property(ir_graph *irg, irg_additional_property flag) {
irg->additional_properties |= flag;
}
static INLINE unsigned
_get_irg_calling_convention(const ir_graph *irg) {
return irg->calling_conv;
}
_set_irg_additional_property(ir_graph *irg, mtp_additional_property flag) {
unsigned prop = irg->additional_properties;
static INLINE void
_set_irg_calling_convention(ir_graph *irg, unsigned cc_mask) {
irg->calling_conv = cc_mask;
if (prop & mtp_property_inherited)
prop = get_method_additional_properties(get_entity_type(irg->ent));
irg->additional_properties = prop | flag;
}
static INLINE void
......@@ -553,8 +549,6 @@ _inc_irg_block_visited(ir_graph *irg) {
#define get_irg_additional_properties(irg) _get_irg_additional_properties(irg)
#define set_irg_additional_properties(irg, m) _set_irg_additional_properties(irg, m)
#define set_irg_additional_property(irg, f) _set_irg_additional_property(irg, f)
#define get_irg_calling_convention(irg) _get_irg_calling_convention(irg)
#define set_irg_calling_convention(irg, cc) _set_irg_calling_convention(irg, cc)
#define set_irg_link(irg, thing) _set_irg_link(irg, thing)
#define get_irg_link(irg) _get_irg_link(irg)
#define get_irg_visited(irg) _get_irg_visited(irg)
......
Supports Markdown
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