diff gen/tollvm.cpp @ 719:7261ff0f95ff

Implemented first class delegates. closes #101
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 22 Oct 2008 21:50:08 +0200
parents 30b42a283c8e
children 55f6c2e454d7
line wrap: on
line diff
--- a/gen/tollvm.cpp	Wed Oct 22 20:00:57 2008 +0200
+++ b/gen/tollvm.cpp	Wed Oct 22 21:50:08 2008 +0200
@@ -25,14 +25,14 @@
 {
     Type* typ = type->toBasetype();
     TY t = typ->ty;
-    return (t == Tstruct || t == Tdelegate || t == Tsarray);
+    return (t == Tstruct || t == Tsarray);
 }
 
 bool DtoIsReturnedInArg(Type* type)
 {
     Type* typ = type->toBasetype();
     TY t = typ->ty;
-    return (t == Tstruct || t == Tdelegate || t == Tsarray);
+    return (t == Tstruct || t == Tsarray);
 }
 
 unsigned DtoShouldExtend(Type* type)
@@ -221,6 +221,7 @@
 
 const LLStructType* DtoDelegateType(Type* t)
 {
+    assert(t->ty == Tdelegate);
     const LLType* i8ptr = getVoidPtrType();
     const LLType* func = DtoFunctionType(t->next, NULL, i8ptr);
     const LLType* funcptr = getPtrToType(func);
@@ -235,25 +236,22 @@
     llvm::Value *b1, *b2;
     if (rhs == NULL)
     {
-        LLValue* l = DtoLoad(DtoGEPi(lhs,0,0));
-        LLValue* r = llvm::Constant::getNullValue(l->getType());
-        b1 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,l,r,"tmp");
-        l = DtoLoad(DtoGEPi(lhs,0,1));
-        r = llvm::Constant::getNullValue(l->getType());
-        b2 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,l,r,"tmp");
+        rhs = LLConstant::getNullValue(lhs->getType());
     }
-    else
-    {
-        LLValue* l = DtoLoad(DtoGEPi(lhs,0,0));
-        LLValue* r = DtoLoad(DtoGEPi(rhs,0,0));
-        b1 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,l,r,"tmp");
-        l = DtoLoad(DtoGEPi(lhs,0,1));
-        r = DtoLoad(DtoGEPi(rhs,0,1));
-        b2 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,l,r,"tmp");
-    }
+
+    LLValue* l = gIR->ir->CreateExtractValue(lhs, 0);
+    LLValue* r = gIR->ir->CreateExtractValue(rhs, 0);
+    b1 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,l,r,"tmp");
+
+    l = gIR->ir->CreateExtractValue(lhs, 1);
+    r = gIR->ir->CreateExtractValue(rhs, 1);
+    b2 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,l,r,"tmp");
+
     LLValue* b = gIR->ir->CreateAnd(b1,b2,"tmp");
+
     if (op == TOKnotequal || op == TOKnotidentity)
         return gIR->ir->CreateNot(b,"tmp");
+
     return b;
 }
 
@@ -557,8 +555,8 @@
 
 LLValue* DtoLoad(LLValue* src, const char* name)
 {
-    if (Logger::enabled())
-        Logger::cout() << "loading " << *src <<  '\n';
+//     if (Logger::enabled())
+//         Logger::cout() << "loading " << *src <<  '\n';
     LLValue* ld = gIR->ir->CreateLoad(src, name ? name : "tmp");
     //ld->setVolatile(gIR->func()->inVolatile);
     return ld;
@@ -566,8 +564,8 @@
 
 void DtoStore(LLValue* src, LLValue* dst)
 {
-    if (Logger::enabled())
-        Logger::cout() << "storing " << *src << " into " << *dst << '\n';
+//     if (Logger::enabled())
+//         Logger::cout() << "storing " << *src << " into " << *dst << '\n';
     LLValue* st = gIR->ir->CreateStore(src,dst);
     //st->setVolatile(gIR->func()->inVolatile);
 }