Changeset 800:d14e4594c7d7
- Timestamp:
- 11/29/08 12:28:17
(1 month ago)
- Author:
- Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
- branch:
- default
- Message:
Changed aggregate field initializers to be created lazily, fixes problem with static void arrays in aggregates.
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r797 |
r800 |
|
| 425 | 425 | |
|---|
| 426 | 426 | void addZeros(std::vector<llvm::Constant*>& inits, size_t pos, size_t offset); // irstruct.cpp |
|---|
| 427 | | |
|---|
| 428 | | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 429 | | |
|---|
| 430 | | // assigns constant initializers to fields introduced by cd |
|---|
| 431 | | static void init_field_inits(ClassDeclaration* cd) |
|---|
| 432 | | { |
|---|
| 433 | | size_t n = cd->fields.dim; |
|---|
| 434 | | for (size_t i=0; i<n; i++) |
|---|
| 435 | | { |
|---|
| 436 | | VarDeclaration* v = (VarDeclaration*)cd->fields.data[i]; |
|---|
| 437 | | IrField* f = v->ir.irField; |
|---|
| 438 | | assert(!f->constInit); |
|---|
| 439 | | f->constInit = DtoConstFieldInitializer(v->loc, v->type, v->init); |
|---|
| 440 | | } |
|---|
| 441 | | } |
|---|
| 442 | 427 | |
|---|
| 443 | 428 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| … | … | |
| 503 | 488 | |
|---|
| 504 | 489 | // add the field |
|---|
| 505 | | assert(var->ir.irField->constInit); |
|---|
| | 490 | // and build its constant initializer lazily |
|---|
| | 491 | if (!var->ir.irField->constInit) |
|---|
| | 492 | var->ir.irField->constInit = DtoConstFieldInitializer(var->loc, var->type, var->init); |
|---|
| 506 | 493 | inits.push_back(var->ir.irField->constInit); |
|---|
| 507 | 494 | |
|---|
| … | … | |
| 731 | 718 | const llvm::ArrayType* vtbltype = isaArray(irstruct->vtblTy.get()); |
|---|
| 732 | 719 | assert(vtbltype); |
|---|
| 733 | | |
|---|
| 734 | | // make sure each field knows its default initializer |
|---|
| 735 | | init_field_inits(cd); |
|---|
| 736 | 720 | |
|---|
| 737 | 721 | // build initializer list |
|---|
| r797 |
r800 |
|
| 209 | 209 | // do the default |
|---|
| 210 | 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 | 213 | LLConstant* c = nextdef->ir.irField->constInit; |
|---|
| 212 | 214 | inits.push_back(c); |
|---|
| … | … | |
| 262 | 264 | // do the default |
|---|
| 263 | 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 | 268 | LLConstant* c = nextdef->ir.irField->constInit; |
|---|
| 265 | 269 | inits.push_back(c); |
|---|
| … | … | |
| 464 | 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 | 470 | // always generate the constant initalizer |
|---|
| 476 | 471 | if (sd->zeroInit) |
|---|
| r797 |
r800 |
|
| 10 | 10 | #include "gen/tollvm.h" |
|---|
| 11 | 11 | #include "gen/logger.h" |
|---|
| | 12 | #include "gen/llvmhelpers.h" |
|---|
| 12 | 13 | |
|---|
| 13 | 14 | IrInterface::IrInterface(BaseClass* b) |
|---|
| … | … | |
| 319 | 320 | |
|---|
| 320 | 321 | // add the field |
|---|
| 321 | | assert(var->ir.irField->constInit); |
|---|
| | 322 | // lazily default initialize |
|---|
| | 323 | if (!var->ir.irField->constInit) |
|---|
| | 324 | var->ir.irField->constInit = DtoConstFieldInitializer(var->loc, var->type, var->init); |
|---|
| 322 | 325 | inits.push_back(var->ir.irField->constInit); |
|---|
| 323 | 326 | |
|---|