diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp index de2263c..533c554 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp @@ -148,20 +148,21 @@ MCSymbol *DebugHandlerBase::getLabelAfterInsn(const MachineInstr *MI) { /// If this type is derived from a base type then return base type size. uint64_t DebugHandlerBase::getBaseTypeSize(const DIType *Ty) { assert(Ty); - const DIDerivedType *DDTy = dyn_cast<DIDerivedType>(Ty); - if (!DDTy) - return Ty->getSizeInBits(); - unsigned Tag = DDTy->getTag(); + unsigned Tag = Ty->getTag(); if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef && Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_restrict_type && Tag != dwarf::DW_TAG_atomic_type && Tag != dwarf::DW_TAG_immutable_type && Tag != dwarf::DW_TAG_template_alias) - return DDTy->getSizeInBits(); + return Ty->getSizeInBits(); - DIType *BaseType = DDTy->getBaseType(); + DIType *BaseType = nullptr; + if (const DIDerivedType *DDTy = dyn_cast<DIDerivedType>(Ty)) + BaseType = DDTy->getBaseType(); + else if (const DISubrangeType *SRTy = dyn_cast<DISubrangeType>(Ty)) + BaseType = SRTy->getBaseType(); if (!BaseType) return 0; @@ -187,6 +188,12 @@ bool DebugHandlerBase::isUnsignedDIType(const DIType *Ty) { return true; } + if (auto *SRTy = dyn_cast<DISubrangeType>(Ty)) { + Ty = SRTy->getBaseType(); + if (!Ty) + return false; + } + if (auto *CTy = dyn_cast<DICompositeType>(Ty)) { if (CTy->getTag() == dwarf::DW_TAG_enumeration_type) { if (!(Ty = CTy->getBaseType())) |