diff ir/irfunction.h @ 1024:9167d492cbc2

Abstracted more (most) ABI details out of the normal codegen.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 03 Mar 2009 02:51:21 +0100
parents 1714836f2c0b
children 9dca7182aa75
line wrap: on
line diff
--- a/ir/irfunction.h	Sun Mar 01 22:40:15 2009 +0100
+++ b/ir/irfunction.h	Tue Mar 03 02:51:21 2009 +0100
@@ -1,6 +1,7 @@
 #ifndef LDC_IR_IRFUNCTION_H
 #define LDC_IR_IRFUNCTION_H
 
+#include "gen/llvm.h"
 #include "ir/ir.h"
 #include "ir/irlandingpad.h"
 
@@ -8,6 +9,66 @@
 #include <stack>
 #include <map>
 
+struct ABIRewrite;
+
+// represents a function type argument
+// both explicit and implicit as well as return values
+struct IrFuncTyArg : IrBase
+{
+    Type* type;
+    const llvm::Type* ltype;
+    unsigned attrs;
+    bool byref;
+
+    ABIRewrite* rewrite;
+
+    bool isInReg() const { return (attrs & llvm::Attribute::InReg) != 0; }
+    bool isSRet() const  { return (attrs & llvm::Attribute::StructRet) != 0; }
+    bool isByVal() const { return (attrs & llvm::Attribute::ByVal) != 0; }
+
+    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
+    LLSmallVector<IrFuncTyArg*, 4> 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)
+    {}
+
+    llvm::Value* putRet(Type* dty, llvm::Value* val);
+    llvm::Value* getRet(Type* dty, llvm::Value* val);
+
+    llvm::Value* getParam(Type* dty, int idx, llvm::Value* val);
+    llvm::Value* putParam(Type* dty, int idx, llvm::Value* val);
+};
+
 // represents a function
 struct IrFunction : IrBase
 {