#include "irprintf.h"
#include "irouts.h"
#include "irflag_t.h"
+#include "irpass_t.h"
/** if this flag is set, verify entity types in Load & Store nodes */
static int vrfy_entities = 0;
const char *firm_vrfy_failure_msg;
/* enable verification of Load/Store entities */
-void vrfy_enable_entity_tests(int enable) {
+void vrfy_enable_entity_tests(int enable)
+{
vrfy_entities = enable;
}
/**
* little helper for NULL modes
*/
-static const char *get_mode_name_ex(ir_mode *mode) {
+static const char *get_mode_name_ex(ir_mode *mode)
+{
if (! mode)
return "<no mode>";
return get_mode_name(mode);
*
* @param node the node caused the failure
*/
-static void show_entity_failure(ir_node *node) {
+static void show_entity_failure(ir_node *node)
+{
ir_graph *irg = get_irn_irg(node);
if (last_irg_error == irg)
ir_type *ent_type = get_entity_owner(ent);
if (ent_type) {
- if (ent_type == get_glob_type())
- fprintf(stderr, "\nFIRM: irn_vrfy_irg() %s failed\n", get_entity_name(ent));
- else
- fprintf(stderr, "\nFIRM: irn_vrfy_irg() %s::%s failed\n", get_type_name(ent_type), get_entity_name(ent));
+ ir_fprintf(stderr, "\nFIRM: irn_vrfy_irg() %+F::%s failed\n",
+ ent_type, get_entity_name(ent));
} else {
fprintf(stderr, "\nFIRM: irn_vrfy_irg() <NULL>::%s failed\n", get_entity_name(ent));
}
/**
* Prints a failure for a Node
*/
-static void show_node_failure(ir_node *n) {
+static void show_node_failure(ir_node *n)
+{
show_entity_failure(n);
fprintf(stderr, " node %ld %s%s\n" ,
get_irn_node_nr(n),
/**
* Prints a failure message for a binop
*/
-static void show_binop_failure(ir_node *n, const char *text) {
+static void show_binop_failure(ir_node *n, const char *text)
+{
ir_node *left = get_binop_left(n);
ir_node *right = get_binop_right(n);
/**
* Prints a failure message for an unop
*/
-static void show_unop_failure(ir_node *n, const char *text) {
+static void show_unop_failure(ir_node *n, const char *text)
+{
ir_node *op = get_unop_op(n);
show_entity_failure(n);
/**
* Prints a failure message for an op with 3 operands
*/
-static void show_triop_failure(ir_node *n, const char *text) {
+static void show_triop_failure(ir_node *n, const char *text)
+{
ir_node *op0 = get_irn_n(n, 0);
ir_node *op1 = get_irn_n(n, 1);
ir_node *op2 = get_irn_n(n, 2);
/**
* Prints a failure message for a proj
*/
-static void show_proj_failure(ir_node *n) {
+static void show_proj_failure(ir_node *n)
+{
ir_node *op = get_Proj_pred(n);
int proj = get_Proj_proj(n);
/**
* Prints a failure message for a proj from Start
*/
-static void show_proj_mode_failure(ir_node *n, ir_type *ty) {
+static void show_proj_mode_failure(ir_node *n, ir_type *ty)
+{
long proj = get_Proj_proj(n);
ir_mode *m = get_type_mode(ty);
+ char type_name[256];
+ ir_print_type(type_name, sizeof(type_name), ty);
show_entity_failure(n);
fprintf(stderr, " Proj %ld mode %s proj %ld (type %s mode %s) failed\n" ,
get_irn_node_nr(n),
get_irn_modename(n),
proj,
- get_type_name(ty),
+ type_name,
get_mode_name_ex(m));
}
/**
* Prints a failure message for a proj
*/
-static void show_proj_failure_ent(ir_node *n, ir_entity *ent) {
+static void show_proj_failure_ent(ir_node *n, ir_entity *ent)
+{
ir_node *op = get_Proj_pred(n);
int proj = get_Proj_proj(n);
ir_mode *m = get_type_mode(get_entity_type(ent));
+ char type_name[256];
+ ir_print_type(type_name, sizeof(type_name), get_entity_type(ent));
show_entity_failure(n);
fprintf(stderr, " node %ld %s%s %d(%s%s) entity %s(type %s mode %s)failed\n" ,
get_irn_node_nr(n),
get_irn_opname(n), get_irn_modename(n), proj,
get_irn_opname(op), get_irn_modename(op),
- get_entity_name(ent), get_type_name(get_entity_type(ent)),
+ get_entity_name(ent), type_name,
get_mode_name_ex(m));
}
/**
* Show a node and a graph
*/
-static void show_node_on_graph(ir_graph *irg, ir_node *n) {
+static void show_node_on_graph(ir_graph *irg, ir_node *n)
+{
ir_fprintf(stderr, "\nFIRM: irn_vrfy_irg() of %+F, node %+F\n", irg, n);
}
/**
* Show call parameters
*/
-static void show_call_param(ir_node *n, ir_type *mt) {
+static void show_call_param(ir_node *n, ir_type *mt)
+{
int i;
+ char type_name[256];
+ ir_print_type(type_name, sizeof(type_name), mt);
show_entity_failure(n);
- fprintf(stderr, " Call type-check failed: %s(", get_type_name(mt));
+ fprintf(stderr, " Call type-check failed: %s(", type_name);
for (i = 0; i < get_method_n_params(mt); ++i) {
fprintf(stderr, "%s ", get_mode_name_ex(get_type_mode(get_method_param_type(mt, i))));
}
/**
* Show return modes
*/
-static void show_return_modes(ir_graph *irg, ir_node *n, ir_type *mt, int i) {
+static void show_return_modes(ir_graph *irg, ir_node *n, ir_type *mt, int i)
+{
ir_entity *ent = get_irg_entity(irg);
show_entity_failure(n);
/**
* Show return number of results
*/
-static void show_return_nres(ir_graph *irg, ir_node *n, ir_type *mt) {
+static void show_return_nres(ir_graph *irg, ir_node *n, ir_type *mt)
+{
ir_entity *ent = get_irg_entity(irg);
show_entity_failure(n);
/**
* Show Phi input
*/
-static void show_phi_failure(ir_node *phi, ir_node *pred, int pos) {
+static void show_phi_failure(ir_node *phi, ir_node *pred, int pos)
+{
(void) pos;
show_entity_failure(phi);
fprintf(stderr, " Phi node %ld has mode %s different from predeccessor node %ld mode %s\n",
/**
* Show Phi inputs
*/
-static void show_phi_inputs(ir_node *phi, ir_node *block) {
+static void show_phi_inputs(ir_node *phi, ir_node *block)
+{
show_entity_failure(phi);
fprintf(stderr, " Phi node %ld has %d inputs, its Block %ld has %d\n",
get_irn_node_nr(phi), get_irn_arity(phi),
*
* @param ptr the node representing the address
*/
-static ir_entity *get_ptr_entity(ir_node *ptr) {
+static ir_entity *get_ptr_entity(ir_node *ptr)
+{
if (is_Sel(ptr)) {
return get_Sel_entity(ptr);
} else if (is_SymConst_addr_ent(ptr)) {
/**
* verify a Proj(Start) node
*/
-static int verify_node_Proj_Start(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Start(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
(void) n;
ASSERT_AND_RET_DBG(
(
(proj == pn_Start_X_initial_exec && mode == mode_X) ||
- (proj == pn_Start_M && mode == mode_M) ||
- (proj == pn_Start_P_frame_base && mode_is_reference(mode)) ||
- (proj == pn_Start_P_tls && mode_is_reference(mode)) ||
- (proj == pn_Start_T_args && mode == mode_T) ||
- (proj == pn_Start_P_value_arg_base && mode_is_reference(mode)) ||
- (proj == pn_Start_P_value_arg_base && mode == mode_T) /* FIXME: only one of those */
+ (proj == pn_Start_M && mode == mode_M) ||
+ (proj == pn_Start_P_frame_base && mode_is_reference(mode)) ||
+ (proj == pn_Start_P_tls && mode_is_reference(mode)) ||
+ (proj == pn_Start_T_args && mode == mode_T)
),
"wrong Proj from Start", 0,
show_proj_failure(p);
/**
* verify a Proj(Cond) node
*/
-static int verify_node_Proj_Cond(ir_node *pred, ir_node *p) {
+static int verify_node_Proj_Cond(ir_node *pred, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(Raise) node
*/
-static int verify_node_Proj_Raise(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Raise(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
(void) n;
/**
* verify a Proj(InstOf) node
*/
-static int verify_node_Proj_InstOf(ir_node *n, ir_node *p) {
+static int verify_node_Proj_InstOf(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
(void) n;
ASSERT_AND_RET_DBG(
(
- (proj == pn_InstOf_M_regular && mode == mode_M) ||
+ (proj == pn_InstOf_M && mode == mode_M) ||
(proj == pn_InstOf_X_regular && mode == mode_X) ||
(proj == pn_InstOf_X_except && mode == mode_X) ||
- (proj == pn_InstOf_res && mode_is_reference(mode)) ||
- (proj == pn_InstOf_M_except && mode == mode_M)
+ (proj == pn_InstOf_res && mode_is_reference(mode))
),
"wrong Proj from InstOf", 0,
show_proj_failure(p);
/**
* verify a Proj(Call) node
*/
-static int verify_node_Proj_Call(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Call(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
ASSERT_AND_RET_DBG(
(
- (proj == pn_Call_M_regular && mode == mode_M) ||
+ (proj == pn_Call_M && mode == mode_M) ||
(proj == pn_Call_X_regular && mode == mode_X) ||
(proj == pn_Call_X_except && mode == mode_X) ||
(proj == pn_Call_T_result && mode == mode_T) ||
- (proj == pn_Call_M_except && mode == mode_M) ||
(proj == pn_Call_P_value_res_base && mode_is_reference(mode))
),
"wrong Proj from Call", 0,
ASSERT_AND_RET(
!is_NoMem(get_Call_mem(n)),
"Exception Proj from FunctionCall", 0);
- else if (proj == pn_Call_M_regular || proj == pn_Call_M_except)
- ASSERT_AND_RET(
- (!is_NoMem(get_Call_mem(n)) || 1),
- "Memory Proj from FunctionCall", 0);
return 1;
}
/**
* verify a Proj(Quot) node
*/
-static int verify_node_Proj_Quot(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Quot(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(DivMod) node
*/
-static int verify_node_Proj_DivMod(ir_node *n, ir_node *p) {
+static int verify_node_Proj_DivMod(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(Div) node
*/
-static int verify_node_Proj_Div(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Div(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(Mod) node
*/
-static int verify_node_Proj_Mod(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Mod(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(Cmp) node
*/
-static int verify_node_Proj_Cmp(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Cmp(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
(void) n;
/**
* verify a Proj(Load) node
*/
-static int verify_node_Proj_Load(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Load(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(Store) node
*/
-static int verify_node_Proj_Store(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Store(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj(Alloc) node
*/
-static int verify_node_Proj_Alloc(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Alloc(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
(void) n;
/**
* verify a Proj(Proj) node
*/
-static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
+static int verify_node_Proj_Proj(ir_node *pred, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
long nr = get_Proj_proj(pred);
show_proj_mode_failure(p, get_method_param_type(mt, proj));
);
}
- } else if (nr == pn_Start_P_value_arg_base) {
- ASSERT_AND_RET(
- (proj >= 0 && mode_is_reference(mode)),
- "wrong Proj from Proj from Start", 0
- );
- ASSERT_AND_RET(
- (proj < get_method_n_params(mt)),
- "More Projs for args than args in type", 0
- );
}
break;
(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);
/**
* verify a Proj(Tuple) node
*/
-static int verify_node_Proj_Tuple(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Tuple(ir_node *n, ir_node *p)
+{
(void) n;
(void) p;
/* We don't test */
/**
* verify a Proj(CallBegin) node
*/
-static int verify_node_Proj_CallBegin(ir_node *n, ir_node *p) {
+static int verify_node_Proj_CallBegin(ir_node *n, ir_node *p)
+{
(void) n;
(void) p;
return 1;
/**
* verify a Proj(EndReg) node
*/
-static int verify_node_Proj_EndReg(ir_node *n, ir_node *p) {
+static int verify_node_Proj_EndReg(ir_node *n, ir_node *p)
+{
(void) n;
(void) p;
#ifdef INTERPROCEDURAL_VIEW
/**
* verify a Proj(EndExcept) node
*/
-static int verify_node_Proj_EndExcept(ir_node *n, ir_node *p) {
+static int verify_node_Proj_EndExcept(ir_node *n, ir_node *p)
+{
(void) n;
(void) p;
#ifdef INTERPROCEDURAL_VIEW
/**
* verify a Proj(CopyB) node
*/
-static int verify_node_Proj_CopyB(ir_node *n, ir_node *p) {
+static int verify_node_Proj_CopyB(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
ASSERT_AND_RET_DBG(
(
- (proj == pn_CopyB_M_regular && mode == mode_M) ||
+ (proj == pn_CopyB_M && mode == mode_M) ||
(proj == pn_CopyB_X_regular && mode == mode_X) ||
- (proj == pn_CopyB_X_except && mode == mode_X) ||
- (proj == pn_CopyB_M_except && mode == mode_M)
+ (proj == pn_CopyB_X_except && mode == mode_X)
),
"wrong Proj from CopyB", 0,
show_proj_failure(p);
/**
* verify a Proj(Bound) node
*/
-static int verify_node_Proj_Bound(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Bound(ir_node *n, ir_node *p)
+{
ir_mode *mode = get_irn_mode(p);
long proj = get_Proj_proj(p);
/**
* verify a Proj node
*/
-static int
-verify_node_Proj(ir_node *p, ir_graph *irg) {
+static int verify_node_Proj(ir_node *p, ir_graph *irg)
+{
ir_node *pred;
ir_op *op;
- (void) irg;
pred = skip_Id(get_Proj_pred(p));
ASSERT_AND_RET(get_irn_mode(pred) == mode_T, "mode of a 'projed' node is not Tuple", 0);
+ ASSERT_AND_RET(get_irg_pinned(irg) == op_pin_state_floats || get_nodes_block(pred) == get_nodes_block(p), "Proj must be in same block as its predecessor", 0);
op = get_irn_op(pred);
/**
* verify a Block node
*/
-static int verify_node_Block(ir_node *n, ir_graph *irg) {
+static int verify_node_Block(ir_node *n, ir_graph *irg)
+{
int i;
ir_node *mb = get_Block_MacroBlock(n);
}
for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
- ir_node *pred = get_Block_cfgpred(n, i);
+ ir_node *pred = get_Block_cfgpred(n, i);
ASSERT_AND_RET(
is_Bad(pred) || (get_irn_mode(pred) == mode_X),
"Block node must have a mode_X predecessor", 0);
"End Block node", 0);
}
/* irg attr must == graph we are in. */
- if (! get_interprocedural_view()) {
- ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
- }
+ ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
return 1;
}
/**
* verify a Start node
*/
-static int verify_node_Start(ir_node *n, ir_graph *irg) {
+static int verify_node_Start(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
(void) irg;
/**
* verify a Jmp node
*/
-static int verify_node_Jmp(ir_node *n, ir_graph *irg) {
+static int verify_node_Jmp(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
(void) irg;
/**
* verify an IJmp node
*/
-static int verify_node_IJmp(ir_node *n, ir_graph *irg) {
+static int verify_node_IJmp(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_IJmp_target(n));
(void) irg;
/**
* verify a Break node
*/
-static int verify_node_Break(ir_node *n, ir_graph *irg) {
+static int verify_node_Break(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
(void) irg;
/**
* verify a Cond node
*/
-static int verify_node_Cond(ir_node *n, ir_graph *irg) {
+static int verify_node_Cond(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Cond_selector(n));
(void) irg;
/**
* verify a Return node
*/
-static int verify_node_Return(ir_node *n, ir_graph *irg) {
+static int verify_node_Return(ir_node *n, ir_graph *irg)
+{
int i;
ir_mode *mymode = get_irn_mode(n);
ir_mode *mem_mode = get_irn_mode(get_Return_mem(n));
/**
* verify a Raise node
*/
-static int verify_node_Raise(ir_node *n, ir_graph *irg) {
+static int verify_node_Raise(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Raise_mem(n));
ir_mode *op2mode = get_irn_mode(get_Raise_exo_ptr(n));
/**
* verify a Const node
*/
-static int verify_node_Const(ir_node *n, ir_graph *irg) {
+static int verify_node_Const(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
(void) irg;
/**
* verify a SymConst node
*/
-static int verify_node_SymConst(ir_node *n, ir_graph *irg) {
+static int verify_node_SymConst(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
(void) irg;
- if (get_SymConst_kind(n) == symconst_addr_ent) {
- ir_entity *ent = get_SymConst_entity(n);
- if (is_Method_type(get_entity_type(ent)) &&
- get_irn_irg(n) != get_const_code_irg()) {
-#if 1
- ASSERT_AND_RET((get_entity_peculiarity(ent) != peculiarity_description),
- "A constant must address an existing method.", 0);
-#endif
- }
- }
ASSERT_AND_RET(
/* SymConst: BB --> int*/
(mode_is_int(mymode) ||
/**
* verify a Sel node
*/
-static int verify_node_Sel(ir_node *n, ir_graph *irg) {
+static int verify_node_Sel(ir_node *n, ir_graph *irg)
+{
int i;
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Sel_mem(n));
/**
* verify an InstOf node
*/
-static int verify_node_InstOf(ir_node *n, ir_graph *irg) {
+static int verify_node_InstOf(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_InstOf_obj(n));
(void) irg;
/**
* Check if the pinned state is right.
*/
-static int verify_right_pinned(ir_node *n) {
+static int verify_right_pinned(ir_node *n)
+{
ir_node *mem;
if (get_irn_pinned(n) == op_pin_state_pinned)
/**
* verify a Call node
*/
-static int verify_node_Call(ir_node *n, ir_graph *irg) {
+static int verify_node_Call(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Call_mem(n));
ir_mode *op2mode = get_irn_mode(get_Call_ptr(n));
ASSERT_AND_RET(verify_right_pinned(n),"Call node with wrong memory input", 0 );
mt = get_Call_type(n);
- if(get_unknown_type() == mt) {
+ if (get_unknown_type() == mt) {
return 1;
}
get_Call_n_params(n) >= get_method_n_params(mt),
"Number of args for Call doesn't match number of args in variadic type.",
0,
- ir_fprintf(stderr, "Call %+F has %d params, method %s type %d\n",
- n, get_Call_n_params(n), get_type_name(mt), get_method_n_params(mt));
+ ir_fprintf(stderr, "Call %+F has %d params, type %d\n",
+ n, get_Call_n_params(n), get_method_n_params(mt));
);
} else {
ASSERT_AND_RET_DBG(
get_Call_n_params(n) == get_method_n_params(mt),
"Number of args for Call doesn't match number of args in non variadic type.",
0,
- ir_fprintf(stderr, "Call %+F has %d params, method %s type %d\n",
- n, get_Call_n_params(n), get_type_name(mt), get_method_n_params(mt));
+ ir_fprintf(stderr, "Call %+F has %d params, type %d\n",
+ n, get_Call_n_params(n), get_method_n_params(mt));
);
}
/**
* verify an Add node
*/
-static int verify_node_Add(ir_node *n, ir_graph *irg) {
+static int verify_node_Add(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Add_left(n));
ir_mode *op2mode = get_irn_mode(get_Add_right(n));
/**
* verify a Sub node
*/
-static int verify_node_Sub(ir_node *n, ir_graph *irg) {
+static int verify_node_Sub(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Sub_left(n));
ir_mode *op2mode = get_irn_mode(get_Sub_right(n));
/**
* verify a Minus node
*/
-static int verify_node_Minus(ir_node *n, ir_graph *irg) {
+static int verify_node_Minus(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Minus_op(n));
(void) irg;
/**
* verify a Mul node
*/
-static int verify_node_Mul(ir_node *n, ir_graph *irg) {
+static int verify_node_Mul(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Mul_left(n));
ir_mode *op2mode = get_irn_mode(get_Mul_right(n));
/**
* verify a Mulh node
*/
-static int verify_node_Mulh(ir_node *n, ir_graph *irg) {
+static int verify_node_Mulh(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Mulh_left(n));
ir_mode *op2mode = get_irn_mode(get_Mulh_right(n));
/**
* verify a Quot node
*/
-static int verify_node_Quot(ir_node *n, ir_graph *irg) {
+static int verify_node_Quot(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Quot_mem(n));
ir_mode *op2mode = get_irn_mode(get_Quot_left(n));
/**
* verify a DivMod node
*/
-static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
+static int verify_node_DivMod(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_DivMod_mem(n));
ir_mode *op2mode = get_irn_mode(get_DivMod_left(n));
/**
* verify a Div node
*/
-static int verify_node_Div(ir_node *n, ir_graph *irg) {
+static int verify_node_Div(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
ir_mode *op2mode = get_irn_mode(get_Div_left(n));
/**
* verify a Mod node
*/
-static int verify_node_Mod(ir_node *n, ir_graph *irg) {
+static int verify_node_Mod(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
/**
* verify an Abs node
*/
-static int verify_node_Abs(ir_node *n, ir_graph *irg) {
+static int verify_node_Abs(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Abs_op(n));
(void) irg;
/**
* verify a logical And, Or, Eor node
*/
-static int verify_node_Logic(ir_node *n, ir_graph *irg) {
+static int verify_node_Logic(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_binop_left(n));
ir_mode *op2mode = get_irn_mode(get_binop_right(n));
/**
* verify a Not node
*/
-static int verify_node_Not(ir_node *n, ir_graph *irg) {
+static int verify_node_Not(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Not_op(n));
(void) irg;
/**
* verify a Cmp node
*/
-static int verify_node_Cmp(ir_node *n, ir_graph *irg) {
+static int verify_node_Cmp(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Cmp_left(n));
ir_mode *op2mode = get_irn_mode(get_Cmp_right(n));
/**
* verify a Shift node
*/
-static int verify_node_Shift(ir_node *n, ir_graph *irg) {
+static int verify_node_Shift(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_binop_left(n));
ir_mode *op2mode = get_irn_mode(get_binop_right(n));
/**
* verify a Rotl node
*/
-static int verify_node_Rotl(ir_node *n, ir_graph *irg) {
+static int verify_node_Rotl(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Rotl_left(n));
ir_mode *op2mode = get_irn_mode(get_Rotl_right(n));
/**
* verify a Conv node
*/
-static int verify_node_Conv(ir_node *n, ir_graph *irg) {
+static int verify_node_Conv(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Conv_op(n));
(void) irg;
/**
* verify a Cast node
*/
-static int verify_node_Cast(ir_node *n, ir_graph *irg) {
+static int verify_node_Cast(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Cast_op(n));
(void) irg;
/**
* verify a Phi node
*/
-static int verify_node_Phi(ir_node *n, ir_graph *irg) {
+static int verify_node_Phi(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_node *block = get_nodes_block(n);
int i;
(void) irg;
+ /* a Phi node MUST have the same number of inputs as its block
+ * Exception is a phi with 0 inputs which is used when (re)constructing the
+ * SSA form */
if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building && get_irn_arity(n) > 0) {
- /* a Phi node MUST have the same number of inputs as its block */
ASSERT_AND_RET_DBG(
get_irn_arity(n) == get_irn_arity(block),
"wrong number of inputs in Phi node", 0,
/**
* verify a Filter node
*/
-static int verify_node_Filter(ir_node *n, ir_graph *irg) {
+static int verify_node_Filter(ir_node *n, ir_graph *irg)
+{
(void) n;
(void) irg;
#ifdef INTERPROCEDURAL_VIEW
/**
* verify a Load node
*/
-static int verify_node_Load(ir_node *n, ir_graph *irg) {
+static int verify_node_Load(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Load_mem(n));
ir_mode *op2mode = get_irn_mode(get_Load_ptr(n));
/**
* verify a Store node
*/
-static int verify_node_Store(ir_node *n, ir_graph *irg) {
+static int verify_node_Store(ir_node *n, ir_graph *irg)
+{
ir_entity *target;
ir_mode *mymode = get_irn_mode(n);
/**
* verify an Alloc node
*/
-static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
+static int verify_node_Alloc(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Alloc_mem(n));
- ir_mode *op2mode = get_irn_mode(get_Alloc_size(n));
+ ir_mode *op2mode = get_irn_mode(get_Alloc_count(n));
(void) irg;
ASSERT_AND_RET_DBG(
/**
* verify a Free node
*/
-static int verify_node_Free(ir_node *n, ir_graph *irg) {
+static int verify_node_Free(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
/**
* verify a Sync node
*/
-static int verify_node_Sync(ir_node *n, ir_graph *irg) {
+static int verify_node_Sync(ir_node *n, ir_graph *irg)
+{
int i;
ir_mode *mymode = get_irn_mode(n);
(void) irg;
/**
* verify a Confirm node
*/
-static int verify_node_Confirm(ir_node *n, ir_graph *irg) {
+static int verify_node_Confirm(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Confirm_value(n));
ir_mode *op2mode = get_irn_mode(get_Confirm_bound(n));
/**
* verify a Mux node
*/
-static int verify_node_Mux(ir_node *n, ir_graph *irg) {
+static int verify_node_Mux(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
/**
* verify a CopyB node
*/
-static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
+static int verify_node_CopyB(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_CopyB_mem(n));
ir_mode *op2mode = get_irn_mode(get_CopyB_dst(n));
/**
* verify a Bound node
*/
-static int verify_node_Bound(ir_node *n, ir_graph *irg) {
+static int verify_node_Bound(ir_node *n, ir_graph *irg)
+{
ir_mode *mymode = get_irn_mode(n);
ir_mode *op1mode = get_irn_mode(get_Bound_mem(n));
ir_mode *op2mode = get_irn_mode(get_Bound_index(n));
*
* @return non-zero on success, 0 on dominance error
*/
-static int check_dominance_for_node(ir_node *use) {
+static int check_dominance_for_node(ir_node *use)
+{
if (is_Block(use)) {
ir_node *mbh = get_Block_MacroBlock(use);
}
/* Tests the modes of n and its predecessors. */
-int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
+int irn_vrfy_irg(ir_node *n, ir_graph *irg)
+{
int i;
ir_op *op;
if (!get_node_verification_mode())
return 1;
- if (!get_interprocedural_view()) {
- /*
- * do NOT check placement in interprocedural view, as we don't always know
- * the "right" graph ...
- */
- ASSERT_AND_RET_DBG(
- node_is_in_irgs_storage(irg, n),
- "Node is not stored on proper IR graph!", 0,
- show_node_on_graph(irg, n);
- );
- assert(get_irn_irg(n) == irg);
- {
- unsigned idx = get_irn_idx(n);
- ir_node *node_from_map = get_idx_irn(irg, idx);
- ASSERT_AND_RET_DBG(node_from_map == n, "Node index and index map entry differ", 0, ir_printf("node %+F node in map %+F(%p)", n, node_from_map, node_from_map));
- }
+ /*
+ * do NOT check placement in interprocedural view, as we don't always
+ * know the "right" graph ...
+ */
+
+#ifndef NDEBUG
+ /* this is an expensive check for large graphs (it has a quadratic
+ * runtime but with a small constant); so do NOT run it in release mode
+ */
+ ASSERT_AND_RET_DBG(
+ node_is_in_irgs_storage(irg, n),
+ "Node is not stored on proper IR graph!", 0,
+ show_node_on_graph(irg, n);
+ );
+#endif
+ assert(get_irn_irg(n) == irg);
+ {
+ unsigned idx = get_irn_idx(n);
+ ir_node *node_from_map = get_idx_irn(irg, idx);
+ ASSERT_AND_RET_DBG(node_from_map == n, "Node index and index map entry differ", 0,
+ ir_printf("node %+F node in map %+F(%p)\n", n, node_from_map, node_from_map));
}
op = get_irn_op(n);
return 1;
}
-int irn_vrfy(ir_node *n) {
+int irn_vrfy(ir_node *n)
+{
#ifdef DEBUG_libfirm
return irn_vrfy_irg(n, current_ir_graph);
#else
/**
* Walker to check every node
*/
-static void vrfy_wrap(ir_node *node, void *env) {
+static void vrfy_wrap(ir_node *node, void *env)
+{
int *res = env;
- *res = irn_vrfy(node);
+ *res = irn_vrfy_irg(node, current_ir_graph);
}
/**
* Walker to check every node including SSA property.
* Only called if dominance info is available.
*/
-static void vrfy_wrap_ssa(ir_node *node, void *env) {
+static void vrfy_wrap_ssa(ir_node *node, void *env)
+{
int *res = env;
- *res = irn_vrfy(node);
+ *res = irn_vrfy_irg(node, current_ir_graph);
if (*res) {
*res = check_dominance_for_node(node);
}
* Graph must be in state "op_pin_state_pinned".
* If dominance info is available, check the SSA property.
*/
-int irg_verify(ir_graph *irg, unsigned flags) {
+int irg_verify(ir_graph *irg, unsigned flags)
+{
int res = 1;
#ifdef DEBUG_libfirm
ir_graph *rem;
NULL, &res
);
- current_ir_graph = rem;
-
if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
- ir_entity *ent = get_irg_entity(current_ir_graph);
+ ir_entity *ent = get_irg_entity(irg);
if (ent)
fprintf(stderr, "irg_verify: Verifying graph %s failed\n", get_entity_name(ent));
else
- fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)current_ir_graph);
+ fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)irg);
}
+
+ current_ir_graph = rem;
#else
(void)irg;
(void)flags;
return res;
}
-int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string) {
+struct pass_t {
+ ir_graph_pass_t pass;
+ unsigned flags;
+};
+
+/**
+ * Wrapper to irg_verify to be run as an ir_graph pass.
+ */
+static int irg_verify_wrapper(ir_graph *irg, void *context)
+{
+ struct pass_t *pass = context;
+ irg_verify(irg, pass->flags);
+ /* do NOT rerun the pass if verify is ok :-) */
+ return 0;
+}
+
+/* Creates an ir_graph pass for irg_verify(). */
+ir_graph_pass_t *irg_verify_pass(const char *name, unsigned flags)
+{
+ struct pass_t *pass = XMALLOCZ(struct pass_t);
+
+ def_graph_pass_constructor(
+ &pass->pass, name ? name : "irg_verify", irg_verify_wrapper);
+
+ /* neither dump for verify */
+ pass->pass.dump_irg = (DUMP_ON_IRG_FUNC)ir_prog_no_dump;
+ pass->pass.verify_irg = (RUN_ON_IRG_FUNC)ir_prog_no_verify;
+
+ pass->flags = flags;
+ return &pass->pass;
+}
+
+/* create a verify pass */
+int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string)
+{
int res;
firm_verification_t old = get_node_verification_mode();
/**
* Pre-Walker: check Bad predecessors of node.
*/
-static void check_bads(ir_node *node, void *env) {
+static void check_bads(ir_node *node, void *env)
+{
vrfy_bad_env_t *venv = env;
int i, arity = get_irn_arity(node);
/*
* verify occurrence of bad nodes
*/
-int irg_vrfy_bads(ir_graph *irg, int flags) {
+int irg_vrfy_bads(ir_graph *irg, int flags)
+{
vrfy_bad_env_t env;
env.flags = flags;
/*
* set the default verify operation
*/
-void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops) {
+void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops)
+{
#define CASE(a) \
case iro_##a: \
ops->verify_node = verify_node_##a; \