diff ir/irfuncty.h @ 1051:dc608dc33081

Make IrFuncTy a member of TypeFunction. Reset between modules compiled in the same LDC call.
author Christian Kamm <kamm incasoftware de>
date Sat, 07 Mar 2009 14:25:30 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ir/irfuncty.h	Sat Mar 07 14:25:30 2009 +0100
@@ -0,0 +1,108 @@
+#ifndef LDC_IR_IRFUNCTY_H
+#define LDC_IR_IRFUNCTY_H
+
+#include "ir/ir.h"
+#include "llvm/ADT/SmallVector.h"
+
+#include <vector>
+
+struct ABIRewrite;
+namespace llvm {
+    class Type;
+    class Value;
+    class Instruction;
+    class Function;
+}
+
+// represents a function type argument
+// both explicit and implicit as well as return values
+struct IrFuncTyArg : IrBase
+{
+    /** This is the original D type as the frontend knows it
+     *  May NOT be rewritten!!! */
+    Type* type;
+
+    /// This is the final LLVM Type used for the parameter/return value type
+    const llvm::Type* ltype;
+
+    /** These are the final LLVM attributes used for the function.
+     *  Must be valid for the LLVM Type and byref setting */
+    unsigned attrs;
+
+    /** 'true' if the final LLVM argument is a LLVM reference type.
+     *  Must be true when the D Type is a value type, but the final
+     *  LLVM Type is a reference type! */
+    bool byref;
+
+    /** Pointer to the ABIRewrite structure needed to rewrite LLVM ValueS
+     *  to match the final LLVM Type when passing arguments and getting
+     *  return values */
+    ABIRewrite* rewrite;
+
+    /// Helper to check if the 'inreg' attribute is set
+    bool isInReg() const;
+    /// Helper to check if the 'sret' attribute is set
+    bool isSRet() const;
+    /// Helper to check if the 'byval' attribute is set
+    bool isByVal() const;
+
+    /** @param t D type of argument/return value as known by the frontend
+     *  @param byref Initial value for the 'byref' field. If true the initial
+     *               LLVM Type will be of DtoType(type->pointerTo()), instead
+     *               of just DtoType(type) */
+    IrFuncTyArg(Type* t, bool byref, unsigned a = 0);
+};
+
+// represents a function type
+struct IrFuncTy : IrBase
+{
+    // return value
+    IrFuncTyArg* ret;
+
+    // null if not applicable
+    IrFuncTyArg* arg_sret;
+    IrFuncTyArg* arg_this;
+    IrFuncTyArg* arg_nest;
+    IrFuncTyArg* arg_arguments;
+    IrFuncTyArg* arg_argptr;
+
+    // normal explicit arguments
+//    typedef llvm::SmallVector<IrFuncTyArg*, 4> ArgList;
+    typedef std::vector<IrFuncTyArg*> ArgList;
+    typedef ArgList::iterator ArgIter;
+    ArgList args;
+
+    // C varargs
+    bool c_vararg;
+
+    // range of normal parameters to reverse
+    bool reverseParams;
+
+    IrFuncTy()
+    :   ret(NULL),
+        arg_sret(NULL),
+        arg_this(NULL),
+        arg_nest(NULL),
+        arg_arguments(NULL),
+        arg_argptr(NULL),
+        c_vararg(false),
+        reverseParams(false)
+    {}
+    
+    void reset() {
+        ret = NULL;
+        arg_sret = arg_this = arg_nest = arg_arguments = arg_argptr = NULL;
+        args.clear();
+        c_vararg = false;
+        reverseParams = false;
+    }
+
+    llvm::Value* putRet(Type* dty, DValue* dval);
+    llvm::Value* getRet(Type* dty, DValue* dval);
+
+    llvm::Value* putParam(Type* dty, int idx, DValue* dval);
+    llvm::Value* getParam(Type* dty, int idx, DValue* dval);
+    void getParam(Type* dty, int idx, DValue* dval, llvm::Value* lval);
+};
+
+#endif