X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbenode_t.h;h=ada6d18420ee2e090d6cae0828eeabe07e955361;hb=89dc24503c04139bb05504059b291d6d89f99661;hp=a8b5a73ff41300ea9727a544d3471f0994cba4cc;hpb=3a0e181dc47df5df9cd7b63a7a8b8b6f1c56bacf;p=libfirm diff --git a/ir/be/benode_t.h b/ir/be/benode_t.h index a8b5a73ff..ada6d1842 100644 --- a/ir/be/benode_t.h +++ b/ir/be/benode_t.h @@ -1,5 +1,5 @@ /* - * 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. * @@ -56,6 +56,7 @@ extern ir_op *op_be_SubSP; 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, @@ -74,6 +75,7 @@ typedef enum { beo_RegParams, beo_FrameAddr, beo_Barrier, + beo_Unwind, beo_Last } be_opcode_t; @@ -285,6 +287,10 @@ ir_type *be_Call_get_type(ir_node *call); /** Sets the call type. */ void be_Call_set_type(ir_node *call, ir_type *call_tp); +void be_Call_set_pop(ir_node *call, unsigned pop); + +unsigned be_Call_get_pop(const ir_node *call); + /** * Position numbers for the be_Call inputs. */ @@ -300,7 +306,8 @@ enum { */ typedef enum { pn_be_Call_M_regular = pn_Call_M_regular, /**< The memory result of a be_Call. */ - pn_be_Call_first_res = pn_Call_max /**< The first result proj number of a be_Call. */ + pn_be_Call_sp = pn_Call_max, + pn_be_Call_first_res /**< The first result proj number of a be_Call. */ } pn_be_Call; /** @@ -331,16 +338,26 @@ enum { /** * 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 * @param n number of inputs + * @param pop pop number of bytes on return * @param in input array */ -ir_node *be_new_Return(dbg_info *dbg, ir_graph *irg, ir_node *bl, int n_res, int n, ir_node *in[]); +ir_node *be_new_Return(dbg_info *dbg, ir_graph *irg, ir_node *bl, int n_res, unsigned pop, int n, ir_node *in[]); /** Returns the number of real returns values */ -int be_Return_get_n_rets(ir_node *ret); +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 */ int be_Return_append_node(ir_node *ret, ir_node *node); @@ -371,7 +388,7 @@ ir_node *be_RegParams_append_out_reg(ir_node *regparams, * @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. @@ -393,6 +410,28 @@ ir_node *be_new_CopyKeep_single(const arch_register_class_t *cls, ir_graph *irg, 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. @@ -415,11 +454,13 @@ int be_is_SubSP(const ir_node *irn); 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);