Fixed some typos.
[libfirm] / ir / lower / lower_calls.h
1 /*
2  * Copyright (C) 1995-2011 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  * @file
22  * @brief   Lowering of calls with compound arguments
23  * @author  Michael Beck
24  * @version $Id$
25  */
26 #ifndef FIRM_LOWER_CALLS_H
27 #define FIRM_LOWER_CALLS_H
28
29 #include "firm_types.h"
30
31 /**
32  * Additional flags for the lowering.
33  */
34 typedef enum compound_call_lowering_flags {
35         LF_NONE                 = 0,      /**< no additional flags */
36         LF_RETURN_HIDDEN        = 1 << 0, /**< return the hidden address instead of void */
37         LF_DONT_LOWER_ARGUMENTS = 1 << 1, /**< don't lower compound call arguments
38                                                (some backends can handle them themselfes) */
39 } compound_call_lowering_flags;
40 ENUM_BITSET(compound_call_lowering_flags)
41
42 /**
43  * Lower calls with compound parameter and return types.
44  * This function does the following transformations:
45  *
46  * If LF_COMPOUND_PARAM is set:
47  *
48  * - Copy compound parameters to a new location on the callers
49  *   stack and transmit the address of this new location
50  *
51  * If LF_COMPOUND_RETURN is set:
52  *
53  * - Adds a new (hidden) pointer parameter for
54  *   any return compound type. The return type is replaced by void
55  *   or if LOWERING_FLAGS_RETURN_HIDDEN is set by the address.
56  *
57  * - Use of the hidden parameters in the function code.
58  *
59  * - Change all calls to functions with compound return
60  *   by providing space for the hidden parameter on the callers
61  *   stack.
62  *
63  * - Replace a possible block copy after the function call.
64  *
65  * General:
66  *
67  * - Changes the types of methods and calls to the lowered ones
68  *
69  * - lower all method types of existing entities
70  *
71  * In pseudo-code, the following transformation is done:
72  *
73    @code
74    struct x ret = func(a, b);
75    @endcode
76  *
77  * is translated into
78    @code
79    struct x ret;
80    func(&ret, a, b);
81    @endcode
82  *
83  * If the function returns only one possible result, the copy-on-return
84  * optimization is done, ie.
85    @code
86    struct x func(a) {
87      struct x ret;
88      ret.a = a;
89      return ret;
90    }
91    @endcode
92  *
93  * is transformed into
94  *
95    @code
96    void func(struct x *ret, a) {
97      ret->a = a;
98    }
99    @endcode
100  */
101 void lower_calls_with_compounds(compound_call_lowering_flags flags);
102
103 #endif