Mercurial > projects > ldc
comparison gen/structs.cpp @ 157:5c17f81fc1c1 trunk
[svn r173] moved IR state previously stored in Type into IrType and a Type->IrType map; fixes #7
author | ChristianK |
---|---|
date | Thu, 01 May 2008 13:32:08 +0200 |
parents | ccd07d9f2ce9 |
children | 2df270e1ba59 |
comparison
equal
deleted
inserted
replaced
156:ccd07d9f2ce9 | 157:5c17f81fc1c1 |
---|---|
80 Logger::println("DtoConstStructInitializer: %s", si->toChars()); | 80 Logger::println("DtoConstStructInitializer: %s", si->toChars()); |
81 LOG_SCOPE; | 81 LOG_SCOPE; |
82 | 82 |
83 TypeStruct* ts = (TypeStruct*)si->ad->type; | 83 TypeStruct* ts = (TypeStruct*)si->ad->type; |
84 | 84 |
85 const llvm::StructType* structtype = isaStruct(ts->llvmType->get()); | 85 const llvm::StructType* structtype = isaStruct(gIR->irType[ts].type->get()); |
86 Logger::cout() << "llvm struct type: " << *structtype << '\n'; | 86 Logger::cout() << "llvm struct type: " << *structtype << '\n'; |
87 | 87 |
88 assert(si->value.dim == si->vars.dim); | 88 assert(si->value.dim == si->vars.dim); |
89 | 89 |
90 std::vector<DUnionIdx> inits; | 90 std::vector<DUnionIdx> inits; |
302 llvm::PATypeHolder& pa = irstruct->recty; | 302 llvm::PATypeHolder& pa = irstruct->recty; |
303 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(structtype); | 303 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(structtype); |
304 structtype = isaStruct(pa.get()); | 304 structtype = isaStruct(pa.get()); |
305 } | 305 } |
306 | 306 |
307 assert(ts->llvmType == 0); | 307 assert(gIR->irType[ts].type == 0); |
308 ts->llvmType = new llvm::PATypeHolder(structtype); | 308 gIR->irType[ts].type = new llvm::PATypeHolder(structtype); |
309 | 309 |
310 if (sd->parent->isModule()) { | 310 if (sd->parent->isModule()) { |
311 gIR->module->addTypeName(sd->mangle(),structtype); | 311 gIR->module->addTypeName(sd->mangle(),structtype); |
312 } | 312 } |
313 | 313 |
331 std::string initname("_D"); | 331 std::string initname("_D"); |
332 initname.append(sd->mangle()); | 332 initname.append(sd->mangle()); |
333 initname.append("6__initZ"); | 333 initname.append("6__initZ"); |
334 | 334 |
335 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(sd); | 335 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(sd); |
336 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(ts->llvmType->get(), true, _linkage, NULL, initname, gIR->module); | 336 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(gIR->irType[ts].type->get(), true, _linkage, NULL, initname, gIR->module); |
337 gIR->irDsymbol[sd].irStruct->init = initvar; | 337 gIR->irDsymbol[sd].irStruct->init = initvar; |
338 | 338 |
339 gIR->constInitList.push_back(sd); | 339 gIR->constInitList.push_back(sd); |
340 if (sd->getModule() == gIR->dmodule) | 340 if (sd->getModule() == gIR->dmodule) |
341 gIR->defineList.push_back(sd); | 341 gIR->defineList.push_back(sd); |
361 llvm::Constant* finit = DtoConstFieldInitializer(so->var->type, so->var->init); | 361 llvm::Constant* finit = DtoConstFieldInitializer(so->var->type, so->var->init); |
362 so->init = finit; | 362 so->init = finit; |
363 gIR->irDsymbol[so->var].irField->constInit = finit; | 363 gIR->irDsymbol[so->var].irField->constInit = finit; |
364 } | 364 } |
365 | 365 |
366 const llvm::StructType* structtype = isaStruct(sd->type->llvmType->get()); | 366 const llvm::StructType* structtype = isaStruct(gIR->irType[sd->type].type->get()); |
367 | 367 |
368 // go through the field inits and build the default initializer | 368 // go through the field inits and build the default initializer |
369 std::vector<llvm::Constant*> fieldinits_ll; | 369 std::vector<llvm::Constant*> fieldinits_ll; |
370 size_t nfi = irstruct->defaultFields.size(); | 370 size_t nfi = irstruct->defaultFields.size(); |
371 for (size_t i=0; i<nfi; ++i) { | 371 for (size_t i=0; i<nfi; ++i) { |