bool DWARFCompileUnit::extractRangeList(uint32_t RangeListOffset, DWARFDebugRangeList &RangeList) const { // Require that compile unit is extracted. assert(DieArray.size() > 0); DataExtractor RangesData(RangeSection, isLittleEndian, AddrSize); return RangeList.extract(RangesData, &RangeListOffset); }
bool DWARFUnit::extractRangeList(uint32_t RangeListOffset, DWARFDebugRangeList &RangeList) const { // Require that compile unit is extracted. assert(!DieArray.empty()); DataExtractor RangesData(RangeSection, isLittleEndian, AddrSize); uint32_t ActualRangeListOffset = RangeSectionBase + RangeListOffset; return RangeList.extract(RangesData, &ActualRangeListOffset); }
Error DWARFUnit::extractRangeList(uint32_t RangeListOffset, DWARFDebugRangeList &RangeList) const { // Require that compile unit is extracted. assert(!DieArray.empty()); DWARFDataExtractor RangesData(Context.getDWARFObj(), *RangeSection, isLittleEndian, getAddressByteSize()); uint32_t ActualRangeListOffset = RangeSectionBase + RangeListOffset; return RangeList.extract(RangesData, &ActualRangeListOffset); }
void DWARFContext::dump(raw_ostream &OS) { OS << ".debug_abbrev contents:\n"; getDebugAbbrev()->dump(OS); OS << "\n.debug_info contents:\n"; for (unsigned i = 0, e = getNumCompileUnits(); i != e; ++i) getCompileUnitAtIndex(i)->dump(OS); OS << "\n.debug_aranges contents:\n"; DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0); uint32_t offset = 0; DWARFDebugArangeSet set; while (set.extract(arangesData, &offset)) set.dump(OS); uint8_t savedAddressByteSize = 0; OS << "\n.debug_lines contents:\n"; for (unsigned i = 0, e = getNumCompileUnits(); i != e; ++i) { DWARFCompileUnit *cu = getCompileUnitAtIndex(i); savedAddressByteSize = cu->getAddressByteSize(); unsigned stmtOffset = cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_stmt_list, -1U); if (stmtOffset != -1U) { DataExtractor lineData(getLineSection(), isLittleEndian(), savedAddressByteSize); DWARFDebugLine::DumpingState state(OS); DWARFDebugLine::parseStatementTable(lineData, &stmtOffset, state); } } OS << "\n.debug_str contents:\n"; DataExtractor strData(getStringSection(), isLittleEndian(), 0); offset = 0; uint32_t lastOffset = 0; while (const char *s = strData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", lastOffset, s); lastOffset = offset; } OS << "\n.debug_ranges contents:\n"; // In fact, different compile units may have different address byte // sizes, but for simplicity we just use the address byte size of the last // compile unit (there is no easy and fast way to associate address range // list and the compile unit it describes). DataExtractor rangesData(getRangeSection(), isLittleEndian(), savedAddressByteSize); offset = 0; DWARFDebugRangeList rangeList; while (rangeList.extract(rangesData, &offset)) rangeList.dump(OS); }
void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) { if (DumpType == DIDT_All || DumpType == DIDT_Abbrev) { OS << ".debug_abbrev contents:\n"; getDebugAbbrev()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_AbbrevDwo) if (const DWARFDebugAbbrev *D = getDebugAbbrevDWO()) { OS << "\n.debug_abbrev.dwo contents:\n"; D->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Info) { OS << "\n.debug_info contents:\n"; for (const auto &CU : compile_units()) CU->dump(OS); } if ((DumpType == DIDT_All || DumpType == DIDT_InfoDwo) && getNumDWOCompileUnits()) { OS << "\n.debug_info.dwo contents:\n"; for (const auto &DWOCU : dwo_compile_units()) DWOCU->dump(OS); } if ((DumpType == DIDT_All || DumpType == DIDT_Types) && getNumTypeUnits()) { OS << "\n.debug_types contents:\n"; for (const auto &TU : type_units()) TU->dump(OS); } if ((DumpType == DIDT_All || DumpType == DIDT_TypesDwo) && getNumDWOTypeUnits()) { OS << "\n.debug_types.dwo contents:\n"; for (const auto &DWOTU : dwo_type_units()) DWOTU->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Loc) { OS << "\n.debug_loc contents:\n"; getDebugLoc()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_LocDwo) { OS << "\n.debug_loc.dwo contents:\n"; getDebugLocDWO()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Frames) { OS << "\n.debug_frame contents:\n"; getDebugFrame()->dump(OS); } uint32_t offset = 0; if (DumpType == DIDT_All || DumpType == DIDT_Aranges) { OS << "\n.debug_aranges contents:\n"; DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0); DWARFDebugArangeSet set; while (set.extract(arangesData, &offset)) set.dump(OS); } uint8_t savedAddressByteSize = 0; if (DumpType == DIDT_All || DumpType == DIDT_Line) { OS << "\n.debug_line contents:\n"; for (const auto &CU : compile_units()) { savedAddressByteSize = CU->getAddressByteSize(); unsigned stmtOffset = CU->getCompileUnitDIE()->getAttributeValueAsSectionOffset( CU.get(), DW_AT_stmt_list, -1U); if (stmtOffset != -1U) { DataExtractor lineData(getLineSection().Data, isLittleEndian(), savedAddressByteSize); DWARFDebugLine::LineTable LineTable; LineTable.parse(lineData, &getLineSection().Relocs, &stmtOffset); LineTable.dump(OS); } } } if (DumpType == DIDT_All || DumpType == DIDT_LineDwo) { OS << "\n.debug_line.dwo contents:\n"; unsigned stmtOffset = 0; DataExtractor lineData(getLineDWOSection().Data, isLittleEndian(), savedAddressByteSize); DWARFDebugLine::LineTable LineTable; while (LineTable.Prologue.parse(lineData, &stmtOffset)) { LineTable.dump(OS); LineTable.clear(); } } if (DumpType == DIDT_All || DumpType == DIDT_Str) { OS << "\n.debug_str contents:\n"; DataExtractor strData(getStringSection(), isLittleEndian(), 0); offset = 0; uint32_t strOffset = 0; while (const char *s = strData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strOffset, s); strOffset = offset; } } if ((DumpType == DIDT_All || DumpType == DIDT_StrDwo) && !getStringDWOSection().empty()) { OS << "\n.debug_str.dwo contents:\n"; DataExtractor strDWOData(getStringDWOSection(), isLittleEndian(), 0); offset = 0; uint32_t strDWOOffset = 0; while (const char *s = strDWOData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strDWOOffset, s); strDWOOffset = offset; } } if (DumpType == DIDT_All || DumpType == DIDT_Ranges) { OS << "\n.debug_ranges contents:\n"; // In fact, different compile units may have different address byte // sizes, but for simplicity we just use the address byte size of the last // compile unit (there is no easy and fast way to associate address range // list and the compile unit it describes). DataExtractor rangesData(getRangeSection(), isLittleEndian(), savedAddressByteSize); offset = 0; DWARFDebugRangeList rangeList; while (rangeList.extract(rangesData, &offset)) rangeList.dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Pubnames) dumpPubSection(OS, "debug_pubnames", getPubNamesSection(), isLittleEndian(), false); if (DumpType == DIDT_All || DumpType == DIDT_Pubtypes) dumpPubSection(OS, "debug_pubtypes", getPubTypesSection(), isLittleEndian(), false); if (DumpType == DIDT_All || DumpType == DIDT_GnuPubnames) dumpPubSection(OS, "debug_gnu_pubnames", getGnuPubNamesSection(), isLittleEndian(), true /* GnuStyle */); if (DumpType == DIDT_All || DumpType == DIDT_GnuPubtypes) dumpPubSection(OS, "debug_gnu_pubtypes", getGnuPubTypesSection(), isLittleEndian(), true /* GnuStyle */); if ((DumpType == DIDT_All || DumpType == DIDT_StrOffsetsDwo) && !getStringOffsetDWOSection().empty()) { OS << "\n.debug_str_offsets.dwo contents:\n"; DataExtractor strOffsetExt(getStringOffsetDWOSection(), isLittleEndian(), 0); offset = 0; uint64_t size = getStringOffsetDWOSection().size(); while (offset < size) { OS << format("0x%8.8x: ", offset); OS << format("%8.8x\n", strOffsetExt.getU32(&offset)); } } }
void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) { if (DumpType == DIDT_All || DumpType == DIDT_Abbrev) { OS << ".debug_abbrev contents:\n"; getDebugAbbrev()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Info) { OS << "\n.debug_info contents:\n"; for (unsigned i = 0, e = getNumCompileUnits(); i != e; ++i) getCompileUnitAtIndex(i)->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Frames) { OS << "\n.debug_frame contents:\n"; getDebugFrame()->dump(OS); } uint32_t offset = 0; if (DumpType == DIDT_All || DumpType == DIDT_Aranges) { OS << "\n.debug_aranges contents:\n"; DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0); DWARFDebugArangeSet set; while (set.extract(arangesData, &offset)) set.dump(OS); } uint8_t savedAddressByteSize = 0; if (DumpType == DIDT_All || DumpType == DIDT_Line) { OS << "\n.debug_line contents:\n"; for (unsigned i = 0, e = getNumCompileUnits(); i != e; ++i) { DWARFCompileUnit *cu = getCompileUnitAtIndex(i); savedAddressByteSize = cu->getAddressByteSize(); unsigned stmtOffset = cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_stmt_list, -1U); if (stmtOffset != -1U) { DataExtractor lineData(getLineSection(), isLittleEndian(), savedAddressByteSize); DWARFDebugLine::DumpingState state(OS); DWARFDebugLine::parseStatementTable(lineData, &lineRelocMap(), &stmtOffset, state); } } } if (DumpType == DIDT_All || DumpType == DIDT_Str) { OS << "\n.debug_str contents:\n"; DataExtractor strData(getStringSection(), isLittleEndian(), 0); offset = 0; uint32_t strOffset = 0; while (const char *s = strData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strOffset, s); strOffset = offset; } } if (DumpType == DIDT_All || DumpType == DIDT_Ranges) { OS << "\n.debug_ranges contents:\n"; // In fact, different compile units may have different address byte // sizes, but for simplicity we just use the address byte size of the last // compile unit (there is no easy and fast way to associate address range // list and the compile unit it describes). DataExtractor rangesData(getRangeSection(), isLittleEndian(), savedAddressByteSize); offset = 0; DWARFDebugRangeList rangeList; while (rangeList.extract(rangesData, &offset)) rangeList.dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Pubnames) { OS << "\n.debug_pubnames contents:\n"; DataExtractor pubNames(getPubNamesSection(), isLittleEndian(), 0); offset = 0; OS << "Length: " << pubNames.getU32(&offset) << "\n"; OS << "Version: " << pubNames.getU16(&offset) << "\n"; OS << "Offset in .debug_info: " << pubNames.getU32(&offset) << "\n"; OS << "Size: " << pubNames.getU32(&offset) << "\n"; OS << "\n Offset Name\n"; while (offset < getPubNamesSection().size()) { uint32_t n = pubNames.getU32(&offset); if (n == 0) break; OS << format("%8x ", n); OS << pubNames.getCStr(&offset) << "\n"; } } if (DumpType == DIDT_All || DumpType == DIDT_AbbrevDwo) { OS << "\n.debug_abbrev.dwo contents:\n"; getDebugAbbrevDWO()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_InfoDwo) { OS << "\n.debug_info.dwo contents:\n"; for (unsigned i = 0, e = getNumDWOCompileUnits(); i != e; ++i) getDWOCompileUnitAtIndex(i)->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_StrDwo) { OS << "\n.debug_str.dwo contents:\n"; DataExtractor strDWOData(getStringDWOSection(), isLittleEndian(), 0); offset = 0; uint32_t strDWOOffset = 0; while (const char *s = strDWOData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strDWOOffset, s); strDWOOffset = offset; } } if (DumpType == DIDT_All || DumpType == DIDT_StrOffsetsDwo) { OS << "\n.debug_str_offsets.dwo contents:\n"; DataExtractor strOffsetExt(getStringOffsetDWOSection(), isLittleEndian(), 0); offset = 0; while (offset < getStringOffsetDWOSection().size()) { OS << format("0x%8.8x: ", offset); OS << format("%8.8x\n", strOffsetExt.getU32(&offset)); } } }
void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType, bool DumpEH, bool SummarizeTypes) { if (DumpType == DIDT_All || DumpType == DIDT_Abbrev) { OS << ".debug_abbrev contents:\n"; getDebugAbbrev()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_AbbrevDwo) if (const DWARFDebugAbbrev *D = getDebugAbbrevDWO()) { OS << "\n.debug_abbrev.dwo contents:\n"; D->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Info) { OS << "\n.debug_info contents:\n"; for (const auto &CU : compile_units()) CU->dump(OS); } if ((DumpType == DIDT_All || DumpType == DIDT_InfoDwo) && getNumDWOCompileUnits()) { OS << "\n.debug_info.dwo contents:\n"; for (const auto &DWOCU : dwo_compile_units()) DWOCU->dump(OS); } if ((DumpType == DIDT_All || DumpType == DIDT_Types) && getNumTypeUnits()) { OS << "\n.debug_types contents:\n"; for (const auto &TUS : type_unit_sections()) for (const auto &TU : TUS) TU->dump(OS, SummarizeTypes); } if ((DumpType == DIDT_All || DumpType == DIDT_TypesDwo) && getNumDWOTypeUnits()) { OS << "\n.debug_types.dwo contents:\n"; for (const auto &DWOTUS : dwo_type_unit_sections()) for (const auto &DWOTU : DWOTUS) DWOTU->dump(OS, SummarizeTypes); } if (DumpType == DIDT_All || DumpType == DIDT_Loc) { OS << "\n.debug_loc contents:\n"; getDebugLoc()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_LocDwo) { OS << "\n.debug_loc.dwo contents:\n"; getDebugLocDWO()->dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Frames) { OS << "\n.debug_frame contents:\n"; getDebugFrame()->dump(OS); if (DumpEH) { OS << "\n.eh_frame contents:\n"; getEHFrame()->dump(OS); } } if (DumpType == DIDT_All || DumpType == DIDT_Macro) { OS << "\n.debug_macinfo contents:\n"; getDebugMacro()->dump(OS); } uint32_t offset = 0; if (DumpType == DIDT_All || DumpType == DIDT_Aranges) { OS << "\n.debug_aranges contents:\n"; DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0); DWARFDebugArangeSet set; while (set.extract(arangesData, &offset)) set.dump(OS); } uint8_t savedAddressByteSize = 0; if (DumpType == DIDT_All || DumpType == DIDT_Line) { OS << "\n.debug_line contents:\n"; for (const auto &CU : compile_units()) { savedAddressByteSize = CU->getAddressByteSize(); auto CUDIE = CU->getUnitDIE(); if (!CUDIE) continue; if (auto StmtOffset = toSectionOffset(CUDIE.find(DW_AT_stmt_list))) { DataExtractor lineData(getLineSection().Data, isLittleEndian(), savedAddressByteSize); DWARFDebugLine::LineTable LineTable; uint32_t Offset = *StmtOffset; LineTable.parse(lineData, &getLineSection().Relocs, &Offset); LineTable.dump(OS); } } } if (DumpType == DIDT_All || DumpType == DIDT_CUIndex) { OS << "\n.debug_cu_index contents:\n"; getCUIndex().dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_TUIndex) { OS << "\n.debug_tu_index contents:\n"; getTUIndex().dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_LineDwo) { OS << "\n.debug_line.dwo contents:\n"; unsigned stmtOffset = 0; DataExtractor lineData(getLineDWOSection().Data, isLittleEndian(), savedAddressByteSize); DWARFDebugLine::LineTable LineTable; while (LineTable.Prologue.parse(lineData, &stmtOffset)) { LineTable.dump(OS); LineTable.clear(); } } if (DumpType == DIDT_All || DumpType == DIDT_Str) { OS << "\n.debug_str contents:\n"; DataExtractor strData(getStringSection(), isLittleEndian(), 0); offset = 0; uint32_t strOffset = 0; while (const char *s = strData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strOffset, s); strOffset = offset; } } if ((DumpType == DIDT_All || DumpType == DIDT_StrDwo) && !getStringDWOSection().empty()) { OS << "\n.debug_str.dwo contents:\n"; DataExtractor strDWOData(getStringDWOSection(), isLittleEndian(), 0); offset = 0; uint32_t strDWOOffset = 0; while (const char *s = strDWOData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strDWOOffset, s); strDWOOffset = offset; } } if (DumpType == DIDT_All || DumpType == DIDT_Ranges) { OS << "\n.debug_ranges contents:\n"; // In fact, different compile units may have different address byte // sizes, but for simplicity we just use the address byte size of the last // compile unit (there is no easy and fast way to associate address range // list and the compile unit it describes). DataExtractor rangesData(getRangeSection(), isLittleEndian(), savedAddressByteSize); offset = 0; DWARFDebugRangeList rangeList; while (rangeList.extract(rangesData, &offset)) rangeList.dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_Pubnames) DWARFDebugPubTable(getPubNamesSection(), isLittleEndian(), false) .dump("debug_pubnames", OS); if (DumpType == DIDT_All || DumpType == DIDT_Pubtypes) DWARFDebugPubTable(getPubTypesSection(), isLittleEndian(), false) .dump("debug_pubtypes", OS); if (DumpType == DIDT_All || DumpType == DIDT_GnuPubnames) DWARFDebugPubTable(getGnuPubNamesSection(), isLittleEndian(), true /* GnuStyle */) .dump("debug_gnu_pubnames", OS); if (DumpType == DIDT_All || DumpType == DIDT_GnuPubtypes) DWARFDebugPubTable(getGnuPubTypesSection(), isLittleEndian(), true /* GnuStyle */) .dump("debug_gnu_pubtypes", OS); if ((DumpType == DIDT_All || DumpType == DIDT_StrOffsetsDwo) && !getStringOffsetDWOSection().empty()) { OS << "\n.debug_str_offsets.dwo contents:\n"; DataExtractor strOffsetExt(getStringOffsetDWOSection(), isLittleEndian(), 0); offset = 0; uint64_t size = getStringOffsetDWOSection().size(); while (offset < size) { OS << format("0x%8.8x: ", offset); OS << format("%8.8x\n", strOffsetExt.getU32(&offset)); } } if ((DumpType == DIDT_All || DumpType == DIDT_GdbIndex) && !getGdbIndexSection().empty()) { OS << "\n.gnu_index contents:\n"; getGdbIndex().dump(OS); } if (DumpType == DIDT_All || DumpType == DIDT_AppleNames) dumpAccelSection(OS, "apple_names", getAppleNamesSection(), getStringSection(), isLittleEndian()); if (DumpType == DIDT_All || DumpType == DIDT_AppleTypes) dumpAccelSection(OS, "apple_types", getAppleTypesSection(), getStringSection(), isLittleEndian()); if (DumpType == DIDT_All || DumpType == DIDT_AppleNamespaces) dumpAccelSection(OS, "apple_namespaces", getAppleNamespacesSection(), getStringSection(), isLittleEndian()); if (DumpType == DIDT_All || DumpType == DIDT_AppleObjC) dumpAccelSection(OS, "apple_objc", getAppleObjCSection(), getStringSection(), isLittleEndian()); }