Mercurial > projects > ldc
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 |