10b57cec5SDimitry Andric //===- DWARFYAML.h - DWARF YAMLIO implementation ----------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric ///
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// This file declares classes for handling the YAML representation
110b57cec5SDimitry Andric /// of DWARF Debug Info.
120b57cec5SDimitry Andric ///
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #ifndef LLVM_OBJECTYAML_DWARFYAML_H
160b57cec5SDimitry Andric #define LLVM_OBJECTYAML_DWARFYAML_H
170b57cec5SDimitry Andric 
185ffd83dbSDimitry Andric #include "llvm/ADT/SetVector.h"
190b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
200b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
21e8d8bef9SDimitry Andric #include "llvm/ObjectYAML/YAML.h"
220b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h"
230b57cec5SDimitry Andric #include <cstdint>
24bdd1243dSDimitry Andric #include <optional>
25e8d8bef9SDimitry Andric #include <unordered_map>
260b57cec5SDimitry Andric #include <vector>
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric namespace llvm {
290b57cec5SDimitry Andric namespace DWARFYAML {
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric struct AttributeAbbrev {
320b57cec5SDimitry Andric   llvm::dwarf::Attribute Attribute;
330b57cec5SDimitry Andric   llvm::dwarf::Form Form;
340b57cec5SDimitry Andric   llvm::yaml::Hex64 Value; // Some DWARF5 attributes have values
350b57cec5SDimitry Andric };
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric struct Abbrev {
38bdd1243dSDimitry Andric   std::optional<yaml::Hex64> Code;
390b57cec5SDimitry Andric   llvm::dwarf::Tag Tag;
400b57cec5SDimitry Andric   llvm::dwarf::Constants Children;
410b57cec5SDimitry Andric   std::vector<AttributeAbbrev> Attributes;
420b57cec5SDimitry Andric };
430b57cec5SDimitry Andric 
44e8d8bef9SDimitry Andric struct AbbrevTable {
45bdd1243dSDimitry Andric   std::optional<uint64_t> ID;
46e8d8bef9SDimitry Andric   std::vector<Abbrev> Table;
47e8d8bef9SDimitry Andric };
48e8d8bef9SDimitry Andric 
490b57cec5SDimitry Andric struct ARangeDescriptor {
500b57cec5SDimitry Andric   llvm::yaml::Hex64 Address;
51e8d8bef9SDimitry Andric   yaml::Hex64 Length;
520b57cec5SDimitry Andric };
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric struct ARange {
555ffd83dbSDimitry Andric   dwarf::DwarfFormat Format;
56bdd1243dSDimitry Andric   std::optional<yaml::Hex64> Length;
570b57cec5SDimitry Andric   uint16_t Version;
58e8d8bef9SDimitry Andric   yaml::Hex64 CuOffset;
59bdd1243dSDimitry Andric   std::optional<yaml::Hex8> AddrSize;
60e8d8bef9SDimitry Andric   yaml::Hex8 SegSize;
610b57cec5SDimitry Andric   std::vector<ARangeDescriptor> Descriptors;
620b57cec5SDimitry Andric };
630b57cec5SDimitry Andric 
645ffd83dbSDimitry Andric /// Class that describes a range list entry, or a base address selection entry
655ffd83dbSDimitry Andric /// within a range list in the .debug_ranges section.
665ffd83dbSDimitry Andric struct RangeEntry {
675ffd83dbSDimitry Andric   llvm::yaml::Hex64 LowOffset;
685ffd83dbSDimitry Andric   llvm::yaml::Hex64 HighOffset;
695ffd83dbSDimitry Andric };
705ffd83dbSDimitry Andric 
715ffd83dbSDimitry Andric /// Class that describes a single range list inside the .debug_ranges section.
725ffd83dbSDimitry Andric struct Ranges {
73bdd1243dSDimitry Andric   std::optional<llvm::yaml::Hex64> Offset;
74bdd1243dSDimitry Andric   std::optional<llvm::yaml::Hex8> AddrSize;
755ffd83dbSDimitry Andric   std::vector<RangeEntry> Entries;
765ffd83dbSDimitry Andric };
775ffd83dbSDimitry Andric 
780b57cec5SDimitry Andric struct PubEntry {
790b57cec5SDimitry Andric   llvm::yaml::Hex32 DieOffset;
800b57cec5SDimitry Andric   llvm::yaml::Hex8 Descriptor;
810b57cec5SDimitry Andric   StringRef Name;
820b57cec5SDimitry Andric };
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric struct PubSection {
85e8d8bef9SDimitry Andric   dwarf::DwarfFormat Format;
86e8d8bef9SDimitry Andric   yaml::Hex64 Length;
870b57cec5SDimitry Andric   uint16_t Version;
880b57cec5SDimitry Andric   uint32_t UnitOffset;
890b57cec5SDimitry Andric   uint32_t UnitSize;
900b57cec5SDimitry Andric   std::vector<PubEntry> Entries;
910b57cec5SDimitry Andric };
920b57cec5SDimitry Andric 
930b57cec5SDimitry Andric struct FormValue {
940b57cec5SDimitry Andric   llvm::yaml::Hex64 Value;
950b57cec5SDimitry Andric   StringRef CStr;
960b57cec5SDimitry Andric   std::vector<llvm::yaml::Hex8> BlockData;
970b57cec5SDimitry Andric };
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric struct Entry {
1000b57cec5SDimitry Andric   llvm::yaml::Hex32 AbbrCode;
1010b57cec5SDimitry Andric   std::vector<FormValue> Values;
1020b57cec5SDimitry Andric };
1030b57cec5SDimitry Andric 
1045ffd83dbSDimitry Andric /// Class that contains helpful context information when mapping YAML into DWARF
1055ffd83dbSDimitry Andric /// data structures.
1065ffd83dbSDimitry Andric struct DWARFContext {
1075ffd83dbSDimitry Andric   bool IsGNUPubSec = false;
1085ffd83dbSDimitry Andric };
1095ffd83dbSDimitry Andric 
1100b57cec5SDimitry Andric struct Unit {
1115ffd83dbSDimitry Andric   dwarf::DwarfFormat Format;
112bdd1243dSDimitry Andric   std::optional<yaml::Hex64> Length;
1130b57cec5SDimitry Andric   uint16_t Version;
114bdd1243dSDimitry Andric   std::optional<uint8_t> AddrSize;
1150b57cec5SDimitry Andric   llvm::dwarf::UnitType Type; // Added in DWARF 5
116bdd1243dSDimitry Andric   std::optional<uint64_t> AbbrevTableID;
117bdd1243dSDimitry Andric   std::optional<yaml::Hex64> AbbrOffset;
1180b57cec5SDimitry Andric   std::vector<Entry> Entries;
1190b57cec5SDimitry Andric };
1200b57cec5SDimitry Andric 
1210b57cec5SDimitry Andric struct File {
1220b57cec5SDimitry Andric   StringRef Name;
1230b57cec5SDimitry Andric   uint64_t DirIdx;
1240b57cec5SDimitry Andric   uint64_t ModTime;
1250b57cec5SDimitry Andric   uint64_t Length;
1260b57cec5SDimitry Andric };
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric struct LineTableOpcode {
1290b57cec5SDimitry Andric   dwarf::LineNumberOps Opcode;
130bdd1243dSDimitry Andric   std::optional<uint64_t> ExtLen;
1310b57cec5SDimitry Andric   dwarf::LineNumberExtendedOps SubOpcode;
1320b57cec5SDimitry Andric   uint64_t Data;
1330b57cec5SDimitry Andric   int64_t SData;
1340b57cec5SDimitry Andric   File FileEntry;
1350b57cec5SDimitry Andric   std::vector<llvm::yaml::Hex8> UnknownOpcodeData;
1360b57cec5SDimitry Andric   std::vector<llvm::yaml::Hex64> StandardOpcodeData;
1370b57cec5SDimitry Andric };
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric struct LineTable {
1405ffd83dbSDimitry Andric   dwarf::DwarfFormat Format;
141bdd1243dSDimitry Andric   std::optional<uint64_t> Length;
1420b57cec5SDimitry Andric   uint16_t Version;
143bdd1243dSDimitry Andric   std::optional<uint64_t> PrologueLength;
1440b57cec5SDimitry Andric   uint8_t MinInstLength;
1450b57cec5SDimitry Andric   uint8_t MaxOpsPerInst;
1460b57cec5SDimitry Andric   uint8_t DefaultIsStmt;
1470b57cec5SDimitry Andric   uint8_t LineBase;
1480b57cec5SDimitry Andric   uint8_t LineRange;
149bdd1243dSDimitry Andric   std::optional<uint8_t> OpcodeBase;
150bdd1243dSDimitry Andric   std::optional<std::vector<uint8_t>> StandardOpcodeLengths;
1510b57cec5SDimitry Andric   std::vector<StringRef> IncludeDirs;
1520b57cec5SDimitry Andric   std::vector<File> Files;
1530b57cec5SDimitry Andric   std::vector<LineTableOpcode> Opcodes;
1540b57cec5SDimitry Andric };
1550b57cec5SDimitry Andric 
1565ffd83dbSDimitry Andric struct SegAddrPair {
1575ffd83dbSDimitry Andric   yaml::Hex64 Segment;
1585ffd83dbSDimitry Andric   yaml::Hex64 Address;
1595ffd83dbSDimitry Andric };
1605ffd83dbSDimitry Andric 
1615ffd83dbSDimitry Andric struct AddrTableEntry {
1625ffd83dbSDimitry Andric   dwarf::DwarfFormat Format;
163bdd1243dSDimitry Andric   std::optional<yaml::Hex64> Length;
1645ffd83dbSDimitry Andric   yaml::Hex16 Version;
165bdd1243dSDimitry Andric   std::optional<yaml::Hex8> AddrSize;
1665ffd83dbSDimitry Andric   yaml::Hex8 SegSelectorSize;
1675ffd83dbSDimitry Andric   std::vector<SegAddrPair> SegAddrPairs;
1685ffd83dbSDimitry Andric };
1695ffd83dbSDimitry Andric 
170e8d8bef9SDimitry Andric struct StringOffsetsTable {
171e8d8bef9SDimitry Andric   dwarf::DwarfFormat Format;
172bdd1243dSDimitry Andric   std::optional<yaml::Hex64> Length;
173e8d8bef9SDimitry Andric   yaml::Hex16 Version;
174e8d8bef9SDimitry Andric   yaml::Hex16 Padding;
175e8d8bef9SDimitry Andric   std::vector<yaml::Hex64> Offsets;
176e8d8bef9SDimitry Andric };
177e8d8bef9SDimitry Andric 
178e8d8bef9SDimitry Andric struct DWARFOperation {
179e8d8bef9SDimitry Andric   dwarf::LocationAtom Operator;
180e8d8bef9SDimitry Andric   std::vector<yaml::Hex64> Values;
181e8d8bef9SDimitry Andric };
182e8d8bef9SDimitry Andric 
183e8d8bef9SDimitry Andric struct RnglistEntry {
184e8d8bef9SDimitry Andric   dwarf::RnglistEntries Operator;
185e8d8bef9SDimitry Andric   std::vector<yaml::Hex64> Values;
186e8d8bef9SDimitry Andric };
187e8d8bef9SDimitry Andric 
188e8d8bef9SDimitry Andric struct LoclistEntry {
189e8d8bef9SDimitry Andric   dwarf::LoclistEntries Operator;
190e8d8bef9SDimitry Andric   std::vector<yaml::Hex64> Values;
191bdd1243dSDimitry Andric   std::optional<yaml::Hex64> DescriptionsLength;
192e8d8bef9SDimitry Andric   std::vector<DWARFOperation> Descriptions;
193e8d8bef9SDimitry Andric };
194e8d8bef9SDimitry Andric 
195e8d8bef9SDimitry Andric template <typename EntryType> struct ListEntries {
196bdd1243dSDimitry Andric   std::optional<std::vector<EntryType>> Entries;
197bdd1243dSDimitry Andric   std::optional<yaml::BinaryRef> Content;
198e8d8bef9SDimitry Andric };
199e8d8bef9SDimitry Andric 
200e8d8bef9SDimitry Andric template <typename EntryType> struct ListTable {
201e8d8bef9SDimitry Andric   dwarf::DwarfFormat Format;
202bdd1243dSDimitry Andric   std::optional<yaml::Hex64> Length;
203e8d8bef9SDimitry Andric   yaml::Hex16 Version;
204bdd1243dSDimitry Andric   std::optional<yaml::Hex8> AddrSize;
205e8d8bef9SDimitry Andric   yaml::Hex8 SegSelectorSize;
206bdd1243dSDimitry Andric   std::optional<uint32_t> OffsetEntryCount;
207bdd1243dSDimitry Andric   std::optional<std::vector<yaml::Hex64>> Offsets;
208e8d8bef9SDimitry Andric   std::vector<ListEntries<EntryType>> Lists;
209e8d8bef9SDimitry Andric };
210e8d8bef9SDimitry Andric 
2110b57cec5SDimitry Andric struct Data {
2120b57cec5SDimitry Andric   bool IsLittleEndian;
2135ffd83dbSDimitry Andric   bool Is64BitAddrSize;
214e8d8bef9SDimitry Andric   std::vector<AbbrevTable> DebugAbbrev;
215bdd1243dSDimitry Andric   std::optional<std::vector<StringRef>> DebugStrings;
216bdd1243dSDimitry Andric   std::optional<std::vector<StringOffsetsTable>> DebugStrOffsets;
217bdd1243dSDimitry Andric   std::optional<std::vector<ARange>> DebugAranges;
218bdd1243dSDimitry Andric   std::optional<std::vector<Ranges>> DebugRanges;
219bdd1243dSDimitry Andric   std::optional<std::vector<AddrTableEntry>> DebugAddr;
220bdd1243dSDimitry Andric   std::optional<PubSection> PubNames;
221bdd1243dSDimitry Andric   std::optional<PubSection> PubTypes;
2220b57cec5SDimitry Andric 
223bdd1243dSDimitry Andric   std::optional<PubSection> GNUPubNames;
224bdd1243dSDimitry Andric   std::optional<PubSection> GNUPubTypes;
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric   std::vector<Unit> CompileUnits;
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric   std::vector<LineTable> DebugLines;
229bdd1243dSDimitry Andric   std::optional<std::vector<ListTable<RnglistEntry>>> DebugRnglists;
230bdd1243dSDimitry Andric   std::optional<std::vector<ListTable<LoclistEntry>>> DebugLoclists;
2310b57cec5SDimitry Andric 
2320b57cec5SDimitry Andric   bool isEmpty() const;
2335ffd83dbSDimitry Andric 
234e8d8bef9SDimitry Andric   SetVector<StringRef> getNonEmptySectionNames() const;
235e8d8bef9SDimitry Andric 
236e8d8bef9SDimitry Andric   struct AbbrevTableInfo {
237e8d8bef9SDimitry Andric     uint64_t Index;
238e8d8bef9SDimitry Andric     uint64_t Offset;
239e8d8bef9SDimitry Andric   };
240e8d8bef9SDimitry Andric   Expected<AbbrevTableInfo> getAbbrevTableInfoByID(uint64_t ID) const;
241e8d8bef9SDimitry Andric   StringRef getAbbrevTableContentByIndex(uint64_t Index) const;
242e8d8bef9SDimitry Andric 
243e8d8bef9SDimitry Andric private:
244e8d8bef9SDimitry Andric   mutable std::unordered_map<uint64_t, AbbrevTableInfo> AbbrevTableInfoMap;
245e8d8bef9SDimitry Andric   mutable std::unordered_map<uint64_t, std::string> AbbrevTableContents;
2460b57cec5SDimitry Andric };
2470b57cec5SDimitry Andric 
2480b57cec5SDimitry Andric } // end namespace DWARFYAML
2490b57cec5SDimitry Andric } // end namespace llvm
2500b57cec5SDimitry Andric 
2510b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AttributeAbbrev)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)2520b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)
253e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AbbrevTable)
2540b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)
2550b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)
2565ffd83dbSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::RangeEntry)
2575ffd83dbSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Ranges)
2580b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::PubEntry)
2590b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Unit)
2600b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::FormValue)
2610b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Entry)
2620b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::File)
2630b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::LineTable)
2640b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::LineTableOpcode)
2655ffd83dbSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::SegAddrPair)
2665ffd83dbSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AddrTableEntry)
267e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::StringOffsetsTable)
268e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(
269e8d8bef9SDimitry Andric     llvm::DWARFYAML::ListTable<DWARFYAML::RnglistEntry>)
270e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(
271e8d8bef9SDimitry Andric     llvm::DWARFYAML::ListEntries<DWARFYAML::RnglistEntry>)
272e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::RnglistEntry)
273e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(
274e8d8bef9SDimitry Andric     llvm::DWARFYAML::ListTable<DWARFYAML::LoclistEntry>)
275e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(
276e8d8bef9SDimitry Andric     llvm::DWARFYAML::ListEntries<DWARFYAML::LoclistEntry>)
277e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::LoclistEntry)
278e8d8bef9SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::DWARFOperation)
2790b57cec5SDimitry Andric 
2800b57cec5SDimitry Andric namespace llvm {
2810b57cec5SDimitry Andric namespace yaml {
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::Data> {
2840b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::Data &DWARF);
2850b57cec5SDimitry Andric };
2860b57cec5SDimitry Andric 
287e8d8bef9SDimitry Andric template <> struct MappingTraits<DWARFYAML::AbbrevTable> {
288e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::AbbrevTable &AbbrevTable);
289e8d8bef9SDimitry Andric };
290e8d8bef9SDimitry Andric 
2910b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::Abbrev> {
2920b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::Abbrev &Abbrev);
2930b57cec5SDimitry Andric };
2940b57cec5SDimitry Andric 
2950b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::AttributeAbbrev> {
2960b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::AttributeAbbrev &AttAbbrev);
2970b57cec5SDimitry Andric };
2980b57cec5SDimitry Andric 
2990b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::ARangeDescriptor> {
3000b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::ARangeDescriptor &Descriptor);
3010b57cec5SDimitry Andric };
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::ARange> {
3045ffd83dbSDimitry Andric   static void mapping(IO &IO, DWARFYAML::ARange &ARange);
3055ffd83dbSDimitry Andric };
3065ffd83dbSDimitry Andric 
3075ffd83dbSDimitry Andric template <> struct MappingTraits<DWARFYAML::RangeEntry> {
3085ffd83dbSDimitry Andric   static void mapping(IO &IO, DWARFYAML::RangeEntry &Entry);
3095ffd83dbSDimitry Andric };
3105ffd83dbSDimitry Andric 
3115ffd83dbSDimitry Andric template <> struct MappingTraits<DWARFYAML::Ranges> {
3125ffd83dbSDimitry Andric   static void mapping(IO &IO, DWARFYAML::Ranges &Ranges);
3130b57cec5SDimitry Andric };
3140b57cec5SDimitry Andric 
3150b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::PubEntry> {
3160b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::PubEntry &Entry);
3170b57cec5SDimitry Andric };
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::PubSection> {
3200b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::PubSection &Section);
3210b57cec5SDimitry Andric };
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::Unit> {
3240b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::Unit &Unit);
3250b57cec5SDimitry Andric };
3260b57cec5SDimitry Andric 
3270b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::Entry> {
3280b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::Entry &Entry);
3290b57cec5SDimitry Andric };
3300b57cec5SDimitry Andric 
3310b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::FormValue> {
3320b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::FormValue &FormValue);
3330b57cec5SDimitry Andric };
3340b57cec5SDimitry Andric 
3350b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::File> {
3360b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::File &File);
3370b57cec5SDimitry Andric };
3380b57cec5SDimitry Andric 
3390b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::LineTableOpcode> {
3400b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::LineTableOpcode &LineTableOpcode);
3410b57cec5SDimitry Andric };
3420b57cec5SDimitry Andric 
3430b57cec5SDimitry Andric template <> struct MappingTraits<DWARFYAML::LineTable> {
3440b57cec5SDimitry Andric   static void mapping(IO &IO, DWARFYAML::LineTable &LineTable);
3450b57cec5SDimitry Andric };
3460b57cec5SDimitry Andric 
3475ffd83dbSDimitry Andric template <> struct MappingTraits<DWARFYAML::SegAddrPair> {
3485ffd83dbSDimitry Andric   static void mapping(IO &IO, DWARFYAML::SegAddrPair &SegAddrPair);
3495ffd83dbSDimitry Andric };
3505ffd83dbSDimitry Andric 
351e8d8bef9SDimitry Andric template <> struct MappingTraits<DWARFYAML::DWARFOperation> {
352e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::DWARFOperation &DWARFOperation);
353e8d8bef9SDimitry Andric };
354e8d8bef9SDimitry Andric 
355e8d8bef9SDimitry Andric template <typename EntryType>
356e8d8bef9SDimitry Andric struct MappingTraits<DWARFYAML::ListTable<EntryType>> {
357e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::ListTable<EntryType> &ListTable);
358e8d8bef9SDimitry Andric };
359e8d8bef9SDimitry Andric 
360e8d8bef9SDimitry Andric template <typename EntryType>
361e8d8bef9SDimitry Andric struct MappingTraits<DWARFYAML::ListEntries<EntryType>> {
362e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::ListEntries<EntryType> &ListEntries);
363e8d8bef9SDimitry Andric   static std::string validate(IO &IO,
364e8d8bef9SDimitry Andric                               DWARFYAML::ListEntries<EntryType> &ListEntries);
365e8d8bef9SDimitry Andric };
366e8d8bef9SDimitry Andric 
367e8d8bef9SDimitry Andric template <> struct MappingTraits<DWARFYAML::RnglistEntry> {
368e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::RnglistEntry &RnglistEntry);
369e8d8bef9SDimitry Andric };
370e8d8bef9SDimitry Andric 
371e8d8bef9SDimitry Andric template <> struct MappingTraits<DWARFYAML::LoclistEntry> {
372e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::LoclistEntry &LoclistEntry);
373e8d8bef9SDimitry Andric };
374e8d8bef9SDimitry Andric 
3755ffd83dbSDimitry Andric template <> struct MappingTraits<DWARFYAML::AddrTableEntry> {
3765ffd83dbSDimitry Andric   static void mapping(IO &IO, DWARFYAML::AddrTableEntry &AddrTable);
3775ffd83dbSDimitry Andric };
3785ffd83dbSDimitry Andric 
379e8d8bef9SDimitry Andric template <> struct MappingTraits<DWARFYAML::StringOffsetsTable> {
380e8d8bef9SDimitry Andric   static void mapping(IO &IO, DWARFYAML::StringOffsetsTable &StrOffsetsTable);
3810b57cec5SDimitry Andric };
3820b57cec5SDimitry Andric 
3835ffd83dbSDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::DwarfFormat> {
3845ffd83dbSDimitry Andric   static void enumeration(IO &IO, dwarf::DwarfFormat &Format) {
3855ffd83dbSDimitry Andric     IO.enumCase(Format, "DWARF32", dwarf::DWARF32);
3865ffd83dbSDimitry Andric     IO.enumCase(Format, "DWARF64", dwarf::DWARF64);
3875ffd83dbSDimitry Andric   }
3885ffd83dbSDimitry Andric };
3895ffd83dbSDimitry Andric 
3908bcb0991SDimitry Andric #define HANDLE_DW_TAG(unused, name, unused2, unused3, unused4)                 \
3910b57cec5SDimitry Andric   io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
3920b57cec5SDimitry Andric 
3930b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::Tag> {
3940b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::Tag &value) {
3950b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
3960b57cec5SDimitry Andric     io.enumFallback<Hex16>(value);
3970b57cec5SDimitry Andric   }
3980b57cec5SDimitry Andric };
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric #define HANDLE_DW_LNS(unused, name)                                            \
4010b57cec5SDimitry Andric   io.enumCase(value, "DW_LNS_" #name, dwarf::DW_LNS_##name);
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::LineNumberOps> {
4040b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::LineNumberOps &value) {
4050b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
4060b57cec5SDimitry Andric     io.enumFallback<Hex8>(value);
4070b57cec5SDimitry Andric   }
4080b57cec5SDimitry Andric };
4090b57cec5SDimitry Andric 
4100b57cec5SDimitry Andric #define HANDLE_DW_LNE(unused, name)                                            \
4110b57cec5SDimitry Andric   io.enumCase(value, "DW_LNE_" #name, dwarf::DW_LNE_##name);
4120b57cec5SDimitry Andric 
4130b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::LineNumberExtendedOps> {
4140b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::LineNumberExtendedOps &value) {
4150b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
4160b57cec5SDimitry Andric     io.enumFallback<Hex16>(value);
4170b57cec5SDimitry Andric   }
4180b57cec5SDimitry Andric };
4190b57cec5SDimitry Andric 
4200b57cec5SDimitry Andric #define HANDLE_DW_AT(unused, name, unused2, unused3)                           \
4210b57cec5SDimitry Andric   io.enumCase(value, "DW_AT_" #name, dwarf::DW_AT_##name);
4220b57cec5SDimitry Andric 
4230b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::Attribute> {
4240b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::Attribute &value) {
4250b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
4260b57cec5SDimitry Andric     io.enumFallback<Hex16>(value);
4270b57cec5SDimitry Andric   }
4280b57cec5SDimitry Andric };
4290b57cec5SDimitry Andric 
4300b57cec5SDimitry Andric #define HANDLE_DW_FORM(unused, name, unused2, unused3)                         \
4310b57cec5SDimitry Andric   io.enumCase(value, "DW_FORM_" #name, dwarf::DW_FORM_##name);
4320b57cec5SDimitry Andric 
4330b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::Form> {
4340b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::Form &value) {
4350b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
4360b57cec5SDimitry Andric     io.enumFallback<Hex16>(value);
4370b57cec5SDimitry Andric   }
4380b57cec5SDimitry Andric };
4390b57cec5SDimitry Andric 
4400b57cec5SDimitry Andric #define HANDLE_DW_UT(unused, name)                                             \
4410b57cec5SDimitry Andric   io.enumCase(value, "DW_UT_" #name, dwarf::DW_UT_##name);
4420b57cec5SDimitry Andric 
4430b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::UnitType> {
4440b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::UnitType &value) {
4450b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
4460b57cec5SDimitry Andric     io.enumFallback<Hex8>(value);
4470b57cec5SDimitry Andric   }
4480b57cec5SDimitry Andric };
4490b57cec5SDimitry Andric 
4500b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::Constants> {
4510b57cec5SDimitry Andric   static void enumeration(IO &io, dwarf::Constants &value) {
4520b57cec5SDimitry Andric     io.enumCase(value, "DW_CHILDREN_no", dwarf::DW_CHILDREN_no);
4530b57cec5SDimitry Andric     io.enumCase(value, "DW_CHILDREN_yes", dwarf::DW_CHILDREN_yes);
4540b57cec5SDimitry Andric     io.enumFallback<Hex16>(value);
4550b57cec5SDimitry Andric   }
4560b57cec5SDimitry Andric };
4570b57cec5SDimitry Andric 
458e8d8bef9SDimitry Andric #define HANDLE_DW_RLE(unused, name)                                            \
459e8d8bef9SDimitry Andric   io.enumCase(value, "DW_RLE_" #name, dwarf::DW_RLE_##name);
460e8d8bef9SDimitry Andric 
461e8d8bef9SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::RnglistEntries> {
462e8d8bef9SDimitry Andric   static void enumeration(IO &io, dwarf::RnglistEntries &value) {
463e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
464e8d8bef9SDimitry Andric   }
465e8d8bef9SDimitry Andric };
466e8d8bef9SDimitry Andric 
467e8d8bef9SDimitry Andric #define HANDLE_DW_LLE(unused, name)                                            \
468e8d8bef9SDimitry Andric   io.enumCase(value, "DW_LLE_" #name, dwarf::DW_LLE_##name);
469e8d8bef9SDimitry Andric 
470e8d8bef9SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::LoclistEntries> {
471e8d8bef9SDimitry Andric   static void enumeration(IO &io, dwarf::LoclistEntries &value) {
472e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
473e8d8bef9SDimitry Andric   }
474e8d8bef9SDimitry Andric };
475e8d8bef9SDimitry Andric 
476e8d8bef9SDimitry Andric #define HANDLE_DW_OP(id, name, version, vendor)                                \
477e8d8bef9SDimitry Andric   io.enumCase(value, "DW_OP_" #name, dwarf::DW_OP_##name);
478e8d8bef9SDimitry Andric 
479e8d8bef9SDimitry Andric template <> struct ScalarEnumerationTraits<dwarf::LocationAtom> {
480e8d8bef9SDimitry Andric   static void enumeration(IO &io, dwarf::LocationAtom &value) {
481e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def"
482e8d8bef9SDimitry Andric     io.enumFallback<yaml::Hex8>(value);
483e8d8bef9SDimitry Andric   }
484e8d8bef9SDimitry Andric };
485e8d8bef9SDimitry Andric 
4860b57cec5SDimitry Andric } // end namespace yaml
4870b57cec5SDimitry Andric } // end namespace llvm
4880b57cec5SDimitry Andric 
4890b57cec5SDimitry Andric #endif // LLVM_OBJECTYAML_DWARFYAML_H
490