Mercurial > projects > ldc
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;