зеркало из https://github.com/microsoft/clang-1.git
[Reapply r128776, modified so that it does not break debug info.]
Change the return type of CodeGenVTables::getVirtualBaseOffsetOffset() to CharUnits. No change in functionality intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129072 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
737d5447b5
Коммит
14c65ca4cd
|
@ -1317,11 +1317,12 @@ CodeGenFunction::GetVirtualBaseClassOffset(llvm::Value *This,
|
|||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl) {
|
||||
llvm::Value *VTablePtr = GetVTablePtr(This, Int8PtrTy);
|
||||
int64_t VBaseOffsetOffset =
|
||||
CharUnits VBaseOffsetOffset =
|
||||
CGM.getVTables().getVirtualBaseOffsetOffset(ClassDecl, BaseClassDecl);
|
||||
|
||||
llvm::Value *VBaseOffsetPtr =
|
||||
Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset, "vbase.offset.ptr");
|
||||
Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
|
||||
"vbase.offset.ptr");
|
||||
const llvm::Type *PtrDiffTy =
|
||||
ConvertType(getContext().getPointerDiffType());
|
||||
|
||||
|
|
|
@ -814,10 +814,13 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit,
|
|||
if (BI->isVirtual()) {
|
||||
// virtual base offset offset is -ve. The code generator emits dwarf
|
||||
// expression where it expects +ve number.
|
||||
BaseOffset = 0 - CGM.getVTables().getVirtualBaseOffsetOffset(RD, Base);
|
||||
BaseOffset =
|
||||
0 - CGM.getVTables().getVirtualBaseOffsetOffset(RD, Base).getQuantity();
|
||||
BFlags = llvm::DIDescriptor::FlagVirtual;
|
||||
} else
|
||||
BaseOffset = RL.getBaseClassOffsetInBits(Base);
|
||||
// FIXME: Inconsistent units for BaseOffset. It is in bytes when
|
||||
// BI->isVirtual() and bits when not.
|
||||
|
||||
AccessSpecifier Access = BI->getAccessSpecifier();
|
||||
if (Access == clang::AS_private)
|
||||
|
|
|
@ -878,7 +878,8 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
|
|||
// subobject. For a virtual base, this is the offset in the virtual table of
|
||||
// the virtual base offset for the virtual base referenced (negative).
|
||||
if (Base->isVirtual())
|
||||
OffsetFlags = CGM.getVTables().getVirtualBaseOffsetOffset(RD, BaseDecl);
|
||||
OffsetFlags =
|
||||
CGM.getVTables().getVirtualBaseOffsetOffset(RD, BaseDecl).getQuantity();
|
||||
else {
|
||||
const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
|
||||
OffsetFlags = Layout.getBaseClassOffsetInBits(BaseDecl) / 8;
|
||||
|
|
|
@ -1339,7 +1339,7 @@ ReturnAdjustment VTableBuilder::ComputeReturnAdjustment(BaseOffset Offset) {
|
|||
} else {
|
||||
Adjustment.VBaseOffsetOffset =
|
||||
VTables.getVirtualBaseOffsetOffset(Offset.DerivedClass,
|
||||
Offset.VirtualBase);
|
||||
Offset.VirtualBase).getQuantity();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2431,14 +2431,15 @@ uint64_t CodeGenVTables::getMethodVTableIndex(GlobalDecl GD) {
|
|||
return I->second;
|
||||
}
|
||||
|
||||
int64_t CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
|
||||
const CXXRecordDecl *VBase) {
|
||||
CharUnits
|
||||
CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
|
||||
const CXXRecordDecl *VBase) {
|
||||
ClassPairTy ClassPair(RD, VBase);
|
||||
|
||||
VirtualBaseClassOffsetOffsetsMapTy::iterator I =
|
||||
VirtualBaseClassOffsetOffsets.find(ClassPair);
|
||||
if (I != VirtualBaseClassOffsetOffsets.end())
|
||||
return I->second.getQuantity();
|
||||
return I->second;
|
||||
|
||||
VCallAndVBaseOffsetBuilder Builder(RD, RD, /*FinalOverriders=*/0,
|
||||
BaseSubobject(RD, CharUnits::Zero()),
|
||||
|
@ -2458,7 +2459,7 @@ int64_t CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
|
|||
I = VirtualBaseClassOffsetOffsets.find(ClassPair);
|
||||
assert(I != VirtualBaseClassOffsetOffsets.end() && "Did not find index!");
|
||||
|
||||
return I->second.getQuantity();
|
||||
return I->second;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
|
|
|
@ -235,13 +235,13 @@ public:
|
|||
/// stored.
|
||||
uint64_t getMethodVTableIndex(GlobalDecl GD);
|
||||
|
||||
/// getVirtualBaseOffsetOffset - Return the offset in bytes (relative to the
|
||||
/// getVirtualBaseOffsetOffset - Return the offset in chars (relative to the
|
||||
/// vtable address point) where the offset of the virtual base that contains
|
||||
/// the given base is stored, otherwise, if no virtual base contains the given
|
||||
/// class, return 0. Base must be a virtual base class or an unambigious
|
||||
/// base.
|
||||
int64_t getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
|
||||
const CXXRecordDecl *VBase);
|
||||
CharUnits getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
|
||||
const CXXRecordDecl *VBase);
|
||||
|
||||
/// getAddressPoint - Get the address point of the given subobject in the
|
||||
/// class decl.
|
||||
|
|
Загрузка…
Ссылка в новой задаче