/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
/**
* @file
- * @brief Lowering of Calls with compound parameters and return types.
+ * @brief Lowering of calls with compound arguments
* @author Michael Beck
* @version $Id$
*/
-#ifndef FIRM_LOWER_LOWER_CALLS_H
-#define FIRM_LOWER_LOWER_CALLS_H
+#ifndef FIRM_LOWER_CALLS_H
+#define FIRM_LOWER_CALLS_H
-/**
- * A type telling where to add hidden parameters.
- */
-typedef enum add_hidden_params {
- ADD_HIDDEN_ALWAYS_IN_FRONT = 0, /**< always add hidden parameters in front (default). */
- ADD_HIDDEN_ALWAYS_LAST = 1, /**< always add hidden parameters last, did not work for variadic functions. */
- ADD_HIDDEN_SMART = 2 /**< add hidden parameters last for non-variadic and first for variadic functions. */
-} add_hidden;
+#include "firm_types.h"
/**
* Additional flags for the lowering.
*/
-enum lowering_flags {
- LF_NONE = 0, /**< no additional flags */
- LF_COMPOUND_PARAM = 1, /**< lower calls with compound parameters */
- LF_COMPOUND_RETURN = 2, /**< lower calls with compound returns */
- LF_RETURN_HIDDEN = 4, /**< return the hidden address instead of void */
- LF_SMALL_CMP_IN_REGS = 8 /**< return small compound values in registers */
-};
-
-/** Maximum number of registers that can be used to return compound values. */
-#define MAX_REGISTER_RET_VAL 2
-
-/**
- * A struct containing all control parameters for
- * lower_compound_ret_calls().
- */
-typedef struct {
- int def_ptr_alignment; /**< Default alignment for data pointer. */
- unsigned flags; /**< A bitmask of enum lowering_flags. */
- add_hidden hidden_params; /**< Where to add hidden parameters. */
-
- /**
- * A function returning a pointer type for a given type.
- * If this pointer is NULL, a new pointer type is always created.
- */
- ir_type *(*find_pointer_type)(ir_type *e_type, ir_mode *mode, int alignment);
-
- /**
- * If the LF_SMALL_CMP_IN_REGS flag is set, this function will be called
- * to decide, whether a compound value should be returned in registers.
- * This function must return the number of used registers and fill in the modes
- * of the registers to use. Up to MAX_REGISTER_RET_VAL registers can be used.
- */
- int (*ret_compound_in_regs)(ir_type *compound_tp, ir_mode **modes);
-} lower_params_t;
+typedef enum compound_call_lowering_flags {
+ LF_NONE = 0, /**< no additional flags */
+ LF_RETURN_HIDDEN = 1 << 0, /**< return the hidden address instead of void */
+} compound_call_lowering_flags;
+ENUM_BITSET(compound_call_lowering_flags)
/**
* Lower calls with compound parameter and return types.
ret->a = a;
}
@endcode
- *
- * @param params A structure containing the control parameter for this
- * transformation.
- *
- * During the transformation, pointer types must be created or reused.
- * The caller can provide params->find_pointer_type for this task to
- * reduce the number of created pointer types.
- * If params->find_pointer_type is NULL, new pointer types
- * are always created automatically.
*/
-void lower_calls_with_compounds(const lower_params_t *params);
+void lower_calls_with_compounds(compound_call_lowering_flags flags);
-#endif /* FIRM_LOWER_LOWER_CALLS_H */
+#endif