Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

Changeset 800:d14e4594c7d7

Show
Ignore:
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
  • gen/classes.cpp

    r797 r800  
    425425 
    426426void 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 } 
    442427 
    443428////////////////////////////////////////////////////////////////////////////// 
     
    503488 
    504489        // 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); 
    506493        inits.push_back(var->ir.irField->constInit); 
    507494 
     
    731718    const llvm::ArrayType* vtbltype = isaArray(irstruct->vtblTy.get()); 
    732719    assert(vtbltype); 
    733  
    734     // make sure each field knows its default initializer 
    735     init_field_inits(cd); 
    736720 
    737721    // build initializer list 
  • gen/structs.cpp

    r797 r800  
    209209                // do the default 
    210210                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); 
    211213                LLConstant* c = nextdef->ir.irField->constInit; 
    212214                inits.push_back(c); 
     
    262264            // do the default 
    263265            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); 
    264268            LLConstant* c = nextdef->ir.irField->constInit; 
    265269            inits.push_back(c); 
     
    464468    const llvm::StructType* structtype = isaStruct(sd->type->ir.type->get()); 
    465469 
    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  
    475470    // always generate the constant initalizer 
    476471    if (sd->zeroInit) 
  • ir/irstruct.cpp

    r797 r800  
    1010#include "gen/tollvm.h" 
    1111#include "gen/logger.h" 
     12#include "gen/llvmhelpers.h" 
    1213 
    1314IrInterface::IrInterface(BaseClass* b) 
     
    319320 
    320321            // 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); 
    322325            inits.push_back(var->ir.irField->constInit); 
    323326 
Copyright © 2008, LDC Development Team.