X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_calls.h;h=f9b448db5c727ebf1a59e02b7a7536359b9a1270;hb=f12db36c55a280d6610da2c5e561a2f20400a174;hp=f298241a517372c993c6b15bce1503d32e20ab86;hpb=eb08138c6b80c169945568e4414f491a9bc20388;p=libfirm diff --git a/ir/lower/lower_calls.h b/ir/lower/lower_calls.h index f298241a5..f9b448db5 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. * @@ -17,72 +17,27 @@ * PURPOSE. */ -/* - * Project: libFIRM - * File name: ir/lower/lower_calls.h - * Purpose: lowering of Calls with compound parameters - * Author: Michael Beck - * Created: - * CVS-ID: $Id$ - * Copyright: (c) 1998-2005 Universität Karlsruhe - */ - /** - * @file lower_calls.h - * - * Lowering of Calls with compound return types. - * - * @author Michael Beck + * @file + * @brief Lowering of calls with compound arguments + * @author Michael Beck + * @version $Id$ */ -#ifndef _LOWER_CALLS_H_ -#define _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 themselfes) */ +} compound_call_lowering_flags; +ENUM_BITSET(compound_call_lowering_flags) /** * Lower calls with compound parameter and return types. @@ -142,16 +97,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 /* _LOWER_CALLS_H_ */ +#endif