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