X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_calls.h;h=ba290bc2e7c00bfb8fdfef198e1e503c46d9ae51;hb=f8ead9acbe48af00885e64a6f2f895d1b6cae434;hp=809742641a6e4d2a63a5f4e50ae06675d831b96b;hpb=2eb47b449dbbf0a4b397a36ae8fa401d1cd99269;p=libfirm diff --git a/ir/lower/lower_calls.h b/ir/lower/lower_calls.h index 809742641..ba290bc2e 100644 --- a/ir/lower/lower_calls.h +++ b/ir/lower/lower_calls.h @@ -1,5 +1,5 @@ /* - * 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. * @@ -19,59 +19,24 @@ /** * @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 */ + LF_DONT_LOWER_ARGUMENTS = 1 << 1, /**< don't lower compound call arguments + (some backends can handle them themselves) */ +} compound_call_lowering_flags; +ENUM_BITSET(compound_call_lowering_flags) /** * Lower calls with compound parameter and return types. @@ -131,16 +96,7 @@ typedef struct { 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