diff options
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); | 
