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