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
283996b9
Commit
283996b9
authored
Nov 08, 2005
by
Michael Beck
Browse files
a method type now has calling conventions and additional properties.
The properties can be overwritten by a entity or a irg [r6889]
parent
8191fe60
Changes
3
Hide whitespace changes
Inline
Side-by-side
ir/tr/type.c
View file @
283996b9
...
...
@@ -87,9 +87,13 @@ int get_irp_new_node_nr(void);
static
ident
*
value_params_suffix
=
NULL
;
static
ident
*
value_ress_suffix
=
NULL
;
/** The default calling convention for method types. */
static
unsigned
default_cc_mask
;
/* Initialize the type module. */
void
firm_init_type
(
dbg_info
*
builtin_db
)
void
firm_init_type
(
dbg_info
*
builtin_db
,
unsigned
def_cc_mask
)
{
default_cc_mask
=
def_cc_mask
;
value_params_suffix
=
new_id_from_str
(
VALUE_PARAMS_SUFFIX
);
value_ress_suffix
=
new_id_from_str
(
VALUE_RESS_SUFFIX
);
...
...
@@ -1102,6 +1106,7 @@ type *new_d_type_method(ident *name, int n_param, int n_res, dbg_info *db) {
res
->
attr
.
ma
.
value_ress
=
NULL
;
res
->
attr
.
ma
.
variadicity
=
variadicity_non_variadic
;
res
->
attr
.
ma
.
first_variadic_param
=
-
1
;
res
->
attr
.
ma
.
irg_calling_conv
=
default_cc_mask
;
hook_new_type
(
res
);
return
res
;
}
...
...
@@ -1296,6 +1301,28 @@ void set_method_first_variadic_param_index(type *method, int index)
method
->
attr
.
ma
.
first_variadic_param
=
index
;
}
unsigned
(
get_method_additional_properties
)(
const
type
*
method
)
{
return
_get_method_additional_properties
(
method
);
}
void
(
set_method_additional_properties
)(
type
*
method
,
unsigned
mask
)
{
_set_method_additional_properties
(
method
,
mask
);
}
void
(
set_method_additional_property
)(
type
*
method
,
mtp_additional_property
flag
)
{
_set_method_additional_property
(
method
,
flag
);
}
/* Returns the calling convention of an entities graph. */
unsigned
(
get_method_calling_convention
)(
const
type
*
method
)
{
return
_get_method_calling_convention
(
method
);
}
/* Sets the calling convention of an entities graph. */
void
(
set_method_calling_convention
)(
type
*
method
,
unsigned
cc_mask
)
{
_set_method_calling_convention
(
method
,
cc_mask
);
}
/* typecheck */
int
(
is_Method_type
)(
const
type
*
method
)
{
return
_is_method_type
(
method
);
...
...
ir/tr/type.h
View file @
283996b9
...
...
@@ -764,11 +764,89 @@ int get_method_first_variadic_param_index(const type *method);
*/
void
set_method_first_variadic_param_index
(
type
*
method
,
int
index
);
/**
* additional method type properties:
* Tell about special properties of a method type. Some
* of these may be discovered by analyses.
*/
typedef
enum
{
mtp_no_property
=
0x00000000
,
/**< no additional properties, default */
mtp_property_const
=
0x00000001
,
/**< This graph did not access memory and calculates
its return values solely from its parameters.
GCC: __attribute__((const)). */
mtp_property_pure
=
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)). */
mtp_property_noreturn
=
0x00000004
,
/**< This graph did not return due to an aborting system
call.
GCC: __attribute__((noreturn)). */
mtp_property_nothrow
=
0x00000008
,
/**< This graph cannot throw an exception.
GCC: __attribute__((nothrow)). */
mtp_property_naked
=
0x00000010
,
/**< This graph is naked.
GCC: __attribute__((naked)). */
mtp_property_malloc
=
0x00000020
,
/**< This graph returns newly allocate memory.
GCC: __attribute__((malloc)). */
mtp_property_inherited
=
0x80000000
/**< used only in irgs, means property is inherited
from type. */
}
mtp_additional_property
;
/** Returns the mask of the additional graph properties. */
unsigned
get_method_additional_properties
(
const
type
*
method
);
/** Sets the mask of the additional graph properties. */
void
set_method_additional_properties
(
type
*
method
,
unsigned
property_mask
);
/** Sets one additional graph property. */
void
set_method_additional_property
(
type
*
method
,
mtp_additional_property
flag
);
/**
* calling conventions
*/
typedef
enum
{
cc_reg_param
=
0x00000001
,
/**< Transmit parameters in registers, else the stack is used.
This flag may be set as default on some architectures. */
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) */
cc_callee_clear_stk
=
0x00000004
,
/**< The callee clears the stack. This forbids variadic
function calls (stdcall). */
cc_this_call
=
0x00000008
/**< The first parameter is a this pointer and is transmitted
in a special way. */
}
calling_convention
;
/**
* check for the CDECL calling convention
*/
#define IS_CDECL(cc_mask) (((cc_mask) & (cc_callee_clear_stk|cc_last_on_top)) == 0)
/**
* check for the STDCALL calling convention
*/
#define IS_STDCALL(cc_mask) (((cc_mask) & (cc_callee_clear_stk|cc_last_on_top)) == cc_callee_clear_stk)
/**
* add the CDECL convention bits
*/
#define SET_CDECL(cc_mask) ((cc_mask) & ~(cc_callee_clear_stk|cc_last_on_top))
/**
* add the STDCALL convention bits
*/
#define SET_STDCALL(cc_mask) (((cc_mask) & ~cc_last_on_top) | cc_callee_clear_stk)
/** Returns the calling convention of an entities graph. */
unsigned
get_method_calling_convention
(
const
type
*
method
);
/** Sets the calling convention of an entities graph. */
void
set_method_calling_convention
(
type
*
method
,
unsigned
cc_mask
);
/** Returns true if a type is a method type. */
int
is_Method_type
(
const
type
*
method
);
/**
* @page union_type Representation of a union type.
* @page union_type Representation of a union
(variant)
type.
*
* The union type represents union types.
* - n_types: Number of unioned types.
...
...
ir/tr/type_t.h
View file @
283996b9
...
...
@@ -10,14 +10,15 @@
* Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
*/
#
ifndef _TYPE_T_H_
#
define _TYPE_T_H_
#ifndef _TYPE_T_H_
#define _TYPE_T_H_
# include "firm_config.h"
# include "type.h"
# include "tpop_t.h"
#include
"firm_config.h"
#include
"type.h"
#include
"tpop_t.h"
#include
"irgraph.h"
#
include "array.h"
#include
"array.h"
/**
* @file type_t.h
...
...
@@ -49,14 +50,16 @@ typedef struct {
/** method attributes */
typedef
struct
{
int
n_params
;
/**< number of parameters */
tp_ent_pair
*
param_type
;
/**< array of parameter type/value entities pairs */
type
*
value_params
;
/**< A type whose entities represent copied value arguments. */
int
n_res
;
/**< number of results */
tp_ent_pair
*
res_type
;
/**< array of result type/value entity pairs */
type
*
value_ress
;
/**< A type whose entities represent copied value results. */
variadicity
variadicity
;
/**< variadicity of the method. */
int
first_variadic_param
;
/**< index of the first variadic param or -1 if non-variadic .*/
int
n_params
;
/**< number of parameters */
tp_ent_pair
*
param_type
;
/**< array of parameter type/value entities pairs */
type
*
value_params
;
/**< A type whose entities represent copied value arguments. */
int
n_res
;
/**< number of results */
tp_ent_pair
*
res_type
;
/**< array of result type/value entity pairs */
type
*
value_ress
;
/**< A type whose entities represent copied value results. */
variadicity
variadicity
;
/**< variadicity of the method. */
int
first_variadic_param
;
/**< index of the first variadic param or -1 if non-variadic .*/
unsigned
additional_properties
;
/**< Set of additional method properties. */
unsigned
irg_calling_conv
;
/**< this is a set of calling convention flags. */
}
mtd_attr
;
/** union attributes */
...
...
@@ -66,13 +69,13 @@ typedef struct {
/** array attributes */
typedef
struct
{
int
n_dimensions
;
/**< Number of array dimensions. */
ir_node
**
lower_bound
;
/**< Lower bounds of dimensions. Usually all 0. */
ir_node
**
upper_bound
;
/**< Upper bounds or dimensions. */
int
*
order
;
/**< Ordering of dimensions. */
type
*
element_type
;
/**< The type of the array elements. */
entity
*
element_ent
;
/**< Entity for the array elements, to be used for
element selection with Sel. */
int
n_dimensions
;
/**< Number of array dimensions. */
ir_node
**
lower_bound
;
/**< Lower bounds of dimensions. Usually all 0. */
ir_node
**
upper_bound
;
/**< Upper bounds or dimensions. */
int
*
order
;
/**< Ordering of dimensions. */
type
*
element_type
;
/**< The type of the array elements. */
entity
*
element_ent
;
/**< Entity for the array elements, to be used for
element selection with Sel. */
}
arr_attr
;
/** enum attributes */
...
...
@@ -189,9 +192,10 @@ void set_default_size_bits(type *tp, int size);
/**
* Initialize the type module.
*
* @param builtin_db debug info for builtin objects
* @param builtin_db debug info for builtin objects
* @param default_cc_mask default calling conventions for methods
*/
void
firm_init_type
(
dbg_info
*
builtin_db
);
void
firm_init_type
(
dbg_info
*
builtin_db
,
unsigned
default_cc_mask
);
/* ------------------- *
...
...
@@ -393,6 +397,41 @@ _get_method_n_ress(const type *method) {
return
method
->
attr
.
ma
.
n_res
;
}
static
INLINE
unsigned
_get_method_additional_properties
(
const
type
*
method
)
{
assert
(
method
&&
(
method
->
type_op
==
type_method
));
return
method
->
attr
.
ma
.
additional_properties
;
}
static
INLINE
void
_set_method_additional_properties
(
type
*
method
,
unsigned
mask
)
{
assert
(
method
&&
(
method
->
type_op
==
type_method
));
/* do not allow to set the mtp_property_inherited flag or
* the automatic inheritance of flags will not work */
method
->
attr
.
ma
.
additional_properties
=
mask
&
~
mtp_property_inherited
;
}
static
INLINE
void
_set_method_additional_property
(
type
*
method
,
mtp_additional_property
flag
)
{
assert
(
method
&&
(
method
->
type_op
==
type_method
));
/* do not allow to set the mtp_property_inherited flag or
* the automatic inheritance of flags will not work */
method
->
attr
.
ma
.
additional_properties
|=
flag
&
~
mtp_property_inherited
;
}
static
INLINE
unsigned
_get_method_calling_convention
(
const
type
*
method
)
{
assert
(
method
&&
(
method
->
type_op
==
type_method
));
return
method
->
attr
.
ma
.
irg_calling_conv
;
}
static
INLINE
void
_set_method_calling_convention
(
type
*
method
,
unsigned
cc_mask
)
{
assert
(
method
&&
(
method
->
type_op
==
type_method
));
method
->
attr
.
ma
.
irg_calling_conv
=
cc_mask
;
}
#define set_master_type_visited(val) _set_master_type_visited(val)
#define get_master_type_visited() _get_master_type_visited()
...
...
@@ -426,5 +465,10 @@ _get_method_n_ress(const type *method) {
#define is_atomic_type(tp) _is_atomic_type(tp)
#define get_method_n_params(method) _get_method_n_params(method)
#define get_method_n_ress(method) _get_method_n_ress(method)
#define get_method_additional_properties(method) _get_method_additional_properties(method)
#define set_method_additional_properties(method, mask) _set_method_additional_properties(method, mask)
#define set_method_additional_property(method, flag) _set_method_additional_property(method, flag)
#define get_method_calling_convention(method) _get_method_calling_convention(method)
#define set_method_calling_convention(method, cc_mask) _set_method_calling_convention(method, cc_mask)
#
endif
/* _TYPE_T_H_ */
#endif
/* _TYPE_T_H_ */
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