diff --git a/src/mapleall/maple_ir/include/debug_info.h b/src/mapleall/maple_ir/include/debug_info.h index fd5e6874b747107d4198c2f35aa0be3715889711..757ae2a3f388f670606a3bbeb42f112a88957c32 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 eaf6c0392adec4b161a02f2d0893bd2e17e1fe1d..c84a95e97e307d5196129629befc076a1112fb9f 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); }