diff gen/arrays.cpp @ 593:7042d912767e

Undid some of the previous changes: DtoArrayInit has issues with arrays similar to T[n][].
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Sep 2008 13:47:38 +0200
parents e6bcc4d9e5ff
children 48f079b4fe0f
line wrap: on
line diff
--- a/gen/arrays.cpp	Sun Sep 14 10:56:01 2008 +0200
+++ b/gen/arrays.cpp	Sun Sep 14 13:47:38 2008 +0200
@@ -136,7 +136,8 @@
 
     // determine the right runtime function to call
     const char* funcname = NULL;
-    Type* t = value->getType()->toBasetype();
+    Type* arrayelemty = array->getType()->nextOf()->toBasetype();
+    Type* valuety = value->getType()->toBasetype();
 
     // lets first optimize all zero initializations down to a memset.
     // this simplifies codegen later on as llvm null's have no address!
@@ -149,7 +150,7 @@
     }
 
     // if not a zero initializer, call the appropriate runtime function!
-    switch (t->ty)
+    switch (arrayelemty->ty)
     {
     case Tbool:
         funcname = "_d_array_init_i1";
@@ -220,9 +221,10 @@
     case Tarray:
     case Tsarray:
         funcname = "_d_array_init_mem";
+        assert(arrayelemty == valuety && "ArrayInit doesn't work on elem-initialized static arrays");
         args[0] = DtoBitCast(args[0], getVoidPtrType());
         args[2] = DtoBitCast(args[2], getVoidPtrType());
-        args.push_back(DtoConstSize_t(getABITypeSize(DtoType(t))));
+        args.push_back(DtoConstSize_t(getABITypeSize(DtoType(arrayelemty))));
         break;
 
     default:
@@ -412,7 +414,9 @@
     LLValue* arrayLen = dim->getRVal();
 
     // get runtime function
-    LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_newarrayvT");
+    bool zeroInit = arrayType->toBasetype()->nextOf()->isZeroInit();
+    const char* fnname = defaultInit ? (zeroInit ? "_d_newarrayT" : "_d_newarrayiT") : "_d_newarrayvT";
+    LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, fnname);
 
     // call allocator
     LLValue* newptr = gIR->CreateCallOrInvoke2(fn, arrayTypeInfo, arrayLen, ".gc_mem")->get();
@@ -424,14 +428,7 @@
 
     Logger::cout() << "final ptr = " << *newptr << '\n';
 
-    DSliceValue* ret = new DSliceValue(arrayType, arrayLen, newptr);
-
-    if (defaultInit) {
-        DValue* e = arrayType->nextOf()->defaultInit()->toElem(gIR);
-        DtoArrayInit(loc, ret, e);
-    }
-
-    return ret;
+    return new DSliceValue(arrayType, arrayLen, newptr);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -450,7 +447,8 @@
 
     // get runtime function
     bool zeroInit = vtype->isZeroInit();
-    LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, zeroInit ? "_d_newarraymT" : "_d_newarraymiT" );
+    const char* fnname = defaultInit ? (zeroInit ? "_d_newarraymT" : "_d_newarraymiT") : "_d_newarraymvT";
+    LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, fnname);
 
     // build dims
     LLValue* dimsArg = DtoAlloca(DtoSize_t(), DtoConstUint(ndims), ".newdims");
@@ -472,14 +470,6 @@
 
     Logger::cout() << "final ptr = " << *newptr << '\n';
 
-#if 0
-    // using this would reinit all arrays beyond the first level to []
-    if (defaultInit) {
-        DValue* e = dty->defaultInit()->toElem(gIR);
-        DtoArrayInit(newptr,dim,e->getRVal());
-    }
-#endif
-
     assert(firstDim);
     return new DSliceValue(arrayType, firstDim, newptr);
 }