Mercurial > projects > ldc
diff gen/abi.h @ 989:420ef073448d
Forgot new files that were supposed to be in last commit.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Thu, 26 Feb 2009 14:13:27 +0100 |
parents | |
children | e8c6dbcd33d1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/abi.h Thu Feb 26 14:13:27 2009 +0100 @@ -0,0 +1,49 @@ +#ifndef __LDC_GEN_ABI_H__ +#define __LDC_GEN_ABI_H__ + +#include <vector> + +struct Type; +namespace llvm +{ + class Type; + class Value; +} + +// return rewrite rule +struct ABIRetRewrite +{ + // get original value from rewritten one + virtual LLValue* get(LLValue* v) = 0; + + // rewrite original value + virtual LLValue* put(LLValue* v) = 0; + + // returns target type of this rewrite + virtual const LLType* type(const LLType* t) = 0; + + // test if rewrite applies + virtual bool test(TypeFunction* tf) = 0; +}; + + +// interface called by codegen +struct TargetABI +{ + static TargetABI* getTarget(); + + TargetABI(); + + const llvm::Type* getRetType(TypeFunction* tf, const llvm::Type* t); + llvm::Value* getRet(TypeFunction* tf, llvm::Value* v); + llvm::Value* putRet(TypeFunction* tf, llvm::Value* v); + + virtual bool returnInArg(Type* t) = 0; + virtual bool passByRef(Type* t) = 0; + +protected: + std::vector<ABIRetRewrite*> retOps; + ABIRetRewrite* findRetRewrite(TypeFunction* tf); +}; + +#endif