summaryrefslogtreecommitdiff
path: root/llvm/lib/ObjectYAML/DWARFYAML.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ObjectYAML/DWARFYAML.cpp')
-rw-r--r--llvm/lib/ObjectYAML/DWARFYAML.cpp110
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);