792ed8cd09b6db45ead87da3fb7c5fa314733da3
[libfirm] / ir / be / beabi.h
1
2 /**
3  * Backend ABI implementation.
4  */
5
6 #ifndef _BEABI_H
7 #define _BEABI_H
8
9 #include "firm_types.h"
10
11 #include "be.h"
12 #include "bearch.h"
13 #include "beabi_t.h"
14
15 typedef struct {
16         unsigned left_to_right         :1;  /**< Arguments are from left to right. */
17         unsigned store_args_sequential :1;  /**< Use sequential stores for arguments. */
18         unsigned try_omit_fp           :1;  /**< Try to omit the frame pointer. */
19         unsigned fp_free               :1;  /**< The function can use any register as frame pointer. */
20         unsigned call_has_imm          :1;  /**< A call can take the callee's address as an immediate. */
21 } be_abi_call_flags_bits_t;
22
23 typedef union {
24         be_abi_call_flags_bits_t bits;
25         unsigned val;
26 } be_abi_call_flags_t;
27
28 void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, ir_type *add_frame);
29 void be_abi_call_param_stack(be_abi_call_t *call, int pos);
30 void be_abi_call_param_reg(be_abi_call_t *call, int pos, const arch_register_t *reg);
31 void be_abi_call_res_reg(be_abi_call_t *call, int pos, const arch_register_t *reg);
32
33 be_abi_irg_t *be_abi_introduce(be_irg_t *bi);
34 void be_abi_fix_stack_bias(be_abi_irg_t *env);
35 void be_abi_fix_stack_nodes(be_abi_irg_t *env);
36 void be_abi_free(be_abi_irg_t *abi);
37
38 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg);
39
40 #endif