Implement IsOverriderUsed. This can't be tested yet due to some other bugs :)

llvm-svn: 96897
This commit is contained in:
Anders Carlsson 2010-02-23 06:34:44 +00:00
parent 0c0baa91a4
commit 8939e400b6
1 changed files with 46 additions and 1 deletions

View File

@ -1288,9 +1288,54 @@ VtableBuilder::IsOverriderUsed(BaseSubobject Base,
// If the base and the first base in the primary base chain have the same
// offsets, then this overrider will be used.
if (Base.getBaseOffset() == FirstBaseInPrimaryBaseChain.getBaseOffset())
return true;
// We know now that Base (or a direct or indirect base of it) is a primary
// base in part of the class hierarchy, but not a primary base in the most
// derived class.
// If the overrider is the first base in the primary base chain, we know
// that the overrider will be used.
if (Overrider.Method->getParent() == FirstBaseInPrimaryBaseChain.getBase())
return true;
return true;
VtableBuilder::PrimaryBasesSetTy PrimaryBases;
const CXXRecordDecl *RD = FirstBaseInPrimaryBaseChain.getBase();
PrimaryBases.insert(RD);
// Now traverse the base chain, starting with the first base, until we find
// the base that is no longer a primary base.
while (true) {
const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
if (!PrimaryBase)
break;
if (Layout.getPrimaryBaseWasVirtual()) {
assert(Layout.getVBaseClassOffset(PrimaryBase) == 0 &&
"Primary base should always be at offset 0!");
const ASTRecordLayout &MostDerivedClassLayout =
Context.getASTRecordLayout(MostDerivedClass);
// Now check if this is the primary base that is not a primary base in the
// most derived class.
if (MostDerivedClassLayout.getVBaseClassOffset(PrimaryBase) !=
FirstBaseInPrimaryBaseChain.getBaseOffset()) {
// We found it, stop walking the chain.
break;
}
} else {
assert(Layout.getBaseClassOffset(PrimaryBase) == 0 &&
"Primary base should always be at offset 0!");
}
}
// If the final overrider is an override of one of the primary bases,
// then we know that it will be used.
return OverridesMethodInPrimaryBase(Overrider.Method, PrimaryBases);
}
void