1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- SymbolRecord.h -------------------------------------------*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORD_H
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORD_H
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/APSInt.h"
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/Optional.h"
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/CVRecord.h"
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/CodeView.h"
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/StreamArray.h"
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/StreamInterface.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeIndex.h"
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Endian.h"
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Error.h"
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace codeview {
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing llvm::support::ulittle16_t;
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing llvm::support::ulittle32_t;
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing llvm::support::little32_t;
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass SymbolRecord {
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprotected:
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  explicit SymbolRecord(SymbolRecordKind Kind) : Kind(Kind) {}
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SymbolRecordKind getKind() const { return Kind; }
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SymbolRecordKind Kind;
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_GPROC32, S_LPROC32, S_GPROC32_ID, S_LPROC32_ID, S_LPROC32_DPC or
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_LPROC32_DPC_ID
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ProcSym : public SymbolRecord {
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrParent;
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrEnd;
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrNext;
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeSize;
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t DbgStart;
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t DbgEnd;
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex FunctionType;
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeOffset;
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Flags; // ProcSymFlags enum
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   // Name: The null-terminated name follows.
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ProcSym(SymbolRecordKind Kind, uint32_t RecordOffset, const Hdr *H,
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          StringRef Name)
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset), Header(*H), Name(Name) {
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ProcSym> deserialize(SymbolRecordKind Kind,
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      uint32_t RecordOffset,
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      ArrayRef<uint8_t> &Data) {
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ProcSym(Kind, RecordOffset, H, Name);
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, CodeOffset);
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_THUNK32
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass Thunk32Sym : public SymbolRecord {
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Parent;
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t End;
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Next;
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Off;
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Seg;
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Len;
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Ord; // ThunkOrdinal enumeration
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 // Name: The null-terminated name follows.
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 // Variant portion of thunk
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Thunk32Sym(SymbolRecordKind Kind, uint32_t RecordOffset, const Hdr *H,
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             StringRef Name, ArrayRef<uint8_t> VariantData)
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset), Header(*H), Name(Name),
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        VariantData(VariantData) {}
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<Thunk32Sym> deserialize(SymbolRecordKind Kind,
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         uint32_t RecordOffset,
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         ArrayRef<uint8_t> &Data) {
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<uint8_t> VariantData;
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name, CV_ARRAY_FIELD_TAIL(VariantData));
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Thunk32Sym(Kind, RecordOffset, H, Name, VariantData);
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> VariantData;
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_TRAMPOLINE
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass TrampolineSym : public SymbolRecord {
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Type; // TrampolineType enum
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Size;
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t ThunkOff;
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t TargetOff;
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t ThunkSection;
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t TargetSection;
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TrampolineSym(SymbolRecordKind Kind, uint32_t RecordOffset, const Hdr *H)
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset), Header(*H) {}
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<TrampolineSym> deserialize(SymbolRecordKind Kind,
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            uint32_t RecordOffset,
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            ArrayRef<uint8_t> &Data) {
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return TrampolineSym(Kind, RecordOffset, H);
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_SECTION
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass SectionSym : public SymbolRecord {
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t SectionNumber;
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Alignment;
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Reserved; // Must be 0
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Rva;
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Length;
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Characteristics;
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SectionSym(SymbolRecordKind Kind, uint32_t RecordOffset, const Hdr *H,
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             StringRef Name)
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset), Header(*H), Name(Name) {
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<SectionSym> deserialize(SymbolRecordKind Kind,
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         uint32_t RecordOffset,
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         ArrayRef<uint8_t> &Data) {
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return SectionSym(Kind, RecordOffset, H, Name);
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_COFFGROUP
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass CoffGroupSym : public SymbolRecord {
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Size;
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Characteristics;
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Offset;
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CoffGroupSym(SymbolRecordKind Kind, uint32_t RecordOffset, const Hdr *H,
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               StringRef Name)
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset), Header(*H), Name(Name) {
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<CoffGroupSym> deserialize(SymbolRecordKind Kind,
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           uint32_t RecordOffset,
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           ArrayRef<uint8_t> &Data) {
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return CoffGroupSym(Kind, RecordOffset, H, Name);
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ScopeEndSym : public SymbolRecord {
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ScopeEndSym(SymbolRecordKind Kind, uint32_t RecordOffset)
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ScopeEndSym> deserialize(SymbolRecordKind Kind,
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ScopeEndSym(Kind, RecordOffset);
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass CallerSym : public SymbolRecord {
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Count;
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CallerSym(SymbolRecordKind Kind, uint32_t RecordOffset, const Hdr *Header,
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ArrayRef<TypeIndex> Indices)
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(Kind), RecordOffset(RecordOffset), Header(*Header),
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Indices(Indices) {}
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<CallerSym> deserialize(SymbolRecordKind Kind,
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        uint32_t RecordOffset,
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        ArrayRef<uint8_t> &Data) {
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *Header;
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<TypeIndex> Indices;
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, Header, CV_ARRAY_FIELD_N(Indices, Header->Count));
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return CallerSym(Kind, RecordOffset, Header, Indices);
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<TypeIndex> Indices;
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct BinaryAnnotationIterator {
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct AnnotationData {
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    BinaryAnnotationsOpCode OpCode;
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint32_t U1;
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint32_t U2;
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    int32_t S1;
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BinaryAnnotationIterator(ArrayRef<uint8_t> Annotations) : Data(Annotations) {}
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BinaryAnnotationIterator() {}
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BinaryAnnotationIterator(const BinaryAnnotationIterator &Other)
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : Data(Other.Data) {}
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator==(BinaryAnnotationIterator Other) const {
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Data == Other.Data;
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator!=(BinaryAnnotationIterator Other) const {
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return !(*this == Other);
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BinaryAnnotationIterator &operator=(const BinaryAnnotationIterator Other) {
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Data = Other.Data;
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return *this;
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BinaryAnnotationIterator &operator++() {
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!ParseCurrentAnnotation()) {
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      *this = BinaryAnnotationIterator();
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return *this;
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Data = Next;
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Next = ArrayRef<uint8_t>();
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Current.reset();
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return *this;
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BinaryAnnotationIterator operator++(int) {
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    BinaryAnnotationIterator Orig(*this);
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ++(*this);
298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Orig;
299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const AnnotationData &operator*() {
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ParseCurrentAnnotation();
303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Current.getValue();
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static uint32_t GetCompressedAnnotation(ArrayRef<uint8_t> &Annotations) {
308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Annotations.empty())
309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return -1;
310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t FirstByte = Annotations.front();
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Annotations = Annotations.drop_front();
313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if ((FirstByte & 0x80) == 0x00)
315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return FirstByte;
316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Annotations.empty())
318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return -1;
319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t SecondByte = Annotations.front();
321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Annotations = Annotations.drop_front();
322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if ((FirstByte & 0xC0) == 0x80)
324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ((FirstByte & 0x3F) << 8) | SecondByte;
325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Annotations.empty())
327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return -1;
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t ThirdByte = Annotations.front();
330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Annotations = Annotations.drop_front();
331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Annotations.empty())
333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return -1;
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t FourthByte = Annotations.front();
336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Annotations = Annotations.drop_front();
337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if ((FirstByte & 0xE0) == 0xC0)
339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ((FirstByte & 0x1F) << 24) | (SecondByte << 16) |
340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             (ThirdByte << 8) | FourthByte;
341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return -1;
343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static int32_t DecodeSignedOperand(uint32_t Operand) {
346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Operand & 1)
347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return -(Operand >> 1);
348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Operand >> 1;
349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static int32_t DecodeSignedOperand(ArrayRef<uint8_t> &Annotations) {
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DecodeSignedOperand(GetCompressedAnnotation(Annotations));
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool ParseCurrentAnnotation() {
356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Current.hasValue())
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return true;
358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Next = Data;
360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint32_t Op = GetCompressedAnnotation(Next);
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    AnnotationData Result;
362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result.OpCode = static_cast<BinaryAnnotationsOpCode>(Op);
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Result.OpCode) {
364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::Invalid:
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "Invalid";
366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Next = ArrayRef<uint8_t>();
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::CodeOffset:
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "CodeOffset";
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeCodeOffsetBase";
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeOffset:
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeCodeOffset";
378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeLength:
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeCodeLength";
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeFile:
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeFile";
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeLineEndDelta:
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeLineEndDelta";
390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeRangeKind:
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeRangeKind";
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeColumnStart:
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeColumnStart";
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeColumnEnd:
401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeColumnEnd";
402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeLineOffset:
405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeLineOffset";
406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.S1 = DecodeSignedOperand(Next);
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeColumnEndDelta";
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.S1 = DecodeSignedOperand(Next);
411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeCodeOffsetAndLineOffset";
414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      uint32_t Annotation = GetCompressedAnnotation(Next);
415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.S1 = DecodeSignedOperand(Annotation >> 4);
416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = Annotation & 0xf;
417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.Name = "ChangeCodeLengthAndCodeOffset";
421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U1 = GetCompressedAnnotation(Next);
422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Result.U2 = GetCompressedAnnotation(Next);
423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Current = Result;
427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Optional<AnnotationData> Current;
431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> Data;
432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> Next;
433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_INLINESITE
436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass InlineSiteSym : public SymbolRecord {
437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrParent;
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrEnd;
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Inlinee;
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // BinaryAnnotations
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  InlineSiteSym(uint32_t RecordOffset, const Hdr *H,
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                ArrayRef<uint8_t> Annotations)
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::InlineSiteSym),
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Annotations(Annotations) {}
449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<InlineSiteSym> deserialize(SymbolRecordKind Kind,
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            uint32_t RecordOffset,
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            ArrayRef<uint8_t> &Data) {
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<uint8_t> Annotations;
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Annotations));
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return InlineSiteSym(RecordOffset, H, Annotations);
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::iterator_range<BinaryAnnotationIterator> annotations() const {
461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return llvm::make_range(BinaryAnnotationIterator(Annotations),
462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            BinaryAnnotationIterator());
463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> Annotations;
470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_PUB32
473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass PublicSym32 : public SymbolRecord {
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Index; // Type index, or Metadata token if a managed symbol
477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Off;
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Seg;
479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PublicSym32(uint32_t RecordOffset, const Hdr *H, StringRef Name)
483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::PublicSym32), RecordOffset(RecordOffset),
484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<PublicSym32> deserialize(SymbolRecordKind Kind,
487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return PublicSym32(RecordOffset, H, Name);
494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_REGISTER
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass RegisterSym : public SymbolRecord {
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Index;    // Type index or Metadata token
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Register; // RegisterId enumeration
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  RegisterSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::RegisterSym), RecordOffset(RecordOffset),
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<RegisterSym> deserialize(SymbolRecordKind Kind,
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RegisterSym(RecordOffset, H, Name);
522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_PROCREF, S_LPROCREF
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ProcRefSym : public SymbolRecord {
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t SumName;   // SUC of the name (?)
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t SymOffset; // Offset of actual symbol in $$Symbols
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Mod;       // Module containing the actual symbol
536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           // Name:  The null-terminated name follows.
537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
539de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ProcRefSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::ProcRefSym), RecordOffset(RecordOffset),
541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ProcRefSym> deserialize(SymbolRecordKind Kind,
544de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         uint32_t RecordOffset,
545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         ArrayRef<uint8_t> &Data) {
546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ProcRefSym(RecordOffset, H, Name);
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
553de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_LOCAL
559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass LocalSym : public SymbolRecord {
560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
562de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;
563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Flags; // LocalSymFlags enum
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       // Name: The null-terminated name follows.
565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LocalSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::LocalSym), RecordOffset(RecordOffset),
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<LocalSym> deserialize(SymbolRecordKind Kind,
572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       uint32_t RecordOffset,
573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       ArrayRef<uint8_t> &Data) {
574de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
575de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
576de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return LocalSym(RecordOffset, H, Name);
579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct LocalVariableAddrRange {
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ulittle32_t OffsetStart;
588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ulittle16_t ISectStart;
589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ulittle16_t Range;
590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct LocalVariableAddrGap {
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ulittle16_t GapStartOffset;
594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ulittle16_t Range;
595de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarenum : uint16_t { MaxDefRange = 0xf000 };
598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE
600de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeSym : public SymbolRecord {
601de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Program;
604de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LocalVariableAddrRange Range;
605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LocalVariableAddrGap Gaps[];
606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
607de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeSym(uint32_t RecordOffset, const Hdr *H,
609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              ArrayRef<LocalVariableAddrGap> Gaps)
610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeSym), RecordOffset(RecordOffset),
611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Gaps(Gaps) {}
612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
613de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeSym> deserialize(SymbolRecordKind Kind,
614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
616de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps;
618de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Gaps));
619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeSym(RecordOffset, H, Gaps);
621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, Range);
625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
629de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<LocalVariableAddrGap> Gaps;
630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE_SUBFIELD
633de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeSubfieldSym : public SymbolRecord {
634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Program;
637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t OffsetInParent;
638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LocalVariableAddrRange Range;
639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LocalVariableAddrGap Gaps[];
640de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeSubfieldSym(uint32_t RecordOffset, const Hdr *H,
642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      ArrayRef<LocalVariableAddrGap> Gaps)
643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeSubfieldSym),
644de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Gaps(Gaps) {}
645de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
646de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeSubfieldSym> deserialize(SymbolRecordKind Kind,
647de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  uint32_t RecordOffset,
648de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  ArrayRef<uint8_t> &Data) {
649de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
650de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps;
651de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Gaps));
652de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
653de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeSubfieldSym(RecordOffset, H, Gaps);
654de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
655de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
656de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
657de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, Range);
658de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
659de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
660de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
661de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
662de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<LocalVariableAddrGap> Gaps;
663de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
664de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
665de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE_REGISTER
666de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeRegisterSym : public SymbolRecord {
667de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
668de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
669de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Register;
670de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t MayHaveNoName;
671de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LocalVariableAddrRange Range;
672de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LocalVariableAddrGap Gaps[];
673de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
674de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
675de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeRegisterSym(uint32_t RecordOffset, const Hdr *H,
676de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      ArrayRef<LocalVariableAddrGap> Gaps)
677de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeRegisterSym),
678de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Gaps(Gaps) {}
679de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
680de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeRegisterSym(uint16_t Register, uint16_t MayHaveNoName,
681de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      uint32_t OffsetStart, uint16_t ISectStart, uint16_t Range,
682de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      ArrayRef<LocalVariableAddrGap> Gaps)
683de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeRegisterSym), RecordOffset(0),
684de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Gaps(Gaps) {
685de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Register = Register;
686de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.MayHaveNoName = MayHaveNoName;
687de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Range.OffsetStart = OffsetStart;
688de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Range.ISectStart = ISectStart;
689de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Range.Range = Range;
690de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
691de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
692de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeRegisterSym> deserialize(SymbolRecordKind Kind,
693de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  uint32_t RecordOffset,
694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  ArrayRef<uint8_t> &Data) {
695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
696de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps;
697de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Gaps));
698de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
699de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeRegisterSym(RecordOffset, H, Gaps);
700de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
701de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
702de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
703de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, Range);
704de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
705de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
706de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
707de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
708de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<LocalVariableAddrGap> Gaps;
709de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
710de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
711de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE_SUBFIELD_REGISTER
712de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeSubfieldRegisterSym : public SymbolRecord {
713de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
714de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
715de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Register; // Register to which the variable is relative
716de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t MayHaveNoName;
717de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t OffsetInParent;
718de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LocalVariableAddrRange Range;
719de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LocalVariableAddrGap Gaps[];
720de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
722de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeSubfieldRegisterSym(uint32_t RecordOffset, const Hdr *H,
723de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              ArrayRef<LocalVariableAddrGap> Gaps)
724de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeSubfieldRegisterSym),
725de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Gaps(Gaps) {}
726de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
727de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeSubfieldRegisterSym(uint16_t Register, uint16_t MayHaveNoName,
728de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              uint32_t OffsetInParent,
729de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              ArrayRef<LocalVariableAddrGap> Gaps)
730de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeSubfieldRegisterSym),
731de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(0), Gaps(Gaps) {
732de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Register = Register;
733de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.MayHaveNoName = MayHaveNoName;
734de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.OffsetInParent = OffsetInParent;
735de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
736de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
737de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeSubfieldRegisterSym>
738de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  deserialize(SymbolRecordKind Kind, uint32_t RecordOffset,
739de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              ArrayRef<uint8_t> &Data) {
740de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
741de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps;
742de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Gaps));
743de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
744de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeSubfieldRegisterSym(RecordOffset, H, Gaps);
745de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
746de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
747de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
748de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, Range);
749de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
750de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
752de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
753de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<LocalVariableAddrGap> Gaps;
754de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
755de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
756de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE_FRAMEPOINTER_REL
757de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeFramePointerRelSym : public SymbolRecord {
758de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
760de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    little32_t Offset; // Offset from the frame pointer register
761de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LocalVariableAddrRange Range;
762de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LocalVariableAddrGap Gaps[];
763de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeFramePointerRelSym(uint32_t RecordOffset, const Hdr *H,
766de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             ArrayRef<LocalVariableAddrGap> Gaps)
767de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeFramePointerRelSym),
768de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Gaps(Gaps) {}
769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeFramePointerRelSym>
771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  deserialize(SymbolRecordKind Kind, uint32_t RecordOffset,
772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              ArrayRef<uint8_t> &Data) {
773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
774de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps;
775de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Gaps));
776de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeFramePointerRelSym(RecordOffset, H, Gaps);
778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, Range);
782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<LocalVariableAddrGap> Gaps;
787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE_REGISTER_REL
790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeRegisterRelSym : public SymbolRecord {
791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t BaseRegister;
794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Flags;
795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    little32_t BasePointerOffset;
796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LocalVariableAddrRange Range;
797de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LocalVariableAddrGap Gaps[];
798de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
799de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
800de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeRegisterRelSym(uint32_t RecordOffset, const Hdr *H,
801de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         ArrayRef<LocalVariableAddrGap> Gaps)
802de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeRegisterRelSym),
803de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Gaps(Gaps) {}
804de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
805de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeRegisterRelSym(uint16_t BaseRegister, uint16_t Flags,
806de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         int32_t BasePointerOffset, uint32_t OffsetStart,
807de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         uint16_t ISectStart, uint16_t Range,
808de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         ArrayRef<LocalVariableAddrGap> Gaps)
809de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeRegisterRelSym), RecordOffset(0),
810de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Gaps(Gaps) {
811de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.BaseRegister = BaseRegister;
812de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Flags = Flags;
813de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.BasePointerOffset = BasePointerOffset;
814de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Range.OffsetStart = OffsetStart;
815de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Range.ISectStart = ISectStart;
816de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Header.Range.Range = Range;
817de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
818de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
819de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeRegisterRelSym> deserialize(SymbolRecordKind Kind,
820de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                     uint32_t RecordOffset,
821de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                     ArrayRef<uint8_t> &Data) {
822de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
823de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps;
824de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_ARRAY_FIELD_TAIL(Gaps));
825de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
826de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeRegisterRelSym(RecordOffset, H, Gaps);
827de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
828de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
829de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool hasSpilledUDTMember() const { return Header.Flags & 1; }
830de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t offsetInParent() const { return Header.Flags >> 4; }
831de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
832de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
833de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, Range);
834de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
835de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
836de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
837de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
838de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<LocalVariableAddrGap> Gaps;
839de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
840de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
841de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE
842de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DefRangeFramePointerRelFullScopeSym : public SymbolRecord {
843de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
844de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
845de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    little32_t Offset; // Offset from the frame pointer register
846de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
847de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
848de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DefRangeFramePointerRelFullScopeSym(uint32_t RecordOffset, const Hdr *H)
849de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DefRangeFramePointerRelFullScopeSym),
850de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H) {}
851de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
852de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DefRangeFramePointerRelFullScopeSym>
853de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  deserialize(SymbolRecordKind Kind, uint32_t RecordOffset,
854de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              ArrayRef<uint8_t> &Data) {
855de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
856de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
857de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
858de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DefRangeFramePointerRelFullScopeSym(RecordOffset, H);
859de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
860de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
861de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
862de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
863de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
864de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
865de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_BLOCK32
866de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass BlockSym : public SymbolRecord {
867de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
868de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
869de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrParent;
870de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PtrEnd;
871de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeSize;
872de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeOffset;
873de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
874de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
875de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
876de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
877de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BlockSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
878de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::BlockSym), RecordOffset(RecordOffset),
879de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
880de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
881de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<BlockSym> deserialize(SymbolRecordKind Kind,
882de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       uint32_t RecordOffset,
883de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       ArrayRef<uint8_t> &Data) {
884de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
885de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
886de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
887de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
888de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return BlockSym(RecordOffset, H, Name);
889de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
890de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
891de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
892de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, CodeOffset);
893de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
894de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
895de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
896de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
897de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
898de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
899de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
900de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_LABEL32
901de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass LabelSym : public SymbolRecord {
902de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
903de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
904de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeOffset;
905de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
906de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Flags; // CV_PROCFLAGS
907de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   // Name: The null-terminated name follows.
908de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
909de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
910de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LabelSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
911de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::LabelSym), RecordOffset(RecordOffset),
912de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
913de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
914de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<LabelSym> deserialize(SymbolRecordKind Kind,
915de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       uint32_t RecordOffset,
916de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       ArrayRef<uint8_t> &Data) {
917de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
918de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
919de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
920de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
921de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return LabelSym(RecordOffset, H, Name);
922de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
923de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
924de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
925de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, CodeOffset);
926de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
927de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
928de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
929de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
930de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
931de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
932de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
933de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_OBJNAME
934de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ObjNameSym : public SymbolRecord {
935de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
936de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
937de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Signature;
938de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
939de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
940de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
941de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ObjNameSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
942de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::ObjNameSym), RecordOffset(RecordOffset),
943de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
944de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
945de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ObjNameSym> deserialize(SymbolRecordKind Kind,
946de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         uint32_t RecordOffset,
947de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         ArrayRef<uint8_t> &Data) {
948de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
949de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
950de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
951de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
952de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ObjNameSym(RecordOffset, H, Name);
953de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
954de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
955de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
956de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
957de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
958de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
959de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
960de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_ENVBLOCK
961de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass EnvBlockSym : public SymbolRecord {
962de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
963de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
964de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Reserved;
965de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Sequence of zero terminated strings.
966de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
967de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
968de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EnvBlockSym(uint32_t RecordOffset, const Hdr *H,
969de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              const std::vector<StringRef> &Fields)
970de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::EnvBlockSym), RecordOffset(RecordOffset),
971de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Fields(Fields) {}
972de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
973de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<EnvBlockSym> deserialize(SymbolRecordKind Kind,
974de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
975de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
976de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
977de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<StringRef> Fields;
978de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, CV_STRING_ARRAY_NULL_TERM(Fields));
979de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
980de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EnvBlockSym(RecordOffset, H, Fields);
981de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
982de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
983de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
984de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
985de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<StringRef> Fields;
986de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
987de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
988de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_EXPORT
989de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ExportSym : public SymbolRecord {
990de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
991de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
992de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Ordinal;
993de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Flags; // ExportFlags
994de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       // Name: The null-terminated name follows.
995de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
996de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
997de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ExportSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
998de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::ExportSym), RecordOffset(RecordOffset),
999de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
1000de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1001de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ExportSym> deserialize(SymbolRecordKind Kind,
1002de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        uint32_t RecordOffset,
1003de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        ArrayRef<uint8_t> &Data) {
1004de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1005de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1006de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1007de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1008de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ExportSym(RecordOffset, H, Name);
1009de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1010de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1011de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1012de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1013de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1014de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1015de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1016de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_FILESTATIC
1017de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass FileStaticSym : public SymbolRecord {
1018de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1019de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1020de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Index;             // Type Index
1021de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t ModFilenameOffset; // Index of mod filename in string table
1022de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Flags;             // LocalSymFlags enum
1023de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                   // Name: The null-terminated name follows.
1024de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1025de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1026de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  FileStaticSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
1027de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::FileStaticSym),
1028de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Name(Name) {}
1029de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1030de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<FileStaticSym> deserialize(SymbolRecordKind Kind,
1031de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            uint32_t RecordOffset,
1032de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            ArrayRef<uint8_t> &Data) {
1033de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1034de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1035de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1036de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1037de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return FileStaticSym(RecordOffset, H, Name);
1038de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1039de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1040de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1041de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1042de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1043de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1044de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1045de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_COMPILE2
1046de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass Compile2Sym : public SymbolRecord {
1047de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1048de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1049de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t flags; // CompileSym2Flags enum
1050de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t getLanguage() const { return flags & 0xFF; }
1051de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short Machine; // CPUType enum
1052de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short VersionFrontendMajor;
1053de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short VersionFrontendMinor;
1054de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short VersionFrontendBuild;
1055de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short VersionBackendMajor;
1056de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short VersionBackendMinor;
1057de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned short VersionBackendBuild;
1058de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Version: The null-terminated version string follows.
1059de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Optional block of zero terminated strings terminated with a double zero.
1060de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1061de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1062de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Compile2Sym(uint32_t RecordOffset, const Hdr *H, StringRef Version)
1063de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::Compile2Sym), RecordOffset(RecordOffset),
1064de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Version(Version) {}
1065de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1066de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<Compile2Sym> deserialize(SymbolRecordKind Kind,
1067de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
1068de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
1069de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1070de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Version;
1071de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Version);
1072de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1073de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Compile2Sym(RecordOffset, H, Version);
1074de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1075de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1076de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1077de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1078de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Version;
1079de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1080de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1081de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_COMPILE3
1082de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass Compile3Sym : public SymbolRecord {
1083de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1084de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1085de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t flags; // CompileSym3Flags enum
1086de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t getLanguage() const { return flags & 0xff; }
1087de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Machine; // CPUType enum
1088de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionFrontendMajor;
1089de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionFrontendMinor;
1090de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionFrontendBuild;
1091de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionFrontendQFE;
1092de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionBackendMajor;
1093de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionBackendMinor;
1094de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionBackendBuild;
1095de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t VersionBackendQFE;
1096de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // VersionString: The null-terminated version string follows.
1097de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1098de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1099de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Compile3Sym(uint32_t RecordOffset, const Hdr *H, StringRef Version)
1100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::Compile3Sym), RecordOffset(RecordOffset),
1101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Version(Version) {}
1102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<Compile3Sym> deserialize(SymbolRecordKind Kind,
1104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
1105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
1106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Version;
1108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Version);
1109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Compile3Sym(RecordOffset, H, Version);
1111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Version;
1116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_FRAMEPROC
1119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass FrameProcSym : public SymbolRecord {
1120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t TotalFrameBytes;
1123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t PaddingFrameBytes;
1124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t OffsetToPadding;
1125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t BytesOfCalleeSavedRegisters;
1126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t OffsetOfExceptionHandler;
1127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t SectionIdOfExceptionHandler;
1128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Flags;
1129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  FrameProcSym(uint32_t RecordOffset, const Hdr *H)
1132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::FrameProcSym),
1133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H) {}
1134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<FrameProcSym> deserialize(SymbolRecordKind Kind,
1136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           uint32_t RecordOffset,
1137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           ArrayRef<uint8_t> &Data) {
1138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
1140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return FrameProcSym(RecordOffset, H);
1142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_CALLSITEINFO
1149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass CallSiteInfoSym : public SymbolRecord {
1150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeOffset;
1153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
1154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Reserved;
1155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;
1156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CallSiteInfoSym(uint32_t RecordOffset, const Hdr *H)
1159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::CallSiteInfoSym),
1160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H) {}
1161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<CallSiteInfoSym> deserialize(SymbolRecordKind Kind,
1163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              uint32_t RecordOffset,
1164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              ArrayRef<uint8_t> &Data) {
1165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
1167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return CallSiteInfoSym(RecordOffset, H);
1169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
1172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, CodeOffset);
1173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_HEAPALLOCSITE
1180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass HeapAllocationSiteSym : public SymbolRecord {
1181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeOffset;
1184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
1185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t CallInstructionSize;
1186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;
1187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  HeapAllocationSiteSym(uint32_t RecordOffset, const Hdr *H)
1190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::HeapAllocationSiteSym),
1191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H) {}
1192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<HeapAllocationSiteSym> deserialize(SymbolRecordKind Kind,
1194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                    uint32_t RecordOffset,
1195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                    ArrayRef<uint8_t> &Data) {
1196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
1198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return HeapAllocationSiteSym(RecordOffset, H);
1200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
1203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, CodeOffset);
1204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_FRAMECOOKIE
1211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass FrameCookieSym : public SymbolRecord {
1212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t CodeOffset;
1215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Register;
1216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t CookieKind;
1217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Flags;
1218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  FrameCookieSym(uint32_t RecordOffset, const Hdr *H)
1221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::FrameCookieSym),
1222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H) {}
1223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<FrameCookieSym> deserialize(SymbolRecordKind Kind,
1225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             uint32_t RecordOffset,
1226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             ArrayRef<uint8_t> &Data) {
1227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
1229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return FrameCookieSym(RecordOffset, H);
1231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
1234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, CodeOffset);
1235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_UDT, S_COBOLUDT
1242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass UDTSym : public SymbolRecord {
1243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type; // Type of the UDT
1246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    // Name: The null-terminated name follows.
1247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  UDTSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
1250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::UDTSym), RecordOffset(RecordOffset),
1251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
1252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<UDTSym> deserialize(SymbolRecordKind Kind,
1254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     uint32_t RecordOffset,
1255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     ArrayRef<uint8_t> &Data) {
1256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return UDTSym(RecordOffset, H, Name);
1261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_BUILDINFO
1269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass BuildInfoSym : public SymbolRecord {
1270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t BuildId;
1273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BuildInfoSym(uint32_t RecordOffset, const Hdr *H)
1276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::BuildInfoSym),
1277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H) {}
1278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<BuildInfoSym> deserialize(SymbolRecordKind Kind,
1280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           uint32_t RecordOffset,
1281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           ArrayRef<uint8_t> &Data) {
1282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H);
1284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return BuildInfoSym(RecordOffset, H);
1286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_BPREL32
1293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass BPRelativeSym : public SymbolRecord {
1294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    little32_t Offset; // Offset from the base pointer register
1297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;    // Type of the variable
1298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       // Name: The null-terminated name follows.
1299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BPRelativeSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
1302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::BPRelativeSym),
1303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Name(Name) {}
1304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<BPRelativeSym> deserialize(SymbolRecordKind Kind,
1306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            uint32_t RecordOffset,
1307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            ArrayRef<uint8_t> &Data) {
1308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return BPRelativeSym(RecordOffset, H, Name);
1313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_REGREL32
1321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass RegRelativeSym : public SymbolRecord {
1322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t Offset;   // Offset from the register
1325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;       // Type of the variable
1326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Register; // Register to which the variable is relative
1327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          // Name: The null-terminated name follows.
1328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  RegRelativeSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
1331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::RegRelativeSym),
1332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Name(Name) {}
1333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<RegRelativeSym> deserialize(SymbolRecordKind Kind,
1335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             uint32_t RecordOffset,
1336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             ArrayRef<uint8_t> &Data) {
1337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RegRelativeSym(RecordOffset, H, Name);
1342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_CONSTANT, S_MANCONSTANT
1350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ConstantSym : public SymbolRecord {
1351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;
1354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Value: The value of the constant.
1355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
1356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ConstantSym(uint32_t RecordOffset, const Hdr *H, const APSInt &Value,
1359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              StringRef Name)
1360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::ConstantSym), RecordOffset(RecordOffset),
1361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Value(Value), Name(Name) {}
1362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ConstantSym> deserialize(SymbolRecordKind Kind,
1364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          uint32_t RecordOffset,
1365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> &Data) {
1366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APSInt Value;
1368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Value, Name);
1370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantSym(RecordOffset, H, Value, Name);
1372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  APSInt Value;
1377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_LDATA32, S_GDATA32, S_LMANDATA, S_GMANDATA
1381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass DataSym : public SymbolRecord {
1382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;
1385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t DataOffset;
1386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
1387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
1388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DataSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
1391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::DataSym), RecordOffset(RecordOffset),
1392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Header(*H), Name(Name) {}
1393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<DataSym> deserialize(SymbolRecordKind Kind,
1395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      uint32_t RecordOffset,
1396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      ArrayRef<uint8_t> &Data) {
1397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DataSym(RecordOffset, H, Name);
1402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
1405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, DataOffset);
1406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// S_LTHREAD32, S_GTHREAD32
1414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ThreadLocalDataSym : public SymbolRecord {
1415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
1416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Hdr {
1417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TypeIndex Type;
1418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle32_t DataOffset;
1419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ulittle16_t Segment;
1420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Name: The null-terminated name follows.
1421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
1422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ThreadLocalDataSym(uint32_t RecordOffset, const Hdr *H, StringRef Name)
1424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : SymbolRecord(SymbolRecordKind::ThreadLocalDataSym),
1425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        RecordOffset(RecordOffset), Header(*H), Name(Name) {}
1426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static ErrorOr<ThreadLocalDataSym> deserialize(SymbolRecordKind Kind,
1428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                 uint32_t RecordOffset,
1429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                 ArrayRef<uint8_t> &Data) {
1430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Hdr *H = nullptr;
1431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name;
1432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, H, Name);
1433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ThreadLocalDataSym(RecordOffset, H, Name);
1435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t getRelocationOffset() const {
1438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return RecordOffset + offsetof(Hdr, DataOffset);
1439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t RecordOffset;
1442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Hdr Header;
1443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
1444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartypedef CVRecord<SymbolKind> CVSymbol;
1447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartypedef VarStreamArray<CVSymbol> CVSymbolArray;
1448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // namespace codeview
1450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // namespace llvm
1451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif
1453