Mercurial > projects > ldc
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 {