diff ir/irtype.h @ 1192:3251ce06c820

Started seperating type resolution from the rest of codegen again, the merge had too many regressions.
author Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
date Fri, 03 Apr 2009 16:34:11 +0200
parents
children 79758fd2f48a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ir/irtype.h	Fri Apr 03 16:34:11 2009 +0200
@@ -0,0 +1,122 @@
+#ifndef __LDC_IR_IRTYPE_H__
+#define __LDC_IR_IRTYPE_H__
+
+#include "llvm/Type.h"
+
+//////////////////////////////////////////////////////////////////////////////
+
+// forward declarations
+
+struct Type;
+
+class IrTypeArray;
+class IrTypeBasic;
+class IrTypePointer;
+class IrTypeSArray;
+
+//////////////////////////////////////////////////////////////////////////////
+
+/// Base class for IrTypeS.
+class IrType
+{
+public:
+    ///
+    IrType(Type* dt, const llvm::Type* lt);
+
+    ///
+    Type* getD()                    { return dtype; }
+
+    ///
+    const llvm::Type* get()         { return pa.get(); }
+
+    ///
+    virtual IrTypeArray* isArray()      { return NULL; }
+    ///
+    virtual IrTypeBasic* isBasic()      { return NULL; }
+    ///
+    virtual IrTypePointer* isPointer()  { return NULL; }
+    ///
+    virtual IrTypeSArray* isSArray()    { return NULL; }
+
+protected:
+    ///
+    Type* dtype;
+
+    /// LLVM type holder.
+    llvm::PATypeHolder pa;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+/// IrType for basic D types.
+class IrTypeBasic : public IrType
+{
+public:
+    ///
+    IrTypeBasic(Type* dt);
+
+    ///
+    IrTypeBasic* isBasic()          { return this; }
+
+protected:
+    ///
+    const llvm::Type* basic2llvm(Type* t);
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+/// IrType from pointers.
+class IrTypePointer : public IrType
+{
+public:
+    ///
+    IrTypePointer(Type* dt);
+
+    ///
+    IrTypePointer* isPointer()      { return this; }
+
+protected:
+    ///
+    const llvm::Type* pointer2llvm(Type* t);
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+/// IrType for static arrays
+class IrTypeSArray : public IrType
+{
+public:
+    ///
+    IrTypeSArray(Type* dt);
+
+    ///
+    IrTypeSArray* isSArray()  { return this; }
+
+protected:
+    ///
+    const llvm::Type* sarray2llvm(Type* t);
+
+    /// Dimension.
+    uint64_t dim;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+/// IrType for dynamic arrays
+class IrTypeArray : public IrType
+{
+public:
+    ///
+    IrTypeArray(Type* dt);
+
+    ///
+    IrTypeArray* isArray()  { return this; }
+
+protected:
+    ///
+    const llvm::Type* array2llvm(Type* t);
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+#endif