From 2788a2a0f1ff0ff0bb1f86eaffd720594881d63e Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Mon, 1 Dec 2008 18:34:02 +0100 Subject: [PATCH] Made ClassInfo.interfaces generation consistent with DMD, fixes #134 Removed unneeded includes from dmd/attrib.c --- dmd/attrib.c | 1 - dmd2/attrib.c | 1 - gen/classes.cpp | 18 +++++++++++++++--- ir/irstruct.h | 2 ++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/dmd/attrib.c b/dmd/attrib.c index df556b54..a748bf18 100644 --- a/dmd/attrib.c +++ b/dmd/attrib.c @@ -32,7 +32,6 @@ #include "template.h" #include "../gen/enums.h" -#include "../gen/logger.h" extern void obj_includelib(const char *name); void obj_startaddress(Symbol *s); diff --git a/dmd2/attrib.c b/dmd2/attrib.c index 29a4a478..137a999f 100644 --- a/dmd2/attrib.c +++ b/dmd2/attrib.c @@ -32,7 +32,6 @@ #include "template.h" #include "../gen/enums.h" -#include "../gen/logger.h" extern void obj_includelib(const char *name); void obj_startaddress(Symbol *s); diff --git a/gen/classes.cpp b/gen/classes.cpp index 85e94c58..071195dd 100644 --- a/gen/classes.cpp +++ b/gen/classes.cpp @@ -51,9 +51,14 @@ static void add_interface(ClassDeclaration* target, BaseClass* b, int newinstanc irstruct->interfaceMap[b->base] = iri; else irstruct->interfaceMap.insert(std::make_pair(b->base, iri)); + // add to ordered list irstruct->interfaceVec.push_back(iri); + // add to classinfo interfaces + if (newinstance) + irstruct->classInfoInterfaces.push_back(iri); + // assign this iri to all base interfaces of this one for (unsigned j = 0; j < b->baseInterfaces_dim; j++) { @@ -148,6 +153,7 @@ static void DtoResolveInterface(InterfaceDeclaration* cd) // add to interfaceInfos IrInterface* iri = new IrInterface(bc); irstruct->interfaceVec.push_back(iri); + irstruct->classInfoInterfaces.push_back(iri); } } @@ -378,7 +384,6 @@ void DtoDeclareClass(ClassDeclaration* cd) // interface vtables unsigned idx = 0; - for (IrStruct::InterfaceVectorIter i=irstruct->interfaceVec.begin(); i!=irstruct->interfaceVec.end(); ++i) { IrInterface* iri = *i; @@ -392,7 +397,7 @@ void DtoDeclareClass(ClassDeclaration* cd) iri->vtbl = new llvm::GlobalVariable(iri->vtblInitTy.get(), true, _linkage, 0, nam, gIR->module); - // always create interfaceinfos + // always set the interface info as it's need as the first vtbl entry LLConstant* idxs[2] = {DtoConstUint(0), DtoConstUint(idx)}; iri->info = llvm::ConstantExpr::getGetElementPtr(irstruct->interfaceInfos, idxs, 2); idx++; @@ -1506,8 +1511,15 @@ void DtoDefineClassInfo(ClassDeclaration* cd) c = LLConstant::getNullValue(intersTy); else { const LLType* t = intersTy->getContainedType(1); // .ptr + // cast to Interface* c = DtoBitCast(ir->interfaceInfos, t); - size_t iisz = ir->interfaceVec.size(); + size_t isz = ir->interfaceVec.size(); + size_t iisz = ir->classInfoInterfaces.size(); + assert(iisz <= isz); + // offset - we only want the 'iisz' last ones + LLConstant* idx = DtoConstUint(isz - iisz); + c = llvm::ConstantExpr::getGetElementPtr(c, &idx, 1); + // make array c = DtoConstSlice(DtoConstSize_t(iisz), c); } inits.push_back(c); diff --git a/ir/irstruct.h b/ir/irstruct.h index eca25a25..c23ba654 100644 --- a/ir/irstruct.h +++ b/ir/irstruct.h @@ -142,6 +142,8 @@ struct IrStruct : IrBase LLConstant* constClassInfo; bool classInfoDeclared; bool classInfoDefined; + // vector of interfaces that should be put in ClassInfo.interfaces + InterfaceVector classInfoInterfaces; // align(1) struct S { ... } bool packed;