remove unused support for max_loop_depth
[libfirm] / ir / lower / lower_calls.h
index f804a91..ba290bc 100644 (file)
@@ -1,47 +1,57 @@
 /*
- * 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
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
- */
-
-/**
- * @file lower_calls.h
+ * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
  *
- * Lowering of Calls with compound return types.
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
  *
- * @author Michael Beck
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
  */
-#ifndef _LOWER_CALLS_H_
-#define _LOWER_CALLS_H_
 
 /**
- * A type telling where to add hidden parameters.
+ * @file
+ * @brief   Lowering of calls with compound arguments
+ * @author  Michael Beck
  */
-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;
+#ifndef FIRM_LOWER_CALLS_H
+#define FIRM_LOWER_CALLS_H
 
-typedef struct {
-  int        def_ptr_alignment;   /**< default alignment for data pointer */
-  add_hidden hidden_params;       /**< where to add hidden params. */
+#include "firm_types.h"
 
-  /** a function returning a pointer type for a given type */
-  ir_type *(*find_pointer_type)(ir_type *e_type, ir_mode *mode, int alignment);
-} lower_params_t;
+/**
+ * Additional flags for the lowering.
+ */
+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 return types.
+ * Lower calls with compound parameter and return types.
  * This function does the following transformations:
  *
+ * If LF_COMPOUND_PARAM is set:
+ *
+ * - Copy compound parameters to a new location on the callers
+ *   stack and transmit the address of this new location
+ *
+ * If LF_COMPOUND_RETURN is set:
+ *
  * - Adds a new (hidden) pointer parameter for
- *   any return compound type.
+ *   any return compound type. The return type is replaced by void
+ *   or if LOWERING_FLAGS_RETURN_HIDDEN is set by the address.
  *
  * - Use of the hidden parameters in the function code.
  *
@@ -50,7 +60,43 @@ typedef struct {
  *   stack.
  *
  * - Replace a possible block copy after the function call.
+ *
+ * General:
+ *
+ * - Changes the types of methods and calls to the lowered ones
+ *
+ * - lower all method types of existing entities
+ *
+ * In pseudo-code, the following transformation is done:
+ *
+   @code
+   struct x ret = func(a, b);
+   @endcode
+ *
+ * is translated into
+   @code
+   struct x ret;
+   func(&ret, a, b);
+   @endcode
+ *
+ * If the function returns only one possible result, the copy-on-return
+ * optimization is done, ie.
+   @code
+   struct x func(a) {
+     struct x ret;
+     ret.a = a;
+     return ret;
+   }
+   @endcode
+ *
+ * is transformed into
+ *
+   @code
+   void func(struct x *ret, a) {
+     ret->a = a;
+   }
+   @endcode
  */
-void lower_compound_ret_calls(const lower_params_t *params);
+void lower_calls_with_compounds(compound_call_lowering_flags flags);
 
-#endif /* _LOWER_CALLS_H_ */
+#endif