mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-01 15:40:55 +03:00
[svn r215] fix for empty class vtbl
This commit is contained in:
parent
77b4800c27
commit
94e4a5b5a1
2 changed files with 13 additions and 8 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue