- BE_ABI_NONE = 0,
- BE_ABI_LEFT_TO_RIGHT = 1, /**< Arguments are from left to right. */
- BE_ABI_USE_PUSH = 2, /**< Use sequential stores for arguments. */
- BE_ABI_TRY_OMIT_FRAME_POINTER = 4, /**< Try to omit the frame pointer. */
- BE_ABI_FRAME_POINTER_DEDICATED = 8 /**< If the function wants a frame pointer,
- use the one of the architecture, else
- an arbitrary register is used. */
-} be_abi_call_flags_t;
-
-void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, unsigned arg_gap);
-void be_abi_call_param_stack(be_abi_call_t *call, int pos);
-void be_abi_call_param_reg(be_abi_call_t *call, int pos, const arch_register_t *reg);
-void be_abi_call_res_reg(be_abi_call_t *call, int pos, const arch_register_t *reg);
-
-be_abi_irg_t *be_abi_introduce(be_irg_t *bi);
-void be_abi_fix_stack_bias(be_abi_irg_t *env);
-void be_abi_fix_stack_nodes(be_abi_irg_t *env);
-void be_abi_free(be_abi_irg_t *abi);
+ ABI_CONTEXT_CALLEE = 1 << 0,
+ ABI_CONTEXT_CALLER = 1 << 1,
+ ABI_CONTEXT_BOTH = ABI_CONTEXT_CALLEE | ABI_CONTEXT_CALLER
+} be_abi_context_t;
+
+/**
+ * Record the that ABI transmits call argument pos on the stack. Modifies the abi object.
+ *
+ * @param call the abi call object
+ * @param pos the parameter position
+ * @param load_mode load the parameter with this mode (if the parameter mode is different from this mode a Conv is inserted)
+ * @param alignment stack alignment for the parameter on the current architecture
+ * @param space_before size of allocated additional space before the parameter
+ * @param space_after size of allocated additional space after the parameter
+ */
+void be_abi_call_param_stack(be_abi_call_t *call, int pos, ir_mode *load_mode,
+ unsigned alignment, unsigned space_before,
+ unsigned space_after, be_abi_context_t context);
+
+/**
+ * Record the that ABI transmits call argument pos in the given register.
+ *
+ * @param call the abi call object
+ * @param pos the parameter position
+ * @param reg the register used
+ */
+void be_abi_call_param_reg(be_abi_call_t *call, int pos,
+ const arch_register_t *reg,
+ be_abi_context_t context);
+
+/**
+ * Record the that ABI transmits return value pos in the given register.
+ *
+ * @param call the abi call object
+ * @param pos the return value position
+ * @param reg the register used
+ */
+void be_abi_call_res_reg(be_abi_call_t *call, int pos,
+ const arch_register_t *reg,
+ be_abi_context_t context);
+
+/**
+ * Get the flags of a ABI call object.
+ * Note that the flags must not be the same as set by be_abi_call_set_flags(). Analysis may have
+ * altered several flags, so getting them from the call object is always a good idea.
+ * @param call The call object.
+ * @return The flags.
+ */
+be_abi_call_flags_t be_abi_call_get_flags(const be_abi_call_t *call);
+
+/**
+ * Get the method type of an ABI call object.
+ * @param call The call object.
+ * @return The method type for that call object.
+ */
+ir_type *be_abi_call_get_method_type(const be_abi_call_t *call);
+
+void be_abi_introduce(ir_graph *irg);
+
+void be_abi_free(ir_graph *irg);