[svn r215] fix for empty class vtbl

This commit is contained in:
Christian Kamm 2008-05-12 21:08:33 +02:00
parent 77b4800c27
commit 94e4a5b5a1
2 changed files with 13 additions and 8 deletions

View file

@ -142,10 +142,12 @@ void DtoResolveClass(ClassDeclaration* cd)
// add base class data fields first // add base class data fields first
LLVM_AddBaseClassData(&cd->baseclasses); LLVM_AddBaseClassData(&cd->baseclasses);
// then add own members // then add own members, if any
for (int k=0; k < cd->members->dim; k++) { if(cd->members) {
Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]); for (int k=0; k < cd->members->dim; k++) {
dsym->toObjFile(); Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]);
dsym->toObjFile();
}
} }
// resolve class data fields (possibly unions) // resolve class data fields (possibly unions)
@ -594,8 +596,7 @@ void DtoConstInitClass(ClassDeclaration* cd)
} }
#if OPAQUE_VTBLS #if OPAQUE_VTBLS
const llvm::ArrayType* svtbl_ty = isaArray(ts->ir.vtblType->get()); const llvm::ArrayType* svtbl_ty = isaArray(ts->ir.vtblType->get());
llvm::Constant* cvtblInit = llvm::ConstantArray::get(svtbl_ty, sinits); cd->ir.irStruct->constVtbl = llvm::ConstantArray::get(svtbl_ty, sinits);
cd->ir.irStruct->constVtbl = llvm::cast<llvm::ConstantArray>(cvtblInit);
#else #else
const llvm::StructType* svtbl_ty = isaStruct(ts->ir.vtblType->get()); const llvm::StructType* svtbl_ty = isaStruct(ts->ir.vtblType->get());
llvm::Constant* cvtblInit = llvm::ConstantStruct::get(svtbl_ty, sinits); llvm::Constant* cvtblInit = llvm::ConstantStruct::get(svtbl_ty, sinits);
@ -1495,7 +1496,11 @@ void DtoDefineClassInfo(ClassDeclaration* cd)
assert(!cd->ir.irStruct->vtbl->getType()->isAbstract()); assert(!cd->ir.irStruct->vtbl->getType()->isAbstract());
c = llvm::ConstantExpr::getBitCast(cd->ir.irStruct->vtbl, byteptrptrty); c = llvm::ConstantExpr::getBitCast(cd->ir.irStruct->vtbl, byteptrptrty);
assert(!cd->ir.irStruct->constVtbl->getType()->isAbstract()); assert(!cd->ir.irStruct->constVtbl->getType()->isAbstract());
size_t vtblsz = cd->ir.irStruct->constVtbl->getType()->getNumElements(); size_t vtblsz = 0;
llvm::ConstantArray* constVtblArray = llvm::dyn_cast<llvm::ConstantArray>(cd->ir.irStruct->constVtbl);
if(constVtblArray) {
vtblsz = constVtblArray->getType()->getNumElements();
}
c = DtoConstSlice(DtoConstSize_t(vtblsz), c); c = DtoConstSlice(DtoConstSize_t(vtblsz), c);
} }
inits.push_back(c); inits.push_back(c);

View file

@ -77,7 +77,7 @@ public:
llvm::GlobalVariable* vtbl; llvm::GlobalVariable* vtbl;
#if OPAQUE_VTBLS #if OPAQUE_VTBLS
llvm::ConstantArray* constVtbl; llvm::Constant* constVtbl;
#else #else
llvm::ConstantStruct* constVtbl; llvm::ConstantStruct* constVtbl;
#endif #endif