f298241a517372c993c6b15bce1503d32e20ab86
[libfirm] / ir / lower / lower_calls.h
1 /*
2  * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /*
21  * Project:     libFIRM
22  * File name:   ir/lower/lower_calls.h
23  * Purpose:     lowering of Calls with compound parameters
24  * Author:      Michael Beck
25  * Created:
26  * CVS-ID:      $Id$
27  * Copyright:   (c) 1998-2005 Universität Karlsruhe
28  */
29
30 /**
31  * @file lower_calls.h
32  *
33  * Lowering of Calls with compound return types.
34  *
35  * @author Michael Beck
36  */
37 #ifndef _LOWER_CALLS_H_
38 #define _LOWER_CALLS_H_
39
40 /**
41  * A type telling where to add hidden parameters.
42  */
43 typedef enum add_hidden_params {
44   ADD_HIDDEN_ALWAYS_IN_FRONT = 0,   /**< always add hidden parameters in front (default). */
45   ADD_HIDDEN_ALWAYS_LAST     = 1,   /**< always add hidden parameters last, did not work for variadic functions. */
46   ADD_HIDDEN_SMART           = 2    /**< add hidden parameters last for non-variadic and first for variadic functions. */
47 } add_hidden;
48
49 /**
50  * Additional flags for the lowering.
51  */
52 enum lowering_flags {
53   LF_NONE              = 0, /**< no additional flags */
54   LF_COMPOUND_PARAM    = 1, /**< lower calls with compound parameters */
55   LF_COMPOUND_RETURN   = 2, /**< lower calls with compound returns */
56   LF_RETURN_HIDDEN     = 4, /**< return the hidden address instead of void */
57   LF_SMALL_CMP_IN_REGS = 8  /**< return small compound values in registers */
58 };
59
60 /** Maximum number of registers that can be used to return compound values. */
61 #define MAX_REGISTER_RET_VAL 2
62
63 /**
64  * A struct containing all control parameters for
65  * lower_compound_ret_calls().
66  */
67 typedef struct {
68   int        def_ptr_alignment;   /**< Default alignment for data pointer. */
69   unsigned   flags;               /**< A bitmask of enum lowering_flags. */
70   add_hidden hidden_params;       /**< Where to add hidden parameters. */
71
72   /**
73    * A function returning a pointer type for a given type.
74    * If this pointer is NULL, a new pointer type is always created.
75    */
76   ir_type *(*find_pointer_type)(ir_type *e_type, ir_mode *mode, int alignment);
77
78   /**
79    * If the LF_SMALL_CMP_IN_REGS flag is set, this function will be called
80    * to decide, whether a compound value should be returned in registers.
81    * This function must return the number of used registers and fill in the modes
82    * of the registers to use. Up to MAX_REGISTER_RET_VAL registers can be used.
83    */
84   int (*ret_compound_in_regs)(ir_type *compound_tp, ir_mode **modes);
85 } lower_params_t;
86
87 /**
88  * Lower calls with compound parameter and return types.
89  * This function does the following transformations:
90  *
91  * If LF_COMPOUND_PARAM is set:
92  *
93  * - Copy compound parameters to a new location on the callers
94  *   stack and transmit the address of this new location
95  *
96  * If LF_COMPOUND_RETURN is set:
97  *
98  * - Adds a new (hidden) pointer parameter for
99  *   any return compound type. The return type is replaced by void
100  *   or if LOWERING_FLAGS_RETURN_HIDDEN is set by the address.
101  *
102  * - Use of the hidden parameters in the function code.
103  *
104  * - Change all calls to functions with compound return
105  *   by providing space for the hidden parameter on the callers
106  *   stack.
107  *
108  * - Replace a possible block copy after the function call.
109  *
110  * General:
111  *
112  * - Changes the types of methods and calls to the lowered ones
113  *
114  * - lower all method types of existing entities
115  *
116  * In pseudo-code, the following transformation is done:
117  *
118    @code
119    struct x ret = func(a, b);
120    @endcode
121  *
122  * is translated into
123    @code
124    struct x ret;
125    func(&ret, a, b);
126    @endcode
127  *
128  * If the function returns only one possible result, the copy-on-return
129  * optimization is done, ie.
130    @code
131    struct x func(a) {
132      struct x ret;
133      ret.a = a;
134      return ret;
135    }
136    @endcode
137  *
138  * is transformed into
139  *
140    @code
141    void func(struct x *ret, a) {
142      ret->a = a;
143    }
144    @endcode
145  *
146  * @param params  A structure containing the control parameter for this
147  *                transformation.
148  *
149  * During the transformation, pointer types must be created or reused.
150  * The caller can provide params->find_pointer_type for this task to
151  * reduce the number of created pointer types.
152  * If params->find_pointer_type is NULL, new pointer types
153  * are always created automatically.
154  */
155 void lower_calls_with_compounds(const lower_params_t *params);
156
157 #endif /* _LOWER_CALLS_H_ */