/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
extern ir_op *op_be_RegParams;
extern ir_op *op_be_FrameAddr;
extern ir_op *op_be_Barrier;
+extern ir_op *op_be_Unwind;
typedef enum {
beo_NoBeOp = -1,
beo_RegParams,
beo_FrameAddr,
beo_Barrier,
+ beo_Unwind,
beo_Last
} be_opcode_t;
/**
* Construct a new be_Return.
+ *
+ * @param dbg debug info
* @param irg the graph where the new node will be placed
* @param bl the block where the new node will be placed
* @param n_res number of "real" results
/** Returns the number of real returns values */
int be_Return_get_n_rets(const ir_node *ret);
+/**
+ * Return the number of bytes that should be popped from stack when executing the Return.
+ *
+ * @param ret the be_Return node
+ */
unsigned be_Return_get_pop(const ir_node *ret);
/** appends a node to the return node, returns the position of the node */
* @param spill_ctx The context in which the spill is introduced (This is mostly == irn up to the case of Phis).
* @return The new spill node.
*/
-ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn);
+ir_node *be_spill(const arch_env_t *arch_env, ir_node *block, ir_node *irn);
/**
* Make a reload and insert it into the schedule.
ir_node *be_get_CopyKeep_op(const ir_node *cpy);
void be_set_CopyKeep_op(ir_node *cpy, ir_node *op);
+/**
+ * Position numbers for the be_Unwind inputs.
+ */
+enum {
+ be_pos_Unwind_mem = 0, /**< memory input of a be_Unwind node */
+ be_pos_Unwind_sp = 1, /**< stack pointer input of a be_Unwind node */
+};
+
+/**
+ * Construct a new be_Unwind.
+ *
+ * @param dbg debug info
+ * @param irg the graph where the new node will be placed
+ * @param bl the block where the new node will be placed
+ * @param mem the memory input
+ * @param sp the stack pointer input
+ */
+ir_node *be_new_Unwind(dbg_info *dbg, ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *sp);
+
+ir_node *be_get_Unwind_mem(const ir_node *irn);
+ir_node *be_get_Unwind_sp(const ir_node *irn);
+
/**
* Get the backend opcode of a backend node.
* @param irn The node.
int be_is_RegParams(const ir_node *irn);
int be_is_FrameAddr(const ir_node *irn);
int be_is_Barrier(const ir_node *irn);
+int be_is_Unwind(const ir_node *irn);
/**
+ * Returns the frame entity of a be node.
* Try to avoid this function and better call arch_get_frame_entity!
*
- * Returns the frame entity used by the be node
+ * @return the frame entity used by the be node
*/
ir_entity *be_get_frame_entity(const ir_node *irn);