diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /llvm/lib/ObjectYAML/DWARFYAML.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/ObjectYAML/DWARFYAML.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/DWARFYAML.cpp | 110 |
1 files changed, 84 insertions, 26 deletions
diff --git a/llvm/lib/ObjectYAML/DWARFYAML.cpp b/llvm/lib/ObjectYAML/DWARFYAML.cpp index bb3b1422eb62d..bedf31dc8179f 100644 --- a/llvm/lib/ObjectYAML/DWARFYAML.cpp +++ b/llvm/lib/ObjectYAML/DWARFYAML.cpp @@ -12,38 +12,69 @@ //===----------------------------------------------------------------------===// #include "llvm/ObjectYAML/DWARFYAML.h" +#include "llvm/BinaryFormat/Dwarf.h" namespace llvm { bool DWARFYAML::Data::isEmpty() const { - return 0 == DebugStrings.size() + AbbrevDecls.size(); + return DebugStrings.empty() && AbbrevDecls.empty() && ARanges.empty() && + DebugRanges.empty() && !PubNames && !PubTypes && !GNUPubNames && + !GNUPubTypes && CompileUnits.empty() && DebugLines.empty(); +} + +SetVector<StringRef> DWARFYAML::Data::getUsedSectionNames() const { + SetVector<StringRef> SecNames; + if (!DebugStrings.empty()) + SecNames.insert("debug_str"); + if (!ARanges.empty()) + SecNames.insert("debug_aranges"); + if (!DebugRanges.empty()) + SecNames.insert("debug_ranges"); + if (!DebugLines.empty()) + SecNames.insert("debug_line"); + if (!DebugAddr.empty()) + SecNames.insert("debug_addr"); + if (!AbbrevDecls.empty()) + SecNames.insert("debug_abbrev"); + if (!CompileUnits.empty()) + SecNames.insert("debug_info"); + if (PubNames) + SecNames.insert("debug_pubnames"); + if (PubTypes) + SecNames.insert("debug_pubtypes"); + if (GNUPubNames) + SecNames.insert("debug_gnu_pubnames"); + if (GNUPubTypes) + SecNames.insert("debug_gnu_pubtypes"); + return SecNames; } namespace yaml { void MappingTraits<DWARFYAML::Data>::mapping(IO &IO, DWARFYAML::Data &DWARF) { - auto oldContext = IO.getContext(); - IO.setContext(&DWARF); + void *OldContext = IO.getContext(); + DWARFYAML::DWARFContext DWARFCtx; + IO.setContext(&DWARFCtx); IO.mapOptional("debug_str", DWARF.DebugStrings); IO.mapOptional("debug_abbrev", DWARF.AbbrevDecls); if (!DWARF.ARanges.empty() || !IO.outputting()) IO.mapOptional("debug_aranges", DWARF.ARanges); - if (!DWARF.PubNames.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_pubnames", DWARF.PubNames); - if (!DWARF.PubTypes.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_pubtypes", DWARF.PubTypes); - if (!DWARF.GNUPubNames.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames); - if (!DWARF.GNUPubTypes.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes); + if (!DWARF.DebugRanges.empty() || !IO.outputting()) + IO.mapOptional("debug_ranges", DWARF.DebugRanges); + IO.mapOptional("debug_pubnames", DWARF.PubNames); + IO.mapOptional("debug_pubtypes", DWARF.PubTypes); + DWARFCtx.IsGNUPubSec = true; + IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames); + IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes); IO.mapOptional("debug_info", DWARF.CompileUnits); IO.mapOptional("debug_line", DWARF.DebugLines); - IO.setContext(&oldContext); + IO.mapOptional("debug_addr", DWARF.DebugAddr); + IO.setContext(OldContext); } void MappingTraits<DWARFYAML::Abbrev>::mapping(IO &IO, DWARFYAML::Abbrev &Abbrev) { - IO.mapRequired("Code", Abbrev.Code); + IO.mapOptional("Code", Abbrev.Code); IO.mapRequired("Tag", Abbrev.Tag); IO.mapRequired("Children", Abbrev.Children); IO.mapRequired("Attributes", Abbrev.Attributes); @@ -64,38 +95,48 @@ void MappingTraits<DWARFYAML::ARangeDescriptor>::mapping( } void MappingTraits<DWARFYAML::ARange>::mapping(IO &IO, - DWARFYAML::ARange &Range) { - IO.mapRequired("Length", Range.Length); - IO.mapRequired("Version", Range.Version); - IO.mapRequired("CuOffset", Range.CuOffset); - IO.mapRequired("AddrSize", Range.AddrSize); - IO.mapRequired("SegSize", Range.SegSize); - IO.mapRequired("Descriptors", Range.Descriptors); + DWARFYAML::ARange &ARange) { + IO.mapOptional("Format", ARange.Format, dwarf::DWARF32); + IO.mapRequired("Length", ARange.Length); + IO.mapRequired("Version", ARange.Version); + IO.mapRequired("CuOffset", ARange.CuOffset); + IO.mapRequired("AddrSize", ARange.AddrSize); + IO.mapRequired("SegSize", ARange.SegSize); + IO.mapRequired("Descriptors", ARange.Descriptors); +} + +void MappingTraits<DWARFYAML::RangeEntry>::mapping( + IO &IO, DWARFYAML::RangeEntry &Descriptor) { + IO.mapRequired("LowOffset", Descriptor.LowOffset); + IO.mapRequired("HighOffset", Descriptor.HighOffset); +} + +void MappingTraits<DWARFYAML::Ranges>::mapping(IO &IO, + DWARFYAML::Ranges &DebugRanges) { + IO.mapOptional("Offset", DebugRanges.Offset); + IO.mapOptional("AddrSize", DebugRanges.AddrSize); + IO.mapRequired("Entries", DebugRanges.Entries); } void MappingTraits<DWARFYAML::PubEntry>::mapping(IO &IO, DWARFYAML::PubEntry &Entry) { IO.mapRequired("DieOffset", Entry.DieOffset); - if (reinterpret_cast<DWARFYAML::PubSection *>(IO.getContext())->IsGNUStyle) + if (static_cast<DWARFYAML::DWARFContext *>(IO.getContext())->IsGNUPubSec) IO.mapRequired("Descriptor", Entry.Descriptor); IO.mapRequired("Name", Entry.Name); } void MappingTraits<DWARFYAML::PubSection>::mapping( IO &IO, DWARFYAML::PubSection &Section) { - auto OldContext = IO.getContext(); - IO.setContext(&Section); - IO.mapRequired("Length", Section.Length); IO.mapRequired("Version", Section.Version); IO.mapRequired("UnitOffset", Section.UnitOffset); IO.mapRequired("UnitSize", Section.UnitSize); IO.mapRequired("Entries", Section.Entries); - - IO.setContext(OldContext); } void MappingTraits<DWARFYAML::Unit>::mapping(IO &IO, DWARFYAML::Unit &Unit) { + IO.mapOptional("Format", Unit.Format, dwarf::DWARF32); IO.mapRequired("Length", Unit.Length); IO.mapRequired("Version", Unit.Version); if (Unit.Version >= 5) @@ -147,6 +188,7 @@ void MappingTraits<DWARFYAML::LineTableOpcode>::mapping( void MappingTraits<DWARFYAML::LineTable>::mapping( IO &IO, DWARFYAML::LineTable &LineTable) { + IO.mapOptional("Format", LineTable.Format, dwarf::DWARF32); IO.mapRequired("Length", LineTable.Length); IO.mapRequired("Version", LineTable.Version); IO.mapRequired("PrologueLength", LineTable.PrologueLength); @@ -163,6 +205,22 @@ void MappingTraits<DWARFYAML::LineTable>::mapping( IO.mapRequired("Opcodes", LineTable.Opcodes); } +void MappingTraits<DWARFYAML::SegAddrPair>::mapping( + IO &IO, DWARFYAML::SegAddrPair &SegAddrPair) { + IO.mapOptional("Segment", SegAddrPair.Segment, 0); + IO.mapOptional("Address", SegAddrPair.Address, 0); +} + +void MappingTraits<DWARFYAML::AddrTableEntry>::mapping( + IO &IO, DWARFYAML::AddrTableEntry &AddrTable) { + IO.mapOptional("Format", AddrTable.Format, dwarf::DWARF32); + IO.mapOptional("Length", AddrTable.Length); + IO.mapRequired("Version", AddrTable.Version); + IO.mapOptional("AddressSize", AddrTable.AddrSize); + IO.mapOptional("SegmentSelectorSize", AddrTable.SegSelectorSize, 0); + IO.mapOptional("Entries", AddrTable.SegAddrPairs); +} + void MappingTraits<DWARFYAML::InitialLength>::mapping( IO &IO, DWARFYAML::InitialLength &InitialLength) { IO.mapRequired("TotalLength", InitialLength.TotalLength); |