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;
95 struct LineTableOpcode {
96 dwarf::LineNumberOps Opcode;
98 dwarf::LineNumberExtendedOps SubOpcode;
102 std::vector<llvm::yaml::Hex8> UnknownOpcodeData;
103 std::vector<llvm::yaml::Hex64> StandardOpcodeData;
107 uint32_t TotalLength;
108 uint64_t TotalLength64;
110 uint64_t PrologueLength;
111 uint8_t MinInstLength;
112 uint8_t MaxOpsPerInst;
113 uint8_t DefaultIsStmt;
117 std::vector<uint8_t> StandardOpcodeLengths;
118 std::vector<StringRef> IncludeDirs;
119 std::vector<File> Files;
120 std::vector<LineTableOpcode> Opcodes;
125 std::vector<Abbrev> AbbrevDecls;
126 std::vector<StringRef> DebugStrings;
127 std::vector<ARange> ARanges;
131 PubSection GNUPubNames;
132 PubSection GNUPubTypes;
134 std::vector<Unit> CompileUnits;
136 std::vector<LineTable> DebugLines;
138 bool isEmpty() const;
141 } // namespace llvm::DWARFYAML
144 LLVM_YAML_IS_SEQUENCE_VECTOR(uint8_t)
145 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex64)
146 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
147 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex8)
148 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AttributeAbbrev)
149 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)
150 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)
151 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)
152 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::PubEntry)
153 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Unit)
154 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::FormValue)
155 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Entry)
156 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::File)
157 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::LineTable)
158 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::LineTableOpcode)
163 template <> struct MappingTraits<DWARFYAML::Data> {
164 static void mapping(IO &IO, DWARFYAML::Data &DWARF);
167 template <> struct MappingTraits<DWARFYAML::Abbrev> {
168 static void mapping(IO &IO, DWARFYAML::Abbrev &Abbrev);
171 template <> struct MappingTraits<DWARFYAML::AttributeAbbrev> {
172 static void mapping(IO &IO, DWARFYAML::AttributeAbbrev &AttAbbrev);
175 template <> struct MappingTraits<DWARFYAML::ARangeDescriptor> {
176 static void mapping(IO &IO, DWARFYAML::ARangeDescriptor &Descriptor);
179 template <> struct MappingTraits<DWARFYAML::ARange> {
180 static void mapping(IO &IO, DWARFYAML::ARange &Range);
183 template <> struct MappingTraits<DWARFYAML::PubEntry> {
184 static void mapping(IO &IO, DWARFYAML::PubEntry &Entry);
187 template <> struct MappingTraits<DWARFYAML::PubSection> {
188 static void mapping(IO &IO, DWARFYAML::PubSection &Section);
191 template <> struct MappingTraits<DWARFYAML::Unit> {
192 static void mapping(IO &IO, DWARFYAML::Unit &Unit);
195 template <> struct MappingTraits<DWARFYAML::Entry> {
196 static void mapping(IO &IO, DWARFYAML::Entry &Entry);
199 template <> struct MappingTraits<DWARFYAML::FormValue> {
200 static void mapping(IO &IO, DWARFYAML::FormValue &FormValue);
203 template <> struct MappingTraits<DWARFYAML::File> {
204 static void mapping(IO &IO, DWARFYAML::File &File);
207 template <> struct MappingTraits<DWARFYAML::LineTableOpcode> {
208 static void mapping(IO &IO, DWARFYAML::LineTableOpcode &LineTableOpcode);
211 template <> struct MappingTraits<DWARFYAML::LineTable> {
212 static void mapping(IO &IO, DWARFYAML::LineTable &LineTable);
215 #define HANDLE_DW_TAG(unused, name) \
216 io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
218 template <> struct ScalarEnumerationTraits<dwarf::Tag> {
219 static void enumeration(IO &io, dwarf::Tag &value) {
220 #include "llvm/Support/Dwarf.def"
221 io.enumFallback<Hex16>(value);
225 #define HANDLE_DW_LNS(unused, name) \
226 io.enumCase(value, "DW_LNS_" #name, dwarf::DW_LNS_##name);
228 template <> struct ScalarEnumerationTraits<dwarf::LineNumberOps> {
229 static void enumeration(IO &io, dwarf::LineNumberOps &value) {
230 #include "llvm/Support/Dwarf.def"
231 io.enumFallback<Hex8>(value);
235 #define HANDLE_DW_LNE(unused, name) \
236 io.enumCase(value, "DW_LNE_" #name, dwarf::DW_LNE_##name);
238 template <> struct ScalarEnumerationTraits<dwarf::LineNumberExtendedOps> {
239 static void enumeration(IO &io, dwarf::LineNumberExtendedOps &value) {
240 #include "llvm/Support/Dwarf.def"
241 io.enumFallback<Hex16>(value);
245 #define HANDLE_DW_AT(unused, name) \
246 io.enumCase(value, "DW_AT_" #name, dwarf::DW_AT_##name);
248 template <> struct ScalarEnumerationTraits<dwarf::Attribute> {
249 static void enumeration(IO &io, dwarf::Attribute &value) {
250 #include "llvm/Support/Dwarf.def"
251 io.enumFallback<Hex16>(value);
255 #define HANDLE_DW_FORM(unused, name) \
256 io.enumCase(value, "DW_FORM_" #name, dwarf::DW_FORM_##name);
258 template <> struct ScalarEnumerationTraits<dwarf::Form> {
259 static void enumeration(IO &io, dwarf::Form &value) {
260 #include "llvm/Support/Dwarf.def"
261 io.enumFallback<Hex16>(value);
265 template <> struct ScalarEnumerationTraits<dwarf::Constants> {
266 static void enumeration(IO &io, dwarf::Constants &value) {
267 io.enumCase(value, "DW_CHILDREN_no", dwarf::DW_CHILDREN_no);
268 io.enumCase(value, "DW_CHILDREN_yes", dwarf::DW_CHILDREN_yes);
269 io.enumFallback<Hex16>(value);
273 } // namespace llvm::yaml