Changeset 803:c62c6936635b
- Timestamp:
- 11/29/08 15:26:50 (1 month ago)
- Files:
-
- gen/classes.cpp (modified) (1 diff)
- gen/llvmhelpers.cpp (modified) (2 diffs)
- gen/llvmhelpers.h (modified) (1 diff)
- gen/structs.cpp (modified) (2 diffs)
- ir/irstruct.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
gen/classes.cpp
r802 r803 486 486 // and build its constant initializer lazily 487 487 if (!var->ir.irField->constInit) 488 var->ir.irField->constInit = DtoConst FieldInitializer(var->loc, var->type, var->init);488 var->ir.irField->constInit = DtoConstInitializer(var->loc, var->type, var->init); 489 489 inits.push_back(var->ir.irField->constInit); 490 490 gen/llvmhelpers.cpp
r798 r803 1429 1429 ////////////////////////////////////////////////////////////////////////////////////////// 1430 1430 1431 LLConstant* DtoConstFieldInitializer(Loc loc, Type* t, Initializer* init)1432 {1433 Logger::println("DtoConstFieldInitializer");1434 LOG_SCOPE;1435 1436 const LLType* _type = DtoType(t);1437 1438 LLConstant* _init = DtoConstInitializer(loc, t, init);1439 assert(_init);1440 if (_type != _init->getType())1441 {1442 if (Logger::enabled())1443 Logger::cout() << "field init is: " << *_init << " type should be " << *_type << '\n';1444 if (t->ty == Tsarray)1445 {1446 const LLArrayType* arrty = isaArray(_type);1447 uint64_t n = arrty->getNumElements();1448 std::vector<LLConstant*> vals(n,_init);1449 _init = llvm::ConstantArray::get(arrty, vals);1450 }1451 else if (t->ty == Tarray)1452 {1453 assert(isaStruct(_type));1454 _init = llvm::ConstantAggregateZero::get(_type);1455 }1456 else if (t->ty == Tstruct)1457 {1458 const LLStructType* structty = isaStruct(_type);1459 TypeStruct* ts = (TypeStruct*)t;1460 assert(ts);1461 assert(ts->sym);1462 assert(ts->sym->ir.irStruct->constInit);1463 _init = ts->sym->ir.irStruct->constInit;1464 }1465 else if (t->ty == Tclass)1466 {1467 _init = llvm::Constant::getNullValue(_type);1468 }1469 else {1470 Logger::println("failed for type %s", t->toChars());1471 assert(0);1472 }1473 }1474 1475 return _init;1476 }1477 1478 //////////////////////////////////////////////////////////////////////////////////////////1479 1480 1431 DValue* DtoInitializer(LLValue* target, Initializer* init) 1481 1432 { … … 1538 1489 1539 1490 LLSmallVector<size_t, 4> dims; 1540 1541 // handle zero initializers1542 if (expbase->isintegral() && exp->isConst())1543 {1544 if (!exp->toInteger())1545 return LLConstant::getNullValue(dstTy);1546 }1547 else if (exp->op == TOKnull)1548 {1549 return LLConstant::getNullValue(dstTy);1550 }1551 1491 1552 1492 while(1) gen/llvmhelpers.h
r797 r803 88 88 // initializer helpers 89 89 LLConstant* DtoConstInitializer(Loc loc, Type* type, Initializer* init); 90 LLConstant* DtoConstFieldInitializer(Loc loc, Type* type, Initializer* init);91 90 LLConstant* DtoConstExpInit(Loc loc, Type* t, Expression* exp); 92 91 DValue* DtoInitializer(LLValue* target, Initializer* init); gen/structs.cpp
r802 r803 209 209 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset); 210 210 if (!nextdef->ir.irField->constInit) 211 nextdef->ir.irField->constInit = DtoConst FieldInitializer(nextdef->loc, nextdef->type, nextdef->init);211 nextdef->ir.irField->constInit = DtoConstInitializer(nextdef->loc, nextdef->type, nextdef->init); 212 212 LLConstant* c = nextdef->ir.irField->constInit; 213 213 inits.push_back(c); … … 264 264 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset); 265 265 if (!nextdef->ir.irField->constInit) 266 nextdef->ir.irField->constInit = DtoConst FieldInitializer(nextdef->loc, nextdef->type, nextdef->init);266 nextdef->ir.irField->constInit = DtoConstInitializer(nextdef->loc, nextdef->type, nextdef->init); 267 267 LLConstant* c = nextdef->ir.irField->constInit; 268 268 inits.push_back(c); ir/irstruct.cpp
r802 r803 320 320 // lazily default initialize 321 321 if (!var->ir.irField->constInit) 322 var->ir.irField->constInit = DtoConst FieldInitializer(var->loc, var->type, var->init);322 var->ir.irField->constInit = DtoConstInitializer(var->loc, var->type, var->init); 323 323 inits.push_back(var->ir.irField->constInit); 324 324

