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) {