comparison 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
comparison
equal deleted inserted replaced
87:25d4fcce53f4 88:058d3925950e
249 } 249 }
250 250
251 ////////////////////////////////////////////////////////////////////////////////////////// 251 //////////////////////////////////////////////////////////////////////////////////////////
252 llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit) 252 llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit)
253 { 253 {
254 Logger::println("arr init begin"); 254 Logger::println("DtoConstArrayInitializer: %s | %s", arrinit->toChars(), arrinit->type->toChars());
255 LOG_SCOPE;
256
255 Type* arrinittype = DtoDType(arrinit->type); 257 Type* arrinittype = DtoDType(arrinit->type);
256 258
257 Type* t; 259 Type* t;
258 integer_t tdim; 260 integer_t tdim;
259 if (arrinittype->ty == Tsarray) { 261 if (arrinittype->ty == Tsarray) {
262 Logger::println("static array");
260 TypeSArray* tsa = (TypeSArray*)arrinittype; 263 TypeSArray* tsa = (TypeSArray*)arrinittype;
261 tdim = tsa->dim->toInteger(); 264 tdim = tsa->dim->toInteger();
262 t = tsa; 265 t = tsa;
263 } 266 }
264 else if (arrinittype->ty == Tarray) { 267 else if (arrinittype->ty == Tarray) {
268 Logger::println("dynamic array");
265 t = arrinittype; 269 t = arrinittype;
266 tdim = arrinit->dim; 270 tdim = arrinit->dim;
267 } 271 }
268 else 272 else
269 assert(0); 273 assert(0);
270 274
271 std::vector<llvm::Constant*> inits(tdim, 0); 275 Logger::println("dim = %u", tdim);
276
277 std::vector<llvm::Constant*> inits(tdim, NULL);
272 278
273 const llvm::Type* elemty = DtoType(arrinittype->next); 279 const llvm::Type* elemty = DtoType(arrinittype->next);
274 280
275 assert(arrinit->index.dim == arrinit->value.dim); 281 assert(arrinit->index.dim == arrinit->value.dim);
276 for (int i=0,j=0; i < tdim; ++i) 282 for (unsigned i=0,j=0; i < tdim; ++i)
277 { 283 {
278 Initializer* init = 0; 284 Initializer* init = 0;
279 Expression* idx = (Expression*)arrinit->index.data[j]; 285 Expression* idx = (Expression*)arrinit->index.data[j];
280 286
281 if (idx) 287 if (idx)
282 { 288 {
283 integer_t k = idx->toInteger(); 289 // this is pretty weird :/ idx->type turned out NULL for the initializer:
284 if (i == k) 290 // const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
285 { 291 // in std.c.linux.socket
286 init = (Initializer*)arrinit->value.data[j]; 292 if (idx->type) {
287 assert(init); 293 //integer_t k = idx->toInteger();
288 ++j; 294 Logger::println("getting value for exp: %s | %s", idx->toChars(), idx->type->toChars());
295 llvm::Constant* cc = idx->toConstElem(gIR);
296 Logger::println("value gotten");
297 assert(cc != NULL);
298 llvm::ConstantInt* ci = llvm::dyn_cast<llvm::ConstantInt>(cc);
299 assert(ci != NULL);
300 uint64_t k = ci->getZExtValue();
301 if (i == k)
302 {
303 init = (Initializer*)arrinit->value.data[j];
304 assert(init);
305 ++j;
306 }
289 } 307 }
290 } 308 }
291 else 309 else
292 { 310 {
293 init = (Initializer*)arrinit->value.data[j]; 311 init = (Initializer*)arrinit->value.data[j];
294 ++j; 312 ++j;
295 } 313 }
296 314
297 llvm::Constant* v = 0; 315 llvm::Constant* v = DtoConstInitializer(t->next, init);
298
299 if (!init)
300 {
301 v = t->next->defaultInit()->toConstElem(gIR);
302 }
303 else if (ExpInitializer* ex = init->isExpInitializer())
304 {
305 v = ex->exp->toConstElem(gIR);
306 }
307 else if (StructInitializer* si = init->isStructInitializer())
308 {
309 v = DtoConstStructInitializer(si);
310 }
311 else if (ArrayInitializer* ai = init->isArrayInitializer())
312 {
313 v = DtoConstArrayInitializer(ai);
314 }
315 else if (init->isVoidInitializer())
316 {
317 v = llvm::UndefValue::get(elemty);
318 }
319 else
320 assert(v); 316 assert(v);
321 317
322 inits[i] = v; 318 inits[i] = v;
323 } 319 }
324 320