* File name: ir/ir/irvrfy.c
* Purpose: Check irnodes for correctness.
* Author: Christian Schaefer
- * Modified by: Goetz Lindenmaier. Till Riedel
+ * Modified by: Goetz Lindenmaier. Till Riedel. Michael Beck.
* Created:
* CVS-ID: $Id$
* Copyright: (c) 1998-2003 Universität Karlsruhe
/** if this flag is set, verify entity types in Load & Store nodes */
static int vrfy_entities = 0;
-/* @@@ replace use of array "in" by access functions. */
-ir_node **get_irn_in(ir_node *node);
-
node_verification_t opt_do_node_verification = NODE_VERIFICATION_ON;
const char *firm_vrfy_failure_msg;
ASSERT_AND_RET_DBG(
(
(proj >= 0 && mode == mode_X && get_irn_mode(get_Cond_selector(pred)) == mode_b) || /* compare */
- (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) /* switch */
+ (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) || /* switch */
+ is_Bad(get_Cond_selector(pred)) /* rare */
),
"wrong Proj from Cond", 0,
show_proj_failure(p);
);
if (proj == pn_Call_X_except)
ASSERT_AND_RET(
- get_irn_pinned(n) == op_pin_state_pinned,
- "Exception Proj from unpinned Call", 0);
+ get_irn_op(get_Call_mem(n)) != op_NoMem,
+ "Exception Proj from FunctionCall", 0);
else if (proj == pn_Call_M_regular || proj == pn_Call_M_except)
ASSERT_AND_RET(
- get_irn_pinned(n) == op_pin_state_pinned,
- "Memory Proj from unpinned Call", 0);
+ (get_irn_op(get_Call_mem(n)) != op_NoMem || 1),
+ "Memory Proj from FunctionCall", 0);
return 1;
}
return 1;
}
+/**
+ * verify an IJmp node
+ */
+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));
+
+ ASSERT_AND_RET(
+ /* IJmp: BB x ref --> X */
+ mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
+ );
+ return 1;
+}
+
/**
* verify a Break node
*/
--> M x datan+1 x ... x data n+m */
ASSERT_AND_RET( op1mode == mode_M && mode_is_reference(op2mode), "Call node", 0 ); /* operand M x ref */
+ /* NoMem nodes are only allowed as memory input if the Call is NOT pinned */
+ ASSERT_AND_RET(
+ (get_irn_op(get_Call_mem(n)) == op_NoMem) ||
+ (get_irn_op(get_Call_mem(n)) != op_NoMem && get_irn_pinned(n) == op_pin_state_pinned),
+ "Call node with wrong memory input", 0 );
+
mt = get_Call_type(n);
if(get_unknown_type() == mt) {
return 1;
CASE(Block);
CASE(Start);
CASE(Jmp);
+ CASE(IJmp);
CASE(Break);
CASE(Cond);
CASE(Return);