diff ir/irtypefunction.cpp @ 1364:46f6365a50d7

Added IrTypeFunction and IrTypeDelegate and eliminated IrDType. This means the Type::ir field can be removed. It's the final part needed for the move to a slightly more sane type system. Now the whole thing just needs to be cleaned up :P Added -v-cg switch, which right now just prints "codegen: module.name (module/name.d)" to stdout, this can really help figuring out where, in some complex build command, things go wrong.
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sat, 16 May 2009 18:19:52 +0200
parents
children 755abafbf25d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ir/irtypefunction.cpp	Sat May 16 18:19:52 2009 +0200
@@ -0,0 +1,47 @@
+#include "llvm/DerivedTypes.h"
+#include "mtype.h"
+
+#include "gen/irstate.h"
+#include "gen/tollvm.h"
+#include "gen/functions.h"
+
+#include "ir/irtypefunction.h"
+
+IrTypeFunction::IrTypeFunction(Type * dt)
+:   IrType(dt, llvm::OpaqueType::get())
+{
+    irfty = NULL;
+}
+
+const llvm::Type * IrTypeFunction::buildType()
+{
+    const llvm::Type* T;
+    TypeFunction* tf = (TypeFunction*)dtype;
+    if (tf->funcdecl)
+        T = DtoFunctionType(tf->funcdecl);
+    else
+        T = DtoFunctionType(tf,NULL,NULL);
+
+    llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(T);
+    return pa.get();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+IrTypeDelegate::IrTypeDelegate(Type * dt)
+:   IrType(dt, llvm::OpaqueType::get())
+{
+}
+
+const llvm::Type * IrTypeDelegate::buildType()
+{
+    assert(dtype->ty == Tdelegate);
+    const LLType* i8ptr = getVoidPtrType();
+    const LLType* func = DtoFunctionType(dtype->nextOf(), NULL, Type::tvoid->pointerTo());
+    const LLType* funcptr = getPtrToType(func);
+    const LLStructType* dgtype = LLStructType::get(i8ptr, funcptr, NULL);
+    gIR->module->addTypeName(dtype->toChars(), dgtype);
+
+    llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(dgtype);
+    return pa.get();
+}