[llvm] r290139 - [ObjectYAML] Support for DWARF Pub Sections
Chris Bieneman via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 19 14:22:12 PST 2016
Author: cbieneman
Date: Mon Dec 19 16:22:12 2016
New Revision: 290139
URL: http://llvm.org/viewvc/llvm-project?rev=290139&view=rev
Log:
[ObjectYAML] Support for DWARF Pub Sections
This patch adds support for YAML<->DWARF round tripping for pub* section data. The patch supports both GNU and non-GNU style entries.
Added:
llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml
Modified:
llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h
llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp
llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp
llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp
llvm/trunk/tools/yaml2obj/yaml2macho.cpp
llvm/trunk/tools/yaml2obj/yaml2obj.h
Modified: llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h?rev=290139&r1=290138&r2=290139&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h Mon Dec 19 16:22:12 2016
@@ -49,10 +49,32 @@ struct ARange {
std::vector<ARangeDescriptor> Descriptors;
};
+struct PubEntry {
+ llvm::yaml::Hex32 DieOffset;
+ llvm::yaml::Hex8 Descriptor;
+ StringRef Name;
+};
+
+struct PubSection {
+ PubSection() : IsGNUStyle(false) {}
+
+ uint32_t Length;
+ uint16_t Version;
+ uint32_t UnitOffset;
+ uint32_t UnitSize;
+ bool IsGNUStyle;
+ std::vector<PubEntry> Entries;
+};
+
struct Data {
std::vector<Abbrev> AbbrevDecls;
std::vector<StringRef> DebugStrings;
std::vector<ARange> ARanges;
+ PubSection PubNames;
+ PubSection PubTypes;
+
+ PubSection GNUPubNames;
+ PubSection GNUPubTypes;
bool isEmpty() const;
};
@@ -65,6 +87,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARF
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::PubEntry)
namespace llvm {
namespace yaml {
@@ -89,6 +112,14 @@ template <> struct MappingTraits<DWARFYA
static void mapping(IO &IO, DWARFYAML::ARange &Range);
};
+template <> struct MappingTraits<DWARFYAML::PubEntry> {
+ static void mapping(IO &IO, DWARFYAML::PubEntry &Entry);
+};
+
+template <> struct MappingTraits<DWARFYAML::PubSection> {
+ static void mapping(IO &IO, DWARFYAML::PubSection &Section);
+};
+
#define HANDLE_DW_TAG(unused, name) \
io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
Modified: llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp?rev=290139&r1=290138&r2=290139&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp Mon Dec 19 16:22:12 2016
@@ -28,6 +28,14 @@ void MappingTraits<DWARFYAML::Data>::map
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);
}
void MappingTraits<DWARFYAML::Abbrev>::mapping(
@@ -60,6 +68,28 @@ void MappingTraits<DWARFYAML::ARange>::m
IO.mapRequired("Descriptors", Range.Descriptors);
}
+void MappingTraits<DWARFYAML::PubEntry>::mapping(IO &IO,
+ DWARFYAML::PubEntry &Entry) {
+ IO.mapRequired("DieOffset", Entry.DieOffset);
+ if (reinterpret_cast<DWARFYAML::PubSection *>(IO.getContext())->IsGNUStyle)
+ 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);
+}
+
} // namespace llvm::yaml
} // namespace llvm
Added: llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml?rev=290139&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml Mon Dec 19 16:22:12 2016
@@ -0,0 +1,355 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x0000000A
+ ncmds: 5
+ sizeofcmds: 1800
+ flags: 0x00000000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 72
+ segname: __PAGEZERO
+ vmaddr: 0
+ vmsize: 4294967296
+ fileoff: 0
+ filesize: 0
+ maxprot: 0
+ initprot: 0
+ nsects: 0
+ flags: 0
+ - cmd: LC_SEGMENT_64
+ cmdsize: 472
+ segname: __TEXT
+ vmaddr: 4294967296
+ vmsize: 4096
+ fileoff: 0
+ filesize: 0
+ maxprot: 7
+ initprot: 5
+ nsects: 5
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000100000F50
+ size: 52
+ offset: 0x00000000
+ align: 4
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __stubs
+ segname: __TEXT
+ addr: 0x0000000100000F84
+ size: 6
+ offset: 0x00000000
+ align: 1
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000408
+ reserved1: 0x00000000
+ reserved2: 0x00000006
+ reserved3: 0x00000000
+ - sectname: __stub_helper
+ segname: __TEXT
+ addr: 0x0000000100000F8C
+ size: 26
+ offset: 0x00000000
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __cstring
+ segname: __TEXT
+ addr: 0x0000000100000FA6
+ size: 14
+ offset: 0x00000000
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000002
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __unwind_info
+ segname: __TEXT
+ addr: 0x0000000100000FB4
+ size: 72
+ offset: 0x00000000
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - cmd: LC_SEGMENT_64
+ cmdsize: 232
+ segname: __DATA
+ vmaddr: 4294971392
+ vmsize: 4096
+ fileoff: 0
+ filesize: 0
+ maxprot: 7
+ initprot: 3
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __nl_symbol_ptr
+ segname: __DATA
+ addr: 0x0000000100001000
+ size: 16
+ offset: 0x00000000
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000006
+ reserved1: 0x00000001
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __la_symbol_ptr
+ segname: __DATA
+ addr: 0x0000000100001010
+ size: 8
+ offset: 0x00000000
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000007
+ reserved1: 0x00000003
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - cmd: LC_SEGMENT_64
+ cmdsize: 72
+ segname: __LINKEDIT
+ vmaddr: 4294975488
+ vmsize: 4096
+ fileoff: 4096
+ filesize: 60
+ maxprot: 7
+ initprot: 1
+ nsects: 0
+ flags: 0
+ - cmd: LC_SEGMENT_64
+ cmdsize: 952
+ segname: __DWARF
+ vmaddr: 4294979584
+ vmsize: 4096
+ fileoff: 8192
+ filesize: 764
+ maxprot: 7
+ initprot: 3
+ nsects: 11
+ flags: 0
+ Sections:
+ - sectname: __debug_line
+ segname: __DWARF
+ addr: 0x0000000100003000
+ size: 69
+ offset: 0x00002000
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_pubnames
+ segname: __DWARF
+ addr: 0x0000000100003045
+ size: 27
+ offset: 0x00002045
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_pubtypes
+ segname: __DWARF
+ addr: 0x0000000100003060
+ size: 35
+ offset: 0x00002060
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_aranges
+ segname: __DWARF
+ addr: 0x0000000100003083
+ size: 48
+ offset: 0x00002083
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_info
+ segname: __DWARF
+ addr: 0x00000001000030B3
+ size: 121
+ offset: 0x000020B3
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_abbrev
+ segname: __DWARF
+ addr: 0x000000010000312C
+ size: 76
+ offset: 0x0000212C
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_str
+ segname: __DWARF
+ addr: 0x0000000100003178
+ size: 142
+ offset: 0x00002178
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __apple_names
+ segname: __DWARF
+ addr: 0x0000000100003206
+ size: 60
+ offset: 0x00002206
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __apple_namespac
+ segname: __DWARF
+ addr: 0x0000000100003242
+ size: 36
+ offset: 0x00002242
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __apple_types
+ segname: __DWARF
+ addr: 0x0000000100003266
+ size: 114
+ offset: 0x00002266
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __apple_objc
+ segname: __DWARF
+ addr: 0x00000001000032D8
+ size: 36
+ offset: 0x000022D8
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+LinkEditData:
+ NameList:
+ - n_strx: 2
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 16
+ n_value: 4294967296
+ - n_strx: 22
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 0
+ n_value: 4294971216
+ StringTable:
+ - ''
+ - ''
+ - __mh_execute_header
+ - _main
+DWARF:
+ debug_str:
+ - ''
+ - 'clang version 4.0.0 (trunk 288923) (llvm/trunk 288991)'
+ - hello_world.c
+ - /Users/cbieneman/dev/open-source/llvm-build-rel
+ - main
+ - argc
+ - argv
+ - int
+ - char
+ debug_pubnames:
+ Length: 23
+ Version: 2
+ UnitOffset: 0
+ UnitSize: 121
+ Entries:
+ - DieOffset: 0x0000002A
+ Name: main
+ debug_pubtypes:
+ Length: 31
+ Version: 2
+ UnitOffset: 0
+ UnitSize: 121
+ Entries:
+ - DieOffset: 0x00000060
+ Name: int
+ - DieOffset: 0x00000071
+ Name: char
+...
+
+#CHECK: DWARF:
+#CHECK: debug_pubnames:
+#CHECK: Length: 23
+#CHECK: Version: 2
+#CHECK: UnitOffset: 0
+#CHECK: UnitSize: 121
+#CHECK: Entries:
+#CHECK: - DieOffset: 0x0000002A
+#CHECK: Name: main
+#CHECK: debug_pubtypes:
+#CHECK: Length: 31
+#CHECK: Version: 2
+#CHECK: UnitOffset: 0
+#CHECK: UnitSize: 121
+#CHECK: Entries:
+#CHECK: - DieOffset: 0x00000060
+#CHECK: Name: int
+#CHECK: - DieOffset: 0x00000071
+#CHECK: Name: char
+#CHECK: ...
Modified: llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp?rev=290139&r1=290138&r2=290139&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp Mon Dec 19 16:22:12 2016
@@ -67,11 +67,44 @@ void dumpDebugARanges(DWARFContextInMemo
}
}
+void dumpPubSection(DWARFContextInMemory &DCtx, DWARFYAML::PubSection &Y,
+ StringRef Section) {
+ DataExtractor PubSectionData(Section, DCtx.isLittleEndian(), 0);
+ uint32_t Offset = 0;
+ Y.Length = PubSectionData.getU32(&Offset);
+ Y.Version = PubSectionData.getU16(&Offset);
+ Y.UnitOffset = PubSectionData.getU32(&Offset);
+ Y.UnitSize = PubSectionData.getU32(&Offset);
+ while (Offset < Y.Length) {
+ DWARFYAML::PubEntry NewEntry;
+ NewEntry.DieOffset = PubSectionData.getU32(&Offset);
+ if (Y.IsGNUStyle)
+ NewEntry.Descriptor = PubSectionData.getU8(&Offset);
+ NewEntry.Name = PubSectionData.getCStr(&Offset);
+ Y.Entries.push_back(NewEntry);
+ }
+}
+
+void dumpDebugPubSections(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
+ Y.PubNames.IsGNUStyle = false;
+ dumpPubSection(DCtx, Y.PubNames, DCtx.getPubNamesSection());
+
+ Y.PubTypes.IsGNUStyle = false;
+ dumpPubSection(DCtx, Y.PubTypes, DCtx.getPubTypesSection());
+
+ Y.GNUPubNames.IsGNUStyle = true;
+ dumpPubSection(DCtx, Y.GNUPubNames, DCtx.getGnuPubNamesSection());
+
+ Y.GNUPubTypes.IsGNUStyle = true;
+ dumpPubSection(DCtx, Y.GNUPubTypes, DCtx.getGnuPubTypesSection());
+}
+
std::error_code dwarf2yaml(DWARFContextInMemory &DCtx,
DWARFYAML::Data &Y) {
dumpDebugAbbrev(DCtx, Y);
dumpDebugStrings(DCtx, Y);
dumpDebugARanges(DCtx, Y);
+ dumpDebugPubSections(DCtx, Y);
return obj2yaml_error::success;
}
Modified: llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp?rev=290139&r1=290138&r2=290139&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp Mon Dec 19 16:22:12 2016
@@ -66,3 +66,17 @@ void yaml2debug_aranges(raw_ostream &OS,
ZeroFillBytes(OS, Range.AddrSize * 2);
}
}
+
+void yaml2pubsection(raw_ostream &OS, const DWARFYAML::PubSection &Sect) {
+ OS.write(reinterpret_cast<const char *>(&Sect.Length), 4);
+ OS.write(reinterpret_cast<const char *>(&Sect.Version), 2);
+ OS.write(reinterpret_cast<const char *>(&Sect.UnitOffset), 4);
+ OS.write(reinterpret_cast<const char *>(&Sect.UnitSize), 4);
+ for (auto Entry : Sect.Entries) {
+ OS.write(reinterpret_cast<const char *>(&Entry.DieOffset), 4);
+ if (Sect.IsGNUStyle)
+ OS.write(reinterpret_cast<const char *>(&Entry.Descriptor), 4);
+ OS.write(Entry.Name.data(), Entry.Name.size());
+ OS.write('\0');
+ }
+}
Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=290139&r1=290138&r2=290139&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Mon Dec 19 16:22:12 2016
@@ -394,6 +394,10 @@ Error MachOWriter::writeDWARFData(raw_os
yaml2debug_abbrev(OS, Obj.DWARF);
} else if (0 == strncmp(&Section.sectname[0], "__debug_aranges", 16)) {
yaml2debug_aranges(OS, Obj.DWARF);
+ } else if (0 == strncmp(&Section.sectname[0], "__debug_pubnames", 16)) {
+ yaml2pubsection(OS, Obj.DWARF.PubNames);
+ } else if (0 == strncmp(&Section.sectname[0], "__debug_pubtypes", 16)) {
+ yaml2pubsection(OS, Obj.DWARF.PubTypes);
}
}
return Error::success();
Modified: llvm/trunk/tools/yaml2obj/yaml2obj.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.h?rev=290139&r1=290138&r2=290139&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2obj.h (original)
+++ llvm/trunk/tools/yaml2obj/yaml2obj.h Mon Dec 19 16:22:12 2016
@@ -25,6 +25,7 @@ struct Object;
namespace DWARFYAML {
struct Data;
+struct PubSection;
}
namespace yaml {
@@ -43,5 +44,7 @@ void yaml2debug_str(llvm::raw_ostream &O
const llvm::DWARFYAML::Data &DI);
void yaml2debug_aranges(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);
+void yaml2pubsection(llvm::raw_ostream &OS,
+ const llvm::DWARFYAML::PubSection &Sect);
#endif
More information about the llvm-commits
mailing list