From f6cc5ab05291ec545cd89f3ac3fc0179c84a6832 Mon Sep 17 00:00:00 2001 From: fye Date: Thu, 23 Jun 2022 18:21:21 -0700 Subject: [PATCH] debug: type cast on MIRBitFieldType and DW_AT_bit_offset calculation --- src/mapleall/maple_ir/include/debug_info.h | 2 +- src/mapleall/maple_ir/src/debug_info.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/mapleall/maple_ir/include/debug_info.h b/src/mapleall/maple_ir/include/debug_info.h index fd5e6874b7..757ae2a3f3 100644 --- a/src/mapleall/maple_ir/include/debug_info.h +++ b/src/mapleall/maple_ir/include/debug_info.h @@ -699,7 +699,7 @@ class DebugInfo { DBGDie *CreateVarDie(MIRSymbol *sym, GStrIdx strIdx); // use alt name DBGDie *CreateFormalParaDie(MIRFunction *func, MIRType *type, MIRSymbol *sym); DBGDie *CreateFieldDie(maple::FieldPair pair, uint32 lnum); - DBGDie *CreateBitfieldDie(const MIRBitFieldType *type, GStrIdx idx); + DBGDie *CreateBitfieldDie(const MIRBitFieldType *type, GStrIdx idx, uint32 prev_bits); DBGDie *CreateStructTypeDie(GStrIdx strIdx, const MIRStructType *type, bool update = false); DBGDie *CreateClassTypeDie(GStrIdx strIdx, const MIRClassType *type); DBGDie *CreateInterfaceTypeDie(GStrIdx strIdx, const MIRInterfaceType *type); diff --git a/src/mapleall/maple_ir/src/debug_info.cpp b/src/mapleall/maple_ir/src/debug_info.cpp index eaf6c0392a..c84a95e97e 100644 --- a/src/mapleall/maple_ir/src/debug_info.cpp +++ b/src/mapleall/maple_ir/src/debug_info.cpp @@ -849,7 +849,6 @@ DBGDie *DebugInfo::GetOrCreateArrayTypeDie(const MIRArrayType *arraytype) { DBGDie *DebugInfo::CreateFieldDie(maple::FieldPair pair, uint32 lnum) { DBGDie *die = module->GetMemPool()->New(module, DW_TAG_member); - die->AddAttr(DW_AT_name, DW_FORM_strp, pair.first.GetIdx()); die->AddAttr(DW_AT_decl_file, DW_FORM_data4, mplSrcIdx.GetIdx()); die->AddAttr(DW_AT_decl_line, DW_FORM_data4, lnum); @@ -865,7 +864,7 @@ DBGDie *DebugInfo::CreateFieldDie(maple::FieldPair pair, uint32 lnum) { return die; } -DBGDie *DebugInfo::CreateBitfieldDie(const MIRBitFieldType *type, GStrIdx sidx) { +DBGDie *DebugInfo::CreateBitfieldDie(const MIRBitFieldType *type, GStrIdx sidx, uint32 prev_bits) { DBGDie *die = module->GetMemPool()->New(module, DW_TAG_member); die->AddAttr(DW_AT_name, DW_FORM_strp, sidx.GetIdx()); @@ -879,7 +878,7 @@ DBGDie *DebugInfo::CreateBitfieldDie(const MIRBitFieldType *type, GStrIdx sidx) die->AddAttr(DW_AT_byte_size, DW_FORM_data4, GetPrimTypeSize(type->GetPrimType())); die->AddAttr(DW_AT_bit_size, DW_FORM_data4, type->GetFieldSize()); die->AddAttr(DW_AT_bit_offset, DW_FORM_data4, - GetPrimTypeSize(type->GetPrimType()) * k8BitSize - type->GetFieldSize()); + GetPrimTypeSize(type->GetPrimType()) * k8BitSize - type->GetFieldSize() - prev_bits); die->AddAttr(DW_AT_data_member_location, DW_FORM_data4, 0); return die; @@ -957,13 +956,16 @@ DBGDie *DebugInfo::CreateStructTypeDie(GStrIdx strIdx, const MIRStructType *stru PushParentDie(die); // fields + uint32 prev_bits = 0; for (size_t i = 0; i < structtype->GetFieldsSize(); i++) { MIRType *ety = structtype->GetElemType(static_cast(i)); FieldPair fp = structtype->GetFieldsElemt(i); - if (MIRBitFieldType *bfty = static_cast(ety)) { - DBGDie *bfdie = CreateBitfieldDie(bfty, fp.first); + if (MIRBitFieldType *bfty = dynamic_cast(ety)) { + DBGDie *bfdie = CreateBitfieldDie(bfty, fp.first, prev_bits); + prev_bits += bfty->GetFieldSize(); die->AddSubVec(bfdie); } else { + prev_bits = 0; DBGDie *fdie = CreateFieldDie(fp, 0); die->AddSubVec(fdie); } -- Gitee