1 //===- DWARFYAML.h - DWARF YAMLIO implementation ----------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief This file declares classes for handling the YAML representation
12 /// of DWARF Debug Info.
14 //===----------------------------------------------------------------------===//
17 #ifndef LLVM_OBJECTYAML_DWARFYAML_H
18 #define LLVM_OBJECTYAML_DWARFYAML_H
20 #include "llvm/ObjectYAML/YAML.h"
21 #include "llvm/Support/Dwarf.h"
26 struct AttributeAbbrev {
27 llvm::dwarf::Attribute Attribute;
28 llvm::dwarf::Form Form;
32 llvm::yaml::Hex32 Code;
34 llvm::dwarf::Constants Children;
35 std::vector<AttributeAbbrev> Attributes;
38 struct ARangeDescriptor {
39 llvm::yaml::Hex64 Address;
49 std::vector<ARangeDescriptor> Descriptors;
53 llvm::yaml::Hex32 DieOffset;
54 llvm::yaml::Hex8 Descriptor;
59 PubSection() : IsGNUStyle(false) {}
66 std::vector<PubEntry> Entries;
70 llvm::yaml::Hex64 Value;
72 std::vector<llvm::yaml::Hex8> BlockData;
76 llvm::yaml::Hex32 AbbrCode;
77 std::vector<FormValue> Values;
85 std::vector<Entry> Entries;
90 std::vector<Abbrev> AbbrevDecls;
91 std::vector<StringRef> DebugStrings;
92 std::vector<ARange> ARanges;
96 PubSection GNUPubNames;
97 PubSection GNUPubTypes;
99 std::vector<Unit> CompileUnits;
101 bool isEmpty() const;
104 } // namespace llvm::DWARFYAML
107 LLVM_YAML_IS_SEQUENCE_VECTOR(uint8_t)
108 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
109 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex8)
110 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AttributeAbbrev)
111 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)
112 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)
113 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)
114 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::PubEntry)
115 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Unit)
116 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::FormValue)
117 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Entry)
122 template <> struct MappingTraits<DWARFYAML::Data> {
123 static void mapping(IO &IO, DWARFYAML::Data &DWARF);
126 template <> struct MappingTraits<DWARFYAML::Abbrev> {
127 static void mapping(IO &IO, DWARFYAML::Abbrev &Abbrev);
130 template <> struct MappingTraits<DWARFYAML::AttributeAbbrev> {
131 static void mapping(IO &IO, DWARFYAML::AttributeAbbrev &AttAbbrev);
134 template <> struct MappingTraits<DWARFYAML::ARangeDescriptor> {
135 static void mapping(IO &IO, DWARFYAML::ARangeDescriptor &Descriptor);
138 template <> struct MappingTraits<DWARFYAML::ARange> {
139 static void mapping(IO &IO, DWARFYAML::ARange &Range);
142 template <> struct MappingTraits<DWARFYAML::PubEntry> {
143 static void mapping(IO &IO, DWARFYAML::PubEntry &Entry);
146 template <> struct MappingTraits<DWARFYAML::PubSection> {
147 static void mapping(IO &IO, DWARFYAML::PubSection &Section);
150 template <> struct MappingTraits<DWARFYAML::Unit> {
151 static void mapping(IO &IO, DWARFYAML::Unit &Unit);
154 template <> struct MappingTraits<DWARFYAML::Entry> {
155 static void mapping(IO &IO, DWARFYAML::Entry &Entry);
158 template <> struct MappingTraits<DWARFYAML::FormValue> {
159 static void mapping(IO &IO, DWARFYAML::FormValue &FormValue);
162 #define HANDLE_DW_TAG(unused, name) \
163 io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
165 template <> struct ScalarEnumerationTraits<dwarf::Tag> {
166 static void enumeration(IO &io, dwarf::Tag &value) {
167 #include "llvm/Support/Dwarf.def"
168 io.enumFallback<Hex16>(value);
172 #define HANDLE_DW_AT(unused, name) \
173 io.enumCase(value, "DW_AT_" #name, dwarf::DW_AT_##name);
175 template <> struct ScalarEnumerationTraits<dwarf::Attribute> {
176 static void enumeration(IO &io, dwarf::Attribute &value) {
177 #include "llvm/Support/Dwarf.def"
178 io.enumFallback<Hex16>(value);
182 #define HANDLE_DW_FORM(unused, name) \
183 io.enumCase(value, "DW_FORM_" #name, dwarf::DW_FORM_##name);
185 template <> struct ScalarEnumerationTraits<dwarf::Form> {
186 static void enumeration(IO &io, dwarf::Form &value) {
187 #include "llvm/Support/Dwarf.def"
188 io.enumFallback<Hex16>(value);
192 template <> struct ScalarEnumerationTraits<dwarf::Constants> {
193 static void enumeration(IO &io, dwarf::Constants &value) {
194 io.enumCase(value, "DW_CHILDREN_no", dwarf::DW_CHILDREN_no);
195 io.enumCase(value, "DW_CHILDREN_yes", dwarf::DW_CHILDREN_yes);
196 io.enumFallback<Hex16>(value);
200 } // namespace llvm::yaml