Commit 671ced67 authored by Matthias Braun's avatar Matthias Braun
Browse files

automatically generate most getter/setter functions of firm nodes

[r27328]
parent 8c79e4af
......@@ -491,7 +491,7 @@ int is_Const_all_one(const ir_node *node);
/** Returns the source language type of a Const node.
* Must be an atomic type. Mode of type must be mode of node.
*/
ir_type *get_Const_type(ir_node *node);
ir_type *get_Const_type(const ir_node *node);
/** Sets the source language type of a Const node. */
void set_Const_type(ir_node *node, ir_type *tp);
......@@ -532,7 +532,7 @@ void set_SymConst_symbol(ir_node *node,
/** Access the type of the value represented by the SymConst.
*
* Example: primitive type int for SymConst size. */
ir_type *get_SymConst_value_type(ir_node *node);
ir_type *get_SymConst_value_type(const ir_node *node);
void set_SymConst_value_type(ir_node *node, ir_type *tp);
ir_node *get_Sel_mem(const ir_node *node);
......@@ -575,7 +575,7 @@ ir_node *get_Call_param(const ir_node *node, int pos);
/** Sets the call parameter at position pos. */
void set_Call_param(ir_node *node, int pos, ir_node *param);
/** Gets the type of a call. */
ir_type *get_Call_type(ir_node *node);
ir_type *get_Call_type(const ir_node *node);
/** Sets the type of a call. */
void set_Call_type(ir_node *node, ir_type *tp);
/** Returns non-zero if this call can be a tail-call. */
......@@ -637,7 +637,7 @@ ir_node *get_Builtin_param(const ir_node *node, int pos);
/** Sets the Builtin parameter at position pos. */
void set_Builtin_param(ir_node *node, int pos, ir_node *param);
/** Gets the type of a builtin. */
ir_type *get_Builtin_type(ir_node *node);
ir_type *get_Builtin_type(const ir_node *node);
/** Sets the type of a Builtin. */
void set_Builtin_type(ir_node *node, ir_type *tp);
/** Returns a human readable string for the ir_builtin_kind. */
......@@ -854,7 +854,7 @@ void set_Conv_strict(ir_node *node, int flag);
*/
ir_node *get_Cast_op(const ir_node *node);
void set_Cast_op(ir_node *node, ir_node *op);
ir_type *get_Cast_type(ir_node *node);
ir_type *get_Cast_type(const ir_node *node);
void set_Cast_type(ir_node *node, ir_type *to_tp);
/** Checks for upcast.
......@@ -891,16 +891,16 @@ void set_Phi_pred(ir_node *node, int pos, ir_node *pred);
ir_node *get_Phi_next(const ir_node *phi);
void set_Phi_next(ir_node *phi, ir_node *next);
ir_node *get_Filter_pred(ir_node *node);
ir_node *get_Filter_pred(const ir_node *node);
void set_Filter_pred(ir_node *node, ir_node *pred);
long get_Filter_proj(ir_node *node);
long get_Filter_proj(const ir_node *node);
void set_Filter_proj(ir_node *node, long proj);
/* set the interprocedural predecessors, ...d_arr uses current_ir_graph.
* @@@ Maybe better: arity is zero if no cg preds. */
void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in);
void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred);
int get_Filter_n_cg_preds(ir_node *node);
ir_node *get_Filter_cg_pred(ir_node *node, int pos);
int get_Filter_n_cg_preds(const ir_node *node);
ir_node *get_Filter_cg_pred(const ir_node *node, int pos);
/** Return true if parameter is a memory operation.
*
......@@ -971,7 +971,7 @@ ir_node *get_Alloc_mem(const ir_node *node);
void set_Alloc_mem(ir_node *node, ir_node *mem);
ir_node *get_Alloc_count(const ir_node *node);
void set_Alloc_count(ir_node *node, ir_node *count);
ir_type *get_Alloc_type(ir_node *node);
ir_type *get_Alloc_type(const ir_node *node);
void set_Alloc_type(ir_node *node, ir_type *tp);
ir_where_alloc get_Alloc_where(const ir_node *node);
......@@ -983,7 +983,7 @@ ir_node *get_Free_ptr(const ir_node *node);
void set_Free_ptr(ir_node *node, ir_node *ptr);
ir_node *get_Free_size(const ir_node *node);
void set_Free_size(ir_node *node, ir_node *size);
ir_type *get_Free_type(ir_node *node);
ir_type *get_Free_type(const ir_node *node);
void set_Free_type(ir_node *node, ir_type *tp);
ir_where_alloc get_Free_where(const ir_node *node);
......@@ -998,7 +998,7 @@ void add_Sync_pred(ir_node *node, ir_node *pred);
/** Returns the source language type of a Proj node.
* Must be an atomic type. Mode of type must be mode of node.
*/
ir_type *get_Proj_type(ir_node *node);
ir_type *get_Proj_type(const ir_node *node);
/** Return the predecessor of a Proj node. */
ir_node *get_Proj_pred(const ir_node *node);
......@@ -1059,7 +1059,7 @@ ir_node *get_CopyB_dst(const ir_node *node);
void set_CopyB_dst(ir_node *node, ir_node *dst);
ir_node *get_CopyB_src(const ir_node *node);
void set_CopyB_src(ir_node *node, ir_node *src);
ir_type *get_CopyB_type(ir_node *node);
ir_type *get_CopyB_type(const ir_node *node);
void set_CopyB_type(ir_node *node, ir_type *data_type);
/**
......@@ -1075,7 +1075,7 @@ typedef enum {
#define pn_InstOf_M pn_InstOf_M_regular
/** InstOf access. */
ir_type *get_InstOf_type(ir_node *node);
ir_type *get_InstOf_type(const ir_node *node);
void set_InstOf_type(ir_node *node, ir_type *type);
ir_node *get_InstOf_store(const ir_node *node);
void set_InstOf_store(ir_node *node, ir_node *obj);
......@@ -1129,18 +1129,27 @@ void set_Pin_op(ir_node *pin, ir_node *node);
/** Return the assembler text of an ASM pseudo node. */
ident *get_ASM_text(const ir_node *node);
/** Set assembler text of ASM node */
void set_ASM_text(ir_node *node, ident *text);
/** Return the number of input constraints for an ASM node. */
int get_ASM_n_input_constraints(const ir_node *node);
/** Return the input constraints for an ASM node. */
const ir_asm_constraint *get_ASM_input_constraints(const ir_node *node);
ir_asm_constraint *get_ASM_input_constraints(const ir_node *node);
/** Set input constraints for ASM node. */
void set_ASM_input_constraints(ir_node *node, ir_asm_constraint *constraints);
/** Return the number of output constraints for an ASM node. */
int get_ASM_n_output_constraints(const ir_node *node);
/** Return the output constraints for an ASM node. */
const ir_asm_constraint *get_ASM_output_constraints(const ir_node *node);
ir_asm_constraint *get_ASM_output_constraints(const ir_node *node);
/** Set output constraints for ASM node. (note: has to be a firm array) */
void set_ASM_output_constraints(ir_node *node, ir_asm_constraint *constraints);
/** Return the number of clobbered registers for an ASM node. */
int get_ASM_n_clobbers(const ir_node *node);
/** Return the list of clobbered registers for an ASM node. */
ident **get_ASM_clobbers(const ir_node *node);
/** Set list of clobbered register for ASM node (note: has to be a firm
* array) */
void set_ASM_clobbers(ir_node *node, ident **clobbers);
/*
*
......
......@@ -310,21 +310,21 @@ typedef void (*copy_attr_func)(ir_graph *irg, const ir_node *old_node, ir_node *
* The get_type operation.
* Return the type of the node self.
*/
typedef ir_type *(*get_type_func)(ir_node *self);
typedef ir_type *(*get_type_func)(const ir_node *self);
/**
* The get_type_attr operation. Used to traverse all types that can be
* accessed from an ir_graph.
* Return the type attribute of the node self.
*/
typedef ir_type *(*get_type_attr_func)(ir_node *self);
typedef ir_type *(*get_type_attr_func)(const ir_node *self);
/**
* The get_entity_attr operation. Used to traverse all entities that can be
* accessed from an ir_graph.
* Return the entity attribute of the node self.
*/
typedef ir_entity *(*get_entity_attr_func)(ir_node *self);
typedef ir_entity *(*get_entity_attr_func)(const ir_node *self);
/**
* The verify_node operation.
......
......@@ -230,7 +230,7 @@ static ir_node *new_bd_Const_type(dbg_info *db, tarval *con, ir_type *tp)
ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, get_irg_start_block(irg), op_Const, get_tarval_mode(con), 0, NULL);
res->attr.con.tv = con;
res->attr.con.tarval = con;
set_Const_type(res, tp); /* Call method because of complex assertion. */
res = optimize_node (res);
assert(get_Const_type(res) == tp);
......@@ -343,21 +343,23 @@ static ir_node *new_bd_EndExcept(dbg_info *db, ir_node *block)
static ir_node *new_bd_ASM(dbg_info *db, ir_node *block, int arity,
ir_node *in[], ir_asm_constraint *inputs, int n_outs,
ir_asm_constraint *outputs, int n_clobber,
ident *clobber[], ident *asm_text)
ident *clobber[], ident *text)
{
ir_node *res;
ir_graph *irg = current_ir_graph;
res = new_ir_node(db, irg, block, op_ASM, mode_T, arity, in);
res->attr.assem.pin_state = op_pin_state_pinned;
res->attr.assem.inputs = NEW_ARR_D(ir_asm_constraint, irg->obst, arity);
res->attr.assem.outputs = NEW_ARR_D(ir_asm_constraint, irg->obst, n_outs);
res->attr.assem.clobber = NEW_ARR_D(ident *, irg->obst, n_clobber);
res->attr.assem.asm_text = asm_text;
res->attr.assem.input_constraints
= NEW_ARR_D(ir_asm_constraint, irg->obst, arity);
res->attr.assem.output_constraints
= NEW_ARR_D(ir_asm_constraint, irg->obst, n_outs);
res->attr.assem.clobbers = NEW_ARR_D(ident *, irg->obst, n_clobber);
res->attr.assem.text = text;
memcpy(res->attr.assem.inputs, inputs, sizeof(inputs[0]) * arity);
memcpy(res->attr.assem.outputs, outputs, sizeof(outputs[0]) * n_outs);
memcpy(res->attr.assem.clobber, clobber, sizeof(clobber[0]) * n_clobber);
memcpy(res->attr.assem.input_constraints, inputs, sizeof(inputs[0]) * arity);
memcpy(res->attr.assem.output_constraints, outputs, sizeof(outputs[0]) * n_outs);
memcpy(res->attr.assem.clobbers, clobber, sizeof(clobber[0]) * n_clobber);
res = optimize_node(res);
IRN_VRFY_IRG(res, irg);
......@@ -552,13 +554,13 @@ ir_node *new_rd_EndExcept(dbg_info *db, ir_graph *irg, ir_node *block)
ir_node *new_rd_ASM(dbg_info *db, ir_node *block,
int arity, ir_node *in[], ir_asm_constraint *inputs,
int n_outs, ir_asm_constraint *outputs,
int n_clobber, ident *clobber[], ident *asm_text)
int n_clobber, ident *clobber[], ident *text)
{
ir_node *res;
ir_graph *rem = current_ir_graph;
current_ir_graph = get_Block_irg(block);
res = new_bd_ASM(db, block, arity, in, inputs, n_outs, outputs, n_clobber, clobber, asm_text);
res = new_bd_ASM(db, block, arity, in, inputs, n_outs, outputs, n_clobber, clobber, text);
current_ir_graph = rem;
return res;
......@@ -625,9 +627,9 @@ ir_node *new_r_NoMem(ir_graph *irg)
ir_node *new_r_ASM(ir_node *block,
int arity, ir_node *in[], ir_asm_constraint *inputs,
int n_outs, ir_asm_constraint *outputs,
int n_clobber, ident *clobber[], ident *asm_text)
int n_clobber, ident *clobber[], ident *text)
{
return new_rd_ASM(NULL, block, arity, in, inputs, n_outs, outputs, n_clobber, clobber, asm_text);
return new_rd_ASM(NULL, block, arity, in, inputs, n_outs, outputs, n_clobber, clobber, text);
}
/** ********************/
......@@ -1261,9 +1263,9 @@ ir_node *new_d_EndExcept(dbg_info *db)
ir_node *new_d_ASM(dbg_info *db, int arity, ir_node *in[], ir_asm_constraint *inputs,
int n_outs, ir_asm_constraint *outputs, int n_clobber,
ident *clobber[], ident *asm_text)
ident *clobber[], ident *text)
{
return new_bd_ASM(db, current_ir_graph->current_block, arity, in, inputs, n_outs, outputs, n_clobber, clobber, asm_text);
return new_bd_ASM(db, current_ir_graph->current_block, arity, in, inputs, n_outs, outputs, n_clobber, clobber, text);
} /* new_d_ASM */
/* ********************************************************************* */
......@@ -1541,9 +1543,9 @@ ir_node *new_NoMem(void)
}
ir_node *new_ASM(int arity, ir_node *in[], ir_asm_constraint *inputs,
int n_outs, ir_asm_constraint *outputs,
int n_clobber, ident *clobber[], ident *asm_text)
int n_clobber, ident *clobber[], ident *text)
{
return new_d_ASM(NULL, arity, in, inputs, n_outs, outputs, n_clobber, clobber, asm_text);
return new_d_ASM(NULL, arity, in, inputs, n_outs, outputs, n_clobber, clobber, text);
}
/* create a new anchor node */
......
......@@ -88,6 +88,8 @@ static int dump_backedge_information_flag = 1;
static int dump_const_local = 1;
/** An option to dump the node index number. */
static int dump_node_idx_labels = 0;
/** An option to dump the node number */
static int dump_node_nr = 0;
/** An option to dump all graph anchors */
static int dump_anchors = 0;
/** An option to dump the macro block edges. */
......@@ -1243,11 +1245,12 @@ int dump_node_label(FILE *F, ir_node *n)
fprintf(F, " ");
bad |= dump_node_typeinfo(F, n);
bad |= dump_node_nodeattr(F, n);
if (dump_node_idx_labels) {
fprintf(F, "%ld:%u", get_irn_node_nr(n), get_irn_idx(n));
} else {
if (dump_node_nr) {
fprintf(F, "%ld", get_irn_node_nr(n));
}
if (dump_node_idx_labels) {
fprintf(F, ":%u", get_irn_idx(n));
}
return bad;
}
......
This diff is collapsed.
......@@ -555,7 +555,7 @@ static inline ir_graph *_get_Block_irg(const ir_node *block)
static inline tarval *_get_Const_tarval(const ir_node *node) {
assert(_get_irn_op(node) == op_Const);
return node->attr.con.tv;
return node->attr.con.tarval;
}
static inline int _is_Const_null(const ir_node *node) {
......
......@@ -121,9 +121,9 @@ static void ASM_copy_attr(ir_graph *irg, const ir_node *old_node,
ir_node *new_node)
{
default_copy_attr(irg, old_node, new_node);
new_node->attr.assem.inputs = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.inputs);
new_node->attr.assem.outputs = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.outputs);
new_node->attr.assem.clobber = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.clobber);
new_node->attr.assem.input_constraints = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.input_constraints);
new_node->attr.assem.output_constraints = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.output_constraints);
new_node->attr.assem.clobbers = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.clobbers);
}
/**
......
......@@ -6966,7 +6966,7 @@ static unsigned hash_Const(const ir_node *node)
unsigned h;
/* special value for const, as they only differ in their tarval. */
h = HASH_PTR(node->attr.con.tv);
h = HASH_PTR(node->attr.con.tarval);
return h;
} /* hash_Const */
......
......@@ -170,8 +170,8 @@ typedef struct {
/** Const attributes. */
typedef struct {
tarval *tv; /**< the target value */
ir_type *tp; /**< the source type, for analyses. default: type_unknown. */
tarval *tarval; /**< the target value */
ir_type *tp; /**< the source type, for analyses. default: type_unknown. */
} const_attr;
/** SymConst attributes. */
......@@ -305,11 +305,11 @@ typedef struct {
/** Inline Assembler support attribute. */
typedef struct {
/* BEWARE: pin state MUST be the first attribute */
op_pin_state pin_state; /**< the pin state for operations that might generate a exception */
ident *asm_text; /**< The inline assembler text. */
ir_asm_constraint *inputs; /**< Input constraints. */
ir_asm_constraint *outputs; /**< Output constraints. */
ident **clobber; /**< List of clobbered registers. */
op_pin_state pin_state; /**< the pin state for operations that might generate a exception */
ident *text; /**< The inline assembler text. */
ir_asm_constraint *input_constraints; /**< Input constraints. */
ir_asm_constraint *output_constraints; /**< Output constraints. */
ident **clobbers; /**< List of clobbered registers. */
} asm_attr;
/** Some IR-nodes just have one attribute, these are stored here,
......
......@@ -727,6 +727,8 @@ static int verify_node_Proj_Proj(ir_node *pred, ir_node *p)
(proj >= 0 && mode_is_datab(mode)),
"wrong Proj from Proj from Call", 0);
mt = get_Call_type(pred);
ASSERT_AND_RET(mt == get_unknown_type() || is_Method_type(mt),
"wrong call type on call", 0);
ASSERT_AND_RET(
(proj < get_method_n_ress(mt)),
"More Projs for results than results in type.", 0);
......
......@@ -134,12 +134,10 @@ def format_opindex(node):
return "-1"
def filter_isnot(list, flag):
result = []
for node in list:
if hasattr(node, flag):
continue
result.append(node)
return result
return filter(lambda x: not hasattr(x, flag), list)
def filter_hasnot(list, flag):
return filter(lambda x: flag not in x, list)
def format_arguments(string, voidwhenempty = False):
args = re.split('\s*\n\s*', string)
......@@ -170,6 +168,7 @@ env.filters['flags'] = format_flags
env.filters['attr_size'] = format_attr_size
env.filters['opindex'] = format_opindex
env.filters['isnot'] = filter_isnot
env.filters['hasnot'] = filter_hasnot
env.filters['arguments'] = format_arguments
env.filters['parameters'] = format_parameters
......@@ -370,13 +369,13 @@ ir_node *new_{{node.constrname}}(
irnode_h_template = env.from_string('''
/* Warning: automatically generated code */
{% for node in nodes|isnot('custom_is') %}
{%- for node in nodes|isnot('custom_is') %}
static inline int _is_{{node.name}}(const ir_node *node)
{
assert(node != NULL);
return _get_irn_op(node) == op_{{node.name}};
}
{% endfor %}
{%- endfor -%}
{% for node in nodes %}
#define is_{{node.name}}(node) _is_{{node.name}}(node)
......@@ -392,6 +391,38 @@ int (is_{{node.name}})(const ir_node *node)
return _is_{{node.name}}(node);
}
{% endfor %}
{%- for node in nodes %}
{%- for attr in node.attrs|hasnot("noprop") %}
{{attr.type}} (get_{{node.name}}_{{attr.name}})(const ir_node *node)
{
assert(is_{{node.name}}(node));
return node->attr.{{node.attrs_name}}.{{attr.name}};
}
void (set_{{node.name}}_{{attr.name}})(ir_node *node, {{attr.type}} {{attr.name}})
{
assert(is_{{node.name}}(node));
node->attr.{{node.attrs_name}}.{{attr.name}} = {{attr.name}};
}
{% endfor -%}
{% endfor -%}
{%- for node in nodes %}
{%- for in in node.ins %}
ir_node *(get_{{node.name}}_{{in}})(const ir_node *node)
{
assert(is_{{node.name}}(node));
return get_irn_n(node, {{node.ins.index(in)}});
}
void (set_{{node.name}}_{{in}})(ir_node *node, ir_node *{{in}})
{
assert(is_{{node.name}}(node));
set_irn_n(node, {{node.ins.index(in)}}, {{in}});
}
{% endfor %}
{% endfor %}
''')
irop_template = env.from_string('''
......
......@@ -61,9 +61,10 @@ class ASM(Op):
mode = "mode_T"
arity = "variable"
flags = [ "keep", "uses_memory" ]
attr_struct = "asm_attr"
pinned = "memory"
pinned_init = "op_pin_state_pinned"
attr_struct = "asm_attr"
attrs_name = "assem"
attrs = [
dict(
name = "input_constraints",
......@@ -72,6 +73,7 @@ class ASM(Op):
dict(
name = "n_output_constraints",
type = "int",
noprop = True,
),
dict(
name = "output_constraints",
......@@ -80,6 +82,7 @@ class ASM(Op):
dict(
name = "n_clobbers",
type = "int",
noprop = True,
),
dict(
name = "clobbers",
......@@ -175,6 +178,7 @@ class Bound(Op):
pinned = "exception"
pinned_init = "op_pin_state_pinned"
attr_struct = "bound_attr"
attrs_name = "bound"
d_post = '''
firm_alloc_frag_arr(res, op_Bound, &res->attr.bound.exc.frag_arr);
'''
......@@ -298,6 +302,7 @@ class Confirm(Op):
),
]
attr_struct = "confirm_attr"
attrs_name = "confirm"
class Const(Op):
mode = ""
......@@ -327,6 +332,7 @@ class Conv(Unop):
)
]
attr_struct = "conv_attr"
attrs_name = "conv"
class CopyB(Op):
ins = [ "mem", "dst", "src" ]
......@@ -339,6 +345,7 @@ class CopyB(Op):
)
]
attr_struct = "copyb_attr"
attrs_name = "copyb"
pinned = "memory"
pinned_init = "op_pin_state_pinned"
d_post = '''
......@@ -435,6 +442,7 @@ class Filter(Op):
]
pinned = "yes"
attr_struct = "filter_attr"
attrs_name = "filter"
java_noconstr = True
class Free(Op):
......@@ -587,7 +595,8 @@ class Proj(Op):
dict(
type = "long",
name = "proj",
initname = ""
initname = "",
noprop = False,
)
]
attr_struct = "long"
......@@ -685,7 +694,8 @@ class SymConst(Op):
attrs = [
dict(
type = "ir_entity*",
name = "entity"
name = "entity",
noprop = True
)
]
attr_struct = "symconst_attr"
......
Markdown is supported
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