diff gen/toir.cpp @ 98:6789050b5ad1 trunk

[svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references. Now uses the DMD _adEq(void[], void[], TypeInfo) runtime function for array equality comparison.
author lindquist
date Wed, 14 Nov 2007 23:39:10 +0100
parents c4e161556a21
children a676a7743642
line wrap: on
line diff
--- a/gen/toir.cpp	Wed Nov 14 20:18:01 2007 +0100
+++ b/gen/toir.cpp	Wed Nov 14 23:39:10 2007 +0100
@@ -64,6 +64,7 @@
                 //allocainst->setAlignment(vd->type->alignsize()); // TODO
                 vd->llvmValue = allocainst;
             }
+            Logger::cout() << "llvm value for decl: " << *vd->llvmValue << '\n';
             DValue* ie = DtoInitializer(vd->init);
         }
 
@@ -1364,19 +1365,14 @@
     Logger::print("SymOffExp::toElem: %s | %s\n", toChars(), type->toChars());
     LOG_SCOPE;
 
+    assert(0 && "SymOffExp::toElem should no longer be called :/");
+
     if (VarDeclaration* vd = var->isVarDeclaration())
     {
         Logger::println("VarDeclaration");
         if (!vd->llvmTouched && vd->isDataseg())
             vd->toObjFile();
 
-        // TODO
-        /*
-        if (vd->isTypedefDeclaration()) {
-            e->istypeinfo = true;
-        }
-        */
-
         assert(vd->llvmValue);
         Type* t = DtoDType(type);
         Type* tnext = DtoDType(t->next);
@@ -1540,6 +1536,7 @@
 
             llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
             llvm::Value* vtblidx = llvm::ConstantInt::get(llvm::Type::Int32Ty, (size_t)fdecl->vtblIndex, false);
+            Logger::cout() << "vthis: " << *vthis << '\n';
             funcval = DtoGEP(vthis, zero, zero, "tmp", p->scopebb());
             funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb());
             funcval = DtoGEP(funcval, zero, vtblidx, toChars(), p->scopebb());
@@ -1871,15 +1868,10 @@
         }
         eval = new llvm::FCmpInst(cmpop, l->getRVal(), r->getRVal(), "tmp", p->scopebb());
     }
-    else if (t->ty == Tsarray)
+    else if (t->ty == Tsarray || t->ty == Tarray)
     {
-        Logger::println("static array");
-        eval = DtoStaticArrayCompare(op,l->getRVal(),r->getRVal());
-    }
-    else if (t->ty == Tarray)
-    {
-        Logger::println("dynamic array");
-        eval = DtoDynArrayCompare(op,l->getRVal(),r->getRVal());
+        Logger::println("static or dynamic array");
+        eval = DtoArrayEquals(op,l,r);
     }
     else if (t->ty == Tdelegate)
     {
@@ -2568,12 +2560,21 @@
     else
     assert(0);
 
+    Logger::cout() << "array literal mem: " << *mem << '\n';
+
     for (unsigned i=0; i<elements->dim; ++i)
     {
         Expression* expr = (Expression*)elements->data[i];
         llvm::Value* elemAddr = DtoGEPi(mem,0,i,"tmp",p->scopebb());
+        DVarValue* vv = new DVarValue(expr->type, elemAddr, true);
+        p->exps.push_back(IRExp(NULL, expr, vv));
         DValue* e = expr->toElem(p);
-        new llvm::StoreInst(e->getRVal(), elemAddr, p->scopebb());
+        p->exps.pop_back();
+
+        DImValue* im = e->isIm();
+        if (!im || !im->inPlace()) {
+            DtoAssign(vv, e);
+        }
     }
 
     if (ty->ty == Tsarray)