diff gen/toir.c @ 34:4648206ca213 trunk

[svn r38] * resizing dynamic arrays support * throw is replaced with assert(0) * catch is ignored * better foreach support * various bugfixes
author lindquist
date Tue, 09 Oct 2007 02:50:00 +0200
parents a86fe7496b58
children c0967c4b2a74
line wrap: on
line diff
--- a/gen/toir.c	Thu Oct 04 22:38:53 2007 +0200
+++ b/gen/toir.c	Tue Oct 09 02:50:00 2007 +0200
@@ -118,8 +118,10 @@
                     e->mem = tid->llvmValue;
                     e->type = elem::VAR;
                 }
-                else
-                assert(0 && "only magic supported is typeinfo");
+                else {
+                    Logger::println("unsupported: %s\n", vd->toChars());
+                    assert(0 && "only magic supported is typeinfo");
+                }
             }
             return e;
         }
@@ -331,9 +333,23 @@
         elem* r = e2->toElem(p);
     p->lvals.pop_back();
 
+    if (l->type == elem::ARRAYLEN)
+    {
+        LLVM_DtoResizeDynArray(l->mem, r->getValue());
+        delete r;
+        delete l;
+        return 0;
+    }
+
     // handle function argument - allocate temp storage for it :/ annoying
     if (l->mem == 0) {
-        LLVM_DtoGiveArgumentStorage(l);
+        assert(l->val);
+        if (llvm::isa<llvm::Argument>(l->val))
+            LLVM_DtoGiveArgumentStorage(l);
+        else {
+            Logger::cout() << "here it comes... " << *l->val << '\n';
+            assert(0);
+        }
     }
     //e->val = l->store(r->getValue());
 
@@ -1826,12 +1842,16 @@
             if (arguments->dim == 1) {
                 elem* sz = ((Expression*)arguments->data[0])->toElem(p);
                 llvm::Value* dimval = sz->getValue();
-                llvm::Value* usedimval = dimval;
+                /*llvm::Value* usedimval = dimval;
                 if (dimval->getType() != llvm::Type::Int32Ty)
-                    usedimval = new llvm::TruncInst(dimval, llvm::Type::Int32Ty,"tmp",p->scopebb());
-                e->mem = new llvm::MallocInst(t,usedimval,"tmp",p->scopebb());
+                    usedimval = new llvm::TruncInst(dimval, llvm::Type::Int32Ty,"tmp",p->scopebb());*/
 
-                LLVM_DtoSetArray(p->toplval(), dimval, e->mem);
+                //e->mem = LLVM_DtoRealloc(0,t);
+                //new llvm::MallocInst(t,usedimval,"tmp",p->scopebb());
+
+                //LLVM_DtoSetArray(p->toplval(), dimval, e->mem);
+
+                LLVM_DtoNewDynArray(p->toplval(), dimval, t);
                 delete sz;
             }
             else {
@@ -1948,11 +1968,18 @@
     elem* e = new elem;
     elem* u = e1->toElem(p);
 
-    llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
-    llvm::Value* ptr = LLVM_DtoGEP(u->mem,zero,zero,"tmp",p->scopebb());
-    e->val = new llvm::LoadInst(ptr, "tmp", p->scopebb());
-    e->type = elem::VAL;
-
+    if (p->inLvalue)
+    {
+        e->mem = u->mem;
+        e->type = elem::ARRAYLEN;
+    }
+    else
+    {
+        llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
+        llvm::Value* ptr = LLVM_DtoGEP(u->mem,zero,zero,"tmp",p->scopebb());
+        e->val = new llvm::LoadInst(ptr, "tmp", p->scopebb());
+        e->type = elem::VAL;
+    }
     delete u;
 
     return e;
@@ -1965,27 +1992,16 @@
     Logger::print("AssertExp::toElem: %s | %s\n", toChars(), type->toChars());
     LOG_SCOPE;
 
-    elem* e = new elem;
     elem* u = e1->toElem(p);
-    elem* m = msg ? msg->toElem(p) : 0;
+    elem* m = msg ? msg->toElem(p) : NULL;
 
-    std::vector<llvm::Value*> llargs;
-    llargs.resize(3);
-    llargs[0] = LLVM_DtoBoolean(u->getValue());
-    llargs[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, loc.linnum, false);
-    llargs[2] = m ? m->val : llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
-    
+    llvm::Value* loca = llvm::ConstantInt::get(llvm::Type::Int32Ty, loc.linnum, false);
+    LLVM_DtoAssert(u->getValue(), loca, m ? m->val : NULL);
+
     delete m;
     delete u;
-    
-    //Logger::cout() << *llargs[0] << '|' << *llargs[1] << '\n';
-    
-    llvm::Function* fn = LLVM_D_GetRuntimeFunction(p->module, "_d_assert");
-    assert(fn);
-    llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", p->scopebb());
-    call->setCallingConv(llvm::CallingConv::C);
 
-    return e;
+    return new elem;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////