comparison gen/structs.cpp @ 800:d14e4594c7d7

Changed aggregate field initializers to be created lazily, fixes problem with static void arrays in aggregates.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sat, 29 Nov 2008 18:28:17 +0100
parents 340acf1535d0
children 28ce72c60a21
comparison
equal deleted inserted replaced
797:340acf1535d0 800:d14e4594c7d7
206 addZeros(inits, pos, nextdef->offset); 206 addZeros(inits, pos, nextdef->offset);
207 } 207 }
208 208
209 // do the default 209 // do the default
210 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset); 210 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset);
211 if (!nextdef->ir.irField->constInit)
212 nextdef->ir.irField->constInit = DtoConstFieldInitializer(nextdef->loc, nextdef->type, nextdef->init);
211 LLConstant* c = nextdef->ir.irField->constInit; 213 LLConstant* c = nextdef->ir.irField->constInit;
212 inits.push_back(c); 214 inits.push_back(c);
213 215
214 // update offsets 216 // update offsets
215 lastoffset = nextdef->offset; 217 lastoffset = nextdef->offset;
259 addZeros(inits, pos, nextdef->offset); 261 addZeros(inits, pos, nextdef->offset);
260 } 262 }
261 263
262 // do the default 264 // do the default
263 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset); 265 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset);
266 if (!nextdef->ir.irField->constInit)
267 nextdef->ir.irField->constInit = DtoConstFieldInitializer(nextdef->loc, nextdef->type, nextdef->init);
264 LLConstant* c = nextdef->ir.irField->constInit; 268 LLConstant* c = nextdef->ir.irField->constInit;
265 inits.push_back(c); 269 inits.push_back(c);
266 270
267 // update offsets 271 // update offsets
268 lastoffset = nextdef->offset; 272 lastoffset = nextdef->offset;
461 IrStruct* irstruct = sd->ir.irStruct; 465 IrStruct* irstruct = sd->ir.irStruct;
462 gIR->structs.push_back(irstruct); 466 gIR->structs.push_back(irstruct);
463 467
464 const llvm::StructType* structtype = isaStruct(sd->type->ir.type->get()); 468 const llvm::StructType* structtype = isaStruct(sd->type->ir.type->get());
465 469
466 // make sure each offset knows its default initializer
467 Array* fields = &sd->fields;
468 for (int k=0; k < fields->dim; k++)
469 {
470 VarDeclaration* v = (VarDeclaration*)fields->data[k];
471 LLConstant* finit = DtoConstFieldInitializer(v->loc, v->type, v->init);
472 v->ir.irField->constInit = finit;
473 }
474
475 // always generate the constant initalizer 470 // always generate the constant initalizer
476 if (sd->zeroInit) 471 if (sd->zeroInit)
477 { 472 {
478 Logger::println("Zero initialized"); 473 Logger::println("Zero initialized");
479 irstruct->constInit = llvm::ConstantAggregateZero::get(structtype); 474 irstruct->constInit = llvm::ConstantAggregateZero::get(structtype);