Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
93505902
Commit
93505902
authored
Nov 08, 2005
by
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
Changes
3
Hide whitespace changes
Inline
Side-by-side
ir/ir/irgraph.c
View file @
93505902
...
...
@@ -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
);
...
...
ir/ir/irgraph.h
View file @
93505902
...
...
@@ -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
);
...
...
ir/ir/irgraph_t.h
View file @
93505902
...
...
@@ -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)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment