diff gen/arrays.cpp @ 88:058d3925950e trunk

[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
author lindquist
date Tue, 06 Nov 2007 10:03:14 +0100
parents fd32135dca3e
children 61615fa85940
line wrap: on
line diff
--- a/gen/arrays.cpp	Sat Nov 03 14:48:33 2007 +0100
+++ b/gen/arrays.cpp	Tue Nov 06 10:03:14 2007 +0100
@@ -251,41 +251,59 @@
 //////////////////////////////////////////////////////////////////////////////////////////
 llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit)
 {
-    Logger::println("arr init begin");
+    Logger::println("DtoConstArrayInitializer: %s | %s", arrinit->toChars(), arrinit->type->toChars());
+    LOG_SCOPE;
+
     Type* arrinittype = DtoDType(arrinit->type);
 
     Type* t;
     integer_t tdim;
     if (arrinittype->ty == Tsarray) {
+        Logger::println("static array");
         TypeSArray* tsa = (TypeSArray*)arrinittype;
         tdim = tsa->dim->toInteger();
         t = tsa;
     }
     else if (arrinittype->ty == Tarray) {
+        Logger::println("dynamic array");
         t = arrinittype;
         tdim = arrinit->dim;
     }
     else
     assert(0);
 
-    std::vector<llvm::Constant*> inits(tdim, 0);
+    Logger::println("dim = %u", tdim);
+
+    std::vector<llvm::Constant*> inits(tdim, NULL);
 
     const llvm::Type* elemty = DtoType(arrinittype->next);
 
     assert(arrinit->index.dim == arrinit->value.dim);
-    for (int i=0,j=0; i < tdim; ++i)
+    for (unsigned i=0,j=0; i < tdim; ++i)
     {
         Initializer* init = 0;
         Expression* idx = (Expression*)arrinit->index.data[j];
 
         if (idx)
         {
-            integer_t k = idx->toInteger();
-            if (i == k)
-            {
-                init = (Initializer*)arrinit->value.data[j];
-                assert(init);
-                ++j;
+            // this is pretty weird :/ idx->type turned out NULL for the initializer:
+            //     const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
+            // in std.c.linux.socket
+            if (idx->type) {
+                //integer_t k = idx->toInteger();
+                Logger::println("getting value for exp: %s | %s", idx->toChars(), idx->type->toChars());
+                llvm::Constant* cc = idx->toConstElem(gIR);
+                Logger::println("value gotten");
+                assert(cc != NULL);
+                llvm::ConstantInt* ci = llvm::dyn_cast<llvm::ConstantInt>(cc);
+                assert(ci != NULL);
+                uint64_t k = ci->getZExtValue();
+                if (i == k)
+                {
+                    init = (Initializer*)arrinit->value.data[j];
+                    assert(init);
+                    ++j;
+                }
             }
         }
         else
@@ -294,29 +312,7 @@
             ++j;
         }
 
-        llvm::Constant* v = 0;
-
-        if (!init)
-        {
-            v = t->next->defaultInit()->toConstElem(gIR);
-        }
-        else if (ExpInitializer* ex = init->isExpInitializer())
-        {
-            v = ex->exp->toConstElem(gIR);
-        }
-        else if (StructInitializer* si = init->isStructInitializer())
-        {
-            v = DtoConstStructInitializer(si);
-        }
-        else if (ArrayInitializer* ai = init->isArrayInitializer())
-        {
-            v = DtoConstArrayInitializer(ai);
-        }
-        else if (init->isVoidInitializer())
-        {
-            v = llvm::UndefValue::get(elemty);
-        }
-        else
+        llvm::Constant* v = DtoConstInitializer(t->next, init);
         assert(v);
 
         inits[i] = v;