summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index b847219b2fd..91a771e7cfe 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -1378,7 +1378,7 @@ TypeIndex CodeViewDebug::lowerTypeEnum(const DICompositeType *Ty) {
struct llvm::ClassInfo {
struct MemberInfo {
const DIDerivedType *MemberTypeNode;
- unsigned BaseOffset;
+ uint64_t BaseOffset;
};
// [MemberInfo]
typedef std::vector<MemberInfo> MemberList;
@@ -1416,7 +1416,7 @@ void CodeViewDebug::collectMemberInfo(ClassInfo &Info,
// An unnamed member must represent a nested struct or union. Add all the
// indirect fields to the current record.
assert((DDTy->getOffsetInBits() % 8) == 0 && "Unnamed bitfield member!");
- unsigned Offset = DDTy->getOffsetInBits() / 8;
+ uint64_t Offset = DDTy->getOffsetInBits();
const DIType *Ty = DDTy->getBaseType().resolve();
const DICompositeType *DCTy = cast<DICompositeType>(Ty);
ClassInfo NestedInfo = collectClassInfo(DCTy);
@@ -1578,12 +1578,13 @@ CodeViewDebug::lowerRecordFieldList(const DICompositeType *Ty) {
}
// Data member.
- uint64_t MemberOffsetInBits = Member->getOffsetInBits();
+ uint64_t MemberOffsetInBits =
+ Member->getOffsetInBits() + MemberInfo.BaseOffset;
if (Member->isBitField()) {
uint64_t StartBitOffset = MemberOffsetInBits;
if (const auto *CI =
dyn_cast_or_null<ConstantInt>(Member->getStorageOffsetInBits())) {
- MemberOffsetInBits = CI->getZExtValue();
+ MemberOffsetInBits = CI->getZExtValue() + MemberInfo.BaseOffset;
}
StartBitOffset -= MemberOffsetInBits;
MemberBaseType = TypeTable.writeBitField(BitFieldRecord(
OpenPOWER on IntegriCloud