comparison gen/classes.cpp @ 199:ba47ac346ddd trunk

[svn r215] fix for empty class vtbl
author ChristianK
date Mon, 12 May 2008 21:08:33 +0200
parents aca17e55b7a5
children 8f9191180c7a
comparison
equal deleted inserted replaced
198:17dc52256c58 199:ba47ac346ddd
140 fieldtypes.push_back(getVoidPtrType()); 140 fieldtypes.push_back(getVoidPtrType());
141 141
142 // add base class data fields first 142 // add base class data fields first
143 LLVM_AddBaseClassData(&cd->baseclasses); 143 LLVM_AddBaseClassData(&cd->baseclasses);
144 144
145 // then add own members 145 // then add own members, if any
146 for (int k=0; k < cd->members->dim; k++) { 146 if(cd->members) {
147 Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]); 147 for (int k=0; k < cd->members->dim; k++) {
148 dsym->toObjFile(); 148 Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]);
149 dsym->toObjFile();
150 }
149 } 151 }
150 152
151 // resolve class data fields (possibly unions) 153 // resolve class data fields (possibly unions)
152 Logger::println("doing class fields"); 154 Logger::println("doing class fields");
153 155
592 c = llvm::ConstantExpr::getBitCast(c, targetTy); 594 c = llvm::ConstantExpr::getBitCast(c, targetTy);
593 sinits.push_back(c); 595 sinits.push_back(c);
594 } 596 }
595 #if OPAQUE_VTBLS 597 #if OPAQUE_VTBLS
596 const llvm::ArrayType* svtbl_ty = isaArray(ts->ir.vtblType->get()); 598 const llvm::ArrayType* svtbl_ty = isaArray(ts->ir.vtblType->get());
597 llvm::Constant* cvtblInit = llvm::ConstantArray::get(svtbl_ty, sinits); 599 cd->ir.irStruct->constVtbl = llvm::ConstantArray::get(svtbl_ty, sinits);
598 cd->ir.irStruct->constVtbl = llvm::cast<llvm::ConstantArray>(cvtblInit);
599 #else 600 #else
600 const llvm::StructType* svtbl_ty = isaStruct(ts->ir.vtblType->get()); 601 const llvm::StructType* svtbl_ty = isaStruct(ts->ir.vtblType->get());
601 llvm::Constant* cvtblInit = llvm::ConstantStruct::get(svtbl_ty, sinits); 602 llvm::Constant* cvtblInit = llvm::ConstantStruct::get(svtbl_ty, sinits);
602 cd->ir.irStruct->constVtbl = llvm::cast<llvm::ConstantStruct>(cvtblInit); 603 cd->ir.irStruct->constVtbl = llvm::cast<llvm::ConstantStruct>(cvtblInit);
603 #endif 604 #endif
1493 else { 1494 else {
1494 const llvm::Type* byteptrptrty = getPtrToType(byteptrty); 1495 const llvm::Type* byteptrptrty = getPtrToType(byteptrty);
1495 assert(!cd->ir.irStruct->vtbl->getType()->isAbstract()); 1496 assert(!cd->ir.irStruct->vtbl->getType()->isAbstract());
1496 c = llvm::ConstantExpr::getBitCast(cd->ir.irStruct->vtbl, byteptrptrty); 1497 c = llvm::ConstantExpr::getBitCast(cd->ir.irStruct->vtbl, byteptrptrty);
1497 assert(!cd->ir.irStruct->constVtbl->getType()->isAbstract()); 1498 assert(!cd->ir.irStruct->constVtbl->getType()->isAbstract());
1498 size_t vtblsz = cd->ir.irStruct->constVtbl->getType()->getNumElements(); 1499 size_t vtblsz = 0;
1500 llvm::ConstantArray* constVtblArray = llvm::dyn_cast<llvm::ConstantArray>(cd->ir.irStruct->constVtbl);
1501 if(constVtblArray) {
1502 vtblsz = constVtblArray->getType()->getNumElements();
1503 }
1499 c = DtoConstSlice(DtoConstSize_t(vtblsz), c); 1504 c = DtoConstSlice(DtoConstSize_t(vtblsz), c);
1500 } 1505 }
1501 inits.push_back(c); 1506 inits.push_back(c);
1502 1507
1503 // interfaces array 1508 // interfaces array