зеркало из https://github.com/microsoft/clang-1.git
Improve vcall offset handling.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97174 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
bf554f63bf
Коммит
dba6ef87a0
|
@ -804,8 +804,8 @@ public:
|
||||||
/// vtable address point) for the given virtual member function.
|
/// vtable address point) for the given virtual member function.
|
||||||
int64_t getVCallOffsetOffset(const CXXMethodDecl *MD);
|
int64_t getVCallOffsetOffset(const CXXMethodDecl *MD);
|
||||||
|
|
||||||
/// clear - Clear the offset map.
|
// empty - Return whether the offset map is empty or not.
|
||||||
void clear() { Offsets.clear(); }
|
bool empty() const { return Offsets.empty(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
bool VCallOffsetMap::MethodsCanShareVCallOffset(const CXXMethodDecl *LHS,
|
bool VCallOffsetMap::MethodsCanShareVCallOffset(const CXXMethodDecl *LHS,
|
||||||
|
@ -905,7 +905,6 @@ public:
|
||||||
const_iterator components_begin() const { return Components.rbegin(); }
|
const_iterator components_begin() const { return Components.rbegin(); }
|
||||||
const_iterator components_end() const { return Components.rend(); }
|
const_iterator components_end() const { return Components.rend(); }
|
||||||
|
|
||||||
/// FIXME: Get rid of this getter.
|
|
||||||
const VCallOffsetMap& getVCallOffsets() const { return VCallOffsets; }
|
const VCallOffsetMap& getVCallOffsets() const { return VCallOffsets; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1092,8 +1091,9 @@ private:
|
||||||
/// FinalOverriders - The final overriders of the most derived class.
|
/// FinalOverriders - The final overriders of the most derived class.
|
||||||
const FinalOverriders Overriders;
|
const FinalOverriders Overriders;
|
||||||
|
|
||||||
/// VCallOffsets - Keeps track of vcall offsets for the current vtable.
|
/// VCallOffsetsForVBases - Keeps track of vcall offsets for the virtual
|
||||||
VCallOffsetMap VCallOffsets;
|
/// bases in this vtable.
|
||||||
|
llvm::DenseMap<const CXXRecordDecl *, VCallOffsetMap> VCallOffsetsForVBases;
|
||||||
|
|
||||||
/// Components - The components of the vtable being built.
|
/// Components - The components of the vtable being built.
|
||||||
llvm::SmallVector<VtableComponent, 64> Components;
|
llvm::SmallVector<VtableComponent, 64> Components;
|
||||||
|
@ -1267,7 +1267,19 @@ VtableBuilder::ComputeThisAdjustment(const CXXMethodDecl *MD,
|
||||||
|
|
||||||
if (!Offset.isEmpty()) {
|
if (!Offset.isEmpty()) {
|
||||||
if (Offset.VirtualBase) {
|
if (Offset.VirtualBase) {
|
||||||
// Get the vcall offset offset.
|
// Get the vcall offset map for this virtual base.
|
||||||
|
VCallOffsetMap &VCallOffsets = VCallOffsetsForVBases[Offset.VirtualBase];
|
||||||
|
|
||||||
|
if (VCallOffsets.empty()) {
|
||||||
|
// We don't have vcall offsets for this virtual base, go ahead and
|
||||||
|
// build them.
|
||||||
|
VCallAndVBaseOffsetBuilder Builder(MostDerivedClass, 0,
|
||||||
|
BaseSubobject(Offset.VirtualBase, 0),
|
||||||
|
/*BaseIsVirtual=*/true);
|
||||||
|
|
||||||
|
VCallOffsets = Builder.getVCallOffsets();
|
||||||
|
}
|
||||||
|
|
||||||
Adjustment.VCallOffsetOffset = VCallOffsets.getVCallOffsetOffset(MD);
|
Adjustment.VCallOffsetOffset = VCallOffsets.getVCallOffsetOffset(MD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1478,9 +1490,14 @@ void VtableBuilder::LayoutPrimaryAndAndSecondaryVtables(BaseSubobject Base,
|
||||||
Base, BaseIsVirtual);
|
Base, BaseIsVirtual);
|
||||||
Components.append(Builder.components_begin(), Builder.components_end());
|
Components.append(Builder.components_begin(), Builder.components_end());
|
||||||
|
|
||||||
// FIXME: This is not how we should do vcall offsets.
|
// Check if we need to add these vcall offsets.
|
||||||
VCallOffsets = Builder.getVCallOffsets();
|
if (BaseIsVirtual && !Builder.getVCallOffsets().empty()) {
|
||||||
|
VCallOffsetMap &VCallOffsets = VCallOffsetsForVBases[Base.getBase()];
|
||||||
|
|
||||||
|
if (VCallOffsets.empty())
|
||||||
|
VCallOffsets = Builder.getVCallOffsets();
|
||||||
|
}
|
||||||
|
|
||||||
// Add the offset to top.
|
// Add the offset to top.
|
||||||
// FIXME: This is not going to be right for construction vtables.
|
// FIXME: This is not going to be right for construction vtables.
|
||||||
// FIXME: We should not use / 8 here.
|
// FIXME: We should not use / 8 here.
|
||||||
|
@ -1510,9 +1527,6 @@ void VtableBuilder::LayoutPrimaryAndAndSecondaryVtables(BaseSubobject Base,
|
||||||
AddressPoints.insert(std::make_pair(PrimaryBase, AddressPoint));
|
AddressPoints.insert(std::make_pair(PrimaryBase, AddressPoint));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear the vcall offsets.
|
|
||||||
VCallOffsets.clear();
|
|
||||||
|
|
||||||
// Layout secondary vtables.
|
// Layout secondary vtables.
|
||||||
LayoutSecondaryVtables(Base);
|
LayoutSecondaryVtables(Base);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче