blob: d620008e22d218885d1e3cbb4a5c0ed4570a4df8 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//=- CodeViewYAMLDebugSections.h - CodeView YAMLIO debug sections -*- C++ -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines classes for handling the YAML representation of CodeView
11// Debug Info.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_OBJECTYAML_CODEVIEWYAMLDEBUGSECTIONS_H
16#define LLVM_OBJECTYAML_CODEVIEWYAMLDEBUGSECTIONS_H
17
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/DebugInfo/CodeView/CodeView.h"
21#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
22#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
23#include "llvm/Support/Error.h"
24#include "llvm/Support/YAMLTraits.h"
25#include <cstdint>
26#include <memory>
27#include <vector>
28
29namespace llvm {
30
31namespace codeview {
32
33class StringsAndChecksums;
34class StringsAndChecksumsRef;
35
36} // end namespace codeview
37
38namespace CodeViewYAML {
39
40namespace detail {
41
42struct YAMLSubsectionBase;
43
44} // end namespace detail
45
46struct YAMLFrameData {
47 uint32_t RvaStart;
48 uint32_t CodeSize;
49 uint32_t LocalSize;
50 uint32_t ParamsSize;
51 uint32_t MaxStackSize;
52 StringRef FrameFunc;
53 uint32_t PrologSize;
54 uint32_t SavedRegsSize;
55 uint32_t Flags;
56};
57
58struct YAMLCrossModuleImport {
59 StringRef ModuleName;
60 std::vector<uint32_t> ImportIds;
61};
62
63struct SourceLineEntry {
64 uint32_t Offset;
65 uint32_t LineStart;
66 uint32_t EndDelta;
67 bool IsStatement;
68};
69
70struct SourceColumnEntry {
71 uint16_t StartColumn;
72 uint16_t EndColumn;
73};
74
75struct SourceLineBlock {
76 StringRef FileName;
77 std::vector<SourceLineEntry> Lines;
78 std::vector<SourceColumnEntry> Columns;
79};
80
81struct HexFormattedString {
82 std::vector<uint8_t> Bytes;
83};
84
85struct SourceFileChecksumEntry {
86 StringRef FileName;
87 codeview::FileChecksumKind Kind;
88 HexFormattedString ChecksumBytes;
89};
90
91struct SourceLineInfo {
92 uint32_t RelocOffset;
93 uint32_t RelocSegment;
94 codeview::LineFlags Flags;
95 uint32_t CodeSize;
96 std::vector<SourceLineBlock> Blocks;
97};
98
99struct InlineeSite {
100 uint32_t Inlinee;
101 StringRef FileName;
102 uint32_t SourceLineNum;
103 std::vector<StringRef> ExtraFiles;
104};
105
106struct InlineeInfo {
107 bool HasExtraFiles;
108 std::vector<InlineeSite> Sites;
109};
110
111struct YAMLDebugSubsection {
112 static Expected<YAMLDebugSubsection>
113 fromCodeViewSubection(const codeview::StringsAndChecksumsRef &SC,
114 const codeview::DebugSubsectionRecord &SS);
115
116 std::shared_ptr<detail::YAMLSubsectionBase> Subsection;
117};
118
119struct DebugSubsectionState {};
120
121Expected<std::vector<std::shared_ptr<codeview::DebugSubsection>>>
122toCodeViewSubsectionList(BumpPtrAllocator &Allocator,
123 ArrayRef<YAMLDebugSubsection> Subsections,
124 const codeview::StringsAndChecksums &SC);
125
126std::vector<YAMLDebugSubsection>
127fromDebugS(ArrayRef<uint8_t> Data, const codeview::StringsAndChecksumsRef &SC);
128
129void initializeStringsAndChecksums(ArrayRef<YAMLDebugSubsection> Sections,
130 codeview::StringsAndChecksums &SC);
131
132} // end namespace CodeViewYAML
133
134} // end namespace llvm
135
136LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::YAMLDebugSubsection)
137
138LLVM_YAML_IS_SEQUENCE_VECTOR(CodeViewYAML::YAMLDebugSubsection)
139
140#endif // LLVM_OBJECTYAML_CODEVIEWYAMLDEBUGSECTIONS_H