1d88c1a5aSDimitry Andric //===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
2d88c1a5aSDimitry Andric //
3d88c1a5aSDimitry Andric //                     The LLVM Compiler Infrastructure
4d88c1a5aSDimitry Andric //
5d88c1a5aSDimitry Andric // This file is distributed under the University of Illinois Open Source
6d88c1a5aSDimitry Andric // License. See LICENSE.TXT for details.
7d88c1a5aSDimitry Andric //
8d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===//
9d88c1a5aSDimitry Andric 
10d88c1a5aSDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
11d88c1a5aSDimitry Andric 
12d88c1a5aSDimitry Andric using namespace llvm;
13d88c1a5aSDimitry Andric using namespace llvm::codeview;
14d88c1a5aSDimitry Andric 
15d88c1a5aSDimitry Andric #define error(X)                                                               \
16d88c1a5aSDimitry Andric   if (auto EC = X)                                                             \
17d88c1a5aSDimitry Andric     return EC;
18d88c1a5aSDimitry Andric 
19d88c1a5aSDimitry Andric namespace {
20d88c1a5aSDimitry Andric struct MapGap {
operator ()__anonc85f1d7d0111::MapGap21d88c1a5aSDimitry Andric   Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
22d88c1a5aSDimitry Andric     error(IO.mapInteger(Gap.GapStartOffset));
23d88c1a5aSDimitry Andric     error(IO.mapInteger(Gap.Range));
24d88c1a5aSDimitry Andric     return Error::success();
25d88c1a5aSDimitry Andric   }
26d88c1a5aSDimitry Andric };
27d88c1a5aSDimitry Andric }
28d88c1a5aSDimitry Andric 
mapLocalVariableAddrRange(CodeViewRecordIO & IO,LocalVariableAddrRange & Range)29d88c1a5aSDimitry Andric static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
30d88c1a5aSDimitry Andric                                        LocalVariableAddrRange &Range) {
31d88c1a5aSDimitry Andric   error(IO.mapInteger(Range.OffsetStart));
32d88c1a5aSDimitry Andric   error(IO.mapInteger(Range.ISectStart));
33d88c1a5aSDimitry Andric   error(IO.mapInteger(Range.Range));
34d88c1a5aSDimitry Andric   return Error::success();
35d88c1a5aSDimitry Andric }
36d88c1a5aSDimitry Andric 
visitSymbolBegin(CVSymbol & Record)37d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
38d88c1a5aSDimitry Andric   error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
39d88c1a5aSDimitry Andric   return Error::success();
40d88c1a5aSDimitry Andric }
41d88c1a5aSDimitry Andric 
visitSymbolEnd(CVSymbol & Record)42d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
436d97bb29SDimitry Andric   error(IO.padToAlignment(alignOf(Container)));
44d88c1a5aSDimitry Andric   error(IO.endRecord());
45d88c1a5aSDimitry Andric   return Error::success();
46d88c1a5aSDimitry Andric }
47d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,BlockSym & Block)48d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
49d88c1a5aSDimitry Andric 
50d88c1a5aSDimitry Andric   error(IO.mapInteger(Block.Parent));
51d88c1a5aSDimitry Andric   error(IO.mapInteger(Block.End));
52d88c1a5aSDimitry Andric   error(IO.mapInteger(Block.CodeSize));
53d88c1a5aSDimitry Andric   error(IO.mapInteger(Block.CodeOffset));
54d88c1a5aSDimitry Andric   error(IO.mapInteger(Block.Segment));
55d88c1a5aSDimitry Andric   error(IO.mapStringZ(Block.Name));
56d88c1a5aSDimitry Andric 
57d88c1a5aSDimitry Andric   return Error::success();
58d88c1a5aSDimitry Andric }
59d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,Thunk32Sym & Thunk)60d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
61d88c1a5aSDimitry Andric 
62d88c1a5aSDimitry Andric   error(IO.mapInteger(Thunk.Parent));
63d88c1a5aSDimitry Andric   error(IO.mapInteger(Thunk.End));
64d88c1a5aSDimitry Andric   error(IO.mapInteger(Thunk.Next));
65d88c1a5aSDimitry Andric   error(IO.mapInteger(Thunk.Offset));
66d88c1a5aSDimitry Andric   error(IO.mapInteger(Thunk.Segment));
67d88c1a5aSDimitry Andric   error(IO.mapInteger(Thunk.Length));
68d88c1a5aSDimitry Andric   error(IO.mapEnum(Thunk.Thunk));
69d88c1a5aSDimitry Andric   error(IO.mapStringZ(Thunk.Name));
70d88c1a5aSDimitry Andric   error(IO.mapByteVectorTail(Thunk.VariantData));
71d88c1a5aSDimitry Andric 
72d88c1a5aSDimitry Andric   return Error::success();
73d88c1a5aSDimitry Andric }
74d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,TrampolineSym & Tramp)75d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
76d88c1a5aSDimitry Andric                                             TrampolineSym &Tramp) {
77d88c1a5aSDimitry Andric 
78d88c1a5aSDimitry Andric   error(IO.mapEnum(Tramp.Type));
79d88c1a5aSDimitry Andric   error(IO.mapInteger(Tramp.Size));
80d88c1a5aSDimitry Andric   error(IO.mapInteger(Tramp.ThunkOffset));
81d88c1a5aSDimitry Andric   error(IO.mapInteger(Tramp.TargetOffset));
82d88c1a5aSDimitry Andric   error(IO.mapInteger(Tramp.ThunkSection));
83d88c1a5aSDimitry Andric   error(IO.mapInteger(Tramp.TargetSection));
84d88c1a5aSDimitry Andric 
85d88c1a5aSDimitry Andric   return Error::success();
86d88c1a5aSDimitry Andric }
87d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,SectionSym & Section)88d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
89d88c1a5aSDimitry Andric                                             SectionSym &Section) {
90d88c1a5aSDimitry Andric   uint8_t Padding = 0;
91d88c1a5aSDimitry Andric 
92d88c1a5aSDimitry Andric   error(IO.mapInteger(Section.SectionNumber));
93d88c1a5aSDimitry Andric   error(IO.mapInteger(Section.Alignment));
94d88c1a5aSDimitry Andric   error(IO.mapInteger(Padding));
95d88c1a5aSDimitry Andric   error(IO.mapInteger(Section.Rva));
96d88c1a5aSDimitry Andric   error(IO.mapInteger(Section.Length));
97d88c1a5aSDimitry Andric   error(IO.mapInteger(Section.Characteristics));
98d88c1a5aSDimitry Andric   error(IO.mapStringZ(Section.Name));
99d88c1a5aSDimitry Andric 
100d88c1a5aSDimitry Andric   return Error::success();
101d88c1a5aSDimitry Andric }
102d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,CoffGroupSym & CoffGroup)103d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
104d88c1a5aSDimitry Andric                                             CoffGroupSym &CoffGroup) {
105d88c1a5aSDimitry Andric 
106d88c1a5aSDimitry Andric   error(IO.mapInteger(CoffGroup.Size));
107d88c1a5aSDimitry Andric   error(IO.mapInteger(CoffGroup.Characteristics));
108d88c1a5aSDimitry Andric   error(IO.mapInteger(CoffGroup.Offset));
109d88c1a5aSDimitry Andric   error(IO.mapInteger(CoffGroup.Segment));
110d88c1a5aSDimitry Andric   error(IO.mapStringZ(CoffGroup.Name));
111d88c1a5aSDimitry Andric 
112d88c1a5aSDimitry Andric   return Error::success();
113d88c1a5aSDimitry Andric }
114d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,BPRelativeSym & BPRel)115d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
116d88c1a5aSDimitry Andric                                             BPRelativeSym &BPRel) {
117d88c1a5aSDimitry Andric 
118d88c1a5aSDimitry Andric   error(IO.mapInteger(BPRel.Offset));
119d88c1a5aSDimitry Andric   error(IO.mapInteger(BPRel.Type));
120d88c1a5aSDimitry Andric   error(IO.mapStringZ(BPRel.Name));
121d88c1a5aSDimitry Andric 
122d88c1a5aSDimitry Andric   return Error::success();
123d88c1a5aSDimitry Andric }
124d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,BuildInfoSym & BuildInfo)125d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
126d88c1a5aSDimitry Andric                                             BuildInfoSym &BuildInfo) {
127d88c1a5aSDimitry Andric 
128d88c1a5aSDimitry Andric   error(IO.mapInteger(BuildInfo.BuildId));
129d88c1a5aSDimitry Andric 
130d88c1a5aSDimitry Andric   return Error::success();
131d88c1a5aSDimitry Andric }
132d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,CallSiteInfoSym & CallSiteInfo)133d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
134d88c1a5aSDimitry Andric                                             CallSiteInfoSym &CallSiteInfo) {
135d88c1a5aSDimitry Andric   uint16_t Padding = 0;
136d88c1a5aSDimitry Andric 
137d88c1a5aSDimitry Andric   error(IO.mapInteger(CallSiteInfo.CodeOffset));
138d88c1a5aSDimitry Andric   error(IO.mapInteger(CallSiteInfo.Segment));
139d88c1a5aSDimitry Andric   error(IO.mapInteger(Padding));
140d88c1a5aSDimitry Andric   error(IO.mapInteger(CallSiteInfo.Type));
141d88c1a5aSDimitry Andric 
142d88c1a5aSDimitry Andric   return Error::success();
143d88c1a5aSDimitry Andric }
144d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,EnvBlockSym & EnvBlock)145d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
146d88c1a5aSDimitry Andric                                             EnvBlockSym &EnvBlock) {
147d88c1a5aSDimitry Andric 
148d88c1a5aSDimitry Andric   uint8_t Reserved = 0;
149d88c1a5aSDimitry Andric   error(IO.mapInteger(Reserved));
150d88c1a5aSDimitry Andric   error(IO.mapStringZVectorZ(EnvBlock.Fields));
151d88c1a5aSDimitry Andric 
152d88c1a5aSDimitry Andric   return Error::success();
153d88c1a5aSDimitry Andric }
154d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,FileStaticSym & FileStatic)155d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
156d88c1a5aSDimitry Andric                                             FileStaticSym &FileStatic) {
157d88c1a5aSDimitry Andric 
158d88c1a5aSDimitry Andric   error(IO.mapInteger(FileStatic.Index));
159d88c1a5aSDimitry Andric   error(IO.mapInteger(FileStatic.ModFilenameOffset));
160d88c1a5aSDimitry Andric   error(IO.mapEnum(FileStatic.Flags));
161d88c1a5aSDimitry Andric   error(IO.mapStringZ(FileStatic.Name));
162d88c1a5aSDimitry Andric 
163d88c1a5aSDimitry Andric   return Error::success();
164d88c1a5aSDimitry Andric }
165d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ExportSym & Export)166d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
167d88c1a5aSDimitry Andric 
168d88c1a5aSDimitry Andric   error(IO.mapInteger(Export.Ordinal));
169d88c1a5aSDimitry Andric   error(IO.mapEnum(Export.Flags));
170d88c1a5aSDimitry Andric   error(IO.mapStringZ(Export.Name));
171d88c1a5aSDimitry Andric 
172d88c1a5aSDimitry Andric   return Error::success();
173d88c1a5aSDimitry Andric }
174d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,Compile2Sym & Compile2)175d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
176d88c1a5aSDimitry Andric                                             Compile2Sym &Compile2) {
177d88c1a5aSDimitry Andric 
178d88c1a5aSDimitry Andric   error(IO.mapEnum(Compile2.Flags));
179d88c1a5aSDimitry Andric   error(IO.mapEnum(Compile2.Machine));
180d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile2.VersionFrontendMajor));
181d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile2.VersionFrontendMinor));
182d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile2.VersionFrontendBuild));
183d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile2.VersionBackendMajor));
184d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile2.VersionBackendMinor));
185d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile2.VersionBackendBuild));
186d88c1a5aSDimitry Andric   error(IO.mapStringZ(Compile2.Version));
187d88c1a5aSDimitry Andric   error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
188d88c1a5aSDimitry Andric 
189d88c1a5aSDimitry Andric   return Error::success();
190d88c1a5aSDimitry Andric }
191d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,Compile3Sym & Compile3)192d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
193d88c1a5aSDimitry Andric                                             Compile3Sym &Compile3) {
194d88c1a5aSDimitry Andric 
195d88c1a5aSDimitry Andric   error(IO.mapEnum(Compile3.Flags));
196d88c1a5aSDimitry Andric   error(IO.mapEnum(Compile3.Machine));
197d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionFrontendMajor));
198d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionFrontendMinor));
199d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionFrontendBuild));
200d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionFrontendQFE));
201d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionBackendMajor));
202d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionBackendMinor));
203d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionBackendBuild));
204d88c1a5aSDimitry Andric   error(IO.mapInteger(Compile3.VersionBackendQFE));
205d88c1a5aSDimitry Andric   error(IO.mapStringZ(Compile3.Version));
206d88c1a5aSDimitry Andric 
207d88c1a5aSDimitry Andric   return Error::success();
208d88c1a5aSDimitry Andric }
209d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ConstantSym & Constant)210d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
211d88c1a5aSDimitry Andric                                             ConstantSym &Constant) {
212d88c1a5aSDimitry Andric 
213d88c1a5aSDimitry Andric   error(IO.mapInteger(Constant.Type));
214d88c1a5aSDimitry Andric   error(IO.mapEncodedInteger(Constant.Value));
215d88c1a5aSDimitry Andric   error(IO.mapStringZ(Constant.Name));
216d88c1a5aSDimitry Andric 
217d88c1a5aSDimitry Andric   return Error::success();
218d88c1a5aSDimitry Andric }
219d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DataSym & Data)220d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
221d88c1a5aSDimitry Andric 
222d88c1a5aSDimitry Andric   error(IO.mapInteger(Data.Type));
223d88c1a5aSDimitry Andric   error(IO.mapInteger(Data.DataOffset));
224d88c1a5aSDimitry Andric   error(IO.mapInteger(Data.Segment));
225d88c1a5aSDimitry Andric   error(IO.mapStringZ(Data.Name));
226d88c1a5aSDimitry Andric 
227d88c1a5aSDimitry Andric   return Error::success();
228d88c1a5aSDimitry Andric }
229d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelSym & DefRangeFramePointerRel)230d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
231d88c1a5aSDimitry Andric     CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
232d88c1a5aSDimitry Andric 
233d88c1a5aSDimitry Andric   error(IO.mapInteger(DefRangeFramePointerRel.Offset));
234d88c1a5aSDimitry Andric   error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
235d88c1a5aSDimitry Andric   error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
236d88c1a5aSDimitry Andric 
237d88c1a5aSDimitry Andric   return Error::success();
238d88c1a5aSDimitry Andric }
239d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelFullScopeSym & DefRangeFramePointerRelFullScope)240d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
241d88c1a5aSDimitry Andric     CVSymbol &CVR,
242d88c1a5aSDimitry Andric     DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
243d88c1a5aSDimitry Andric 
244d88c1a5aSDimitry Andric   error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
245d88c1a5aSDimitry Andric 
246d88c1a5aSDimitry Andric   return Error::success();
247d88c1a5aSDimitry Andric }
248d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterRelSym & DefRangeRegisterRel)249d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
250d88c1a5aSDimitry Andric     CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
251d88c1a5aSDimitry Andric 
252d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
253d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
254d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
255d88c1a5aSDimitry Andric   error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
256d88c1a5aSDimitry Andric   error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
257d88c1a5aSDimitry Andric 
258d88c1a5aSDimitry Andric   return Error::success();
259d88c1a5aSDimitry Andric }
260d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterSym & DefRangeRegister)261d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
262d88c1a5aSDimitry Andric     CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
263d88c1a5aSDimitry Andric 
264d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeRegister.Hdr.Register));
265d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
266d88c1a5aSDimitry Andric   error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
267d88c1a5aSDimitry Andric   error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
268d88c1a5aSDimitry Andric 
269d88c1a5aSDimitry Andric   return Error::success();
270d88c1a5aSDimitry Andric }
271d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldRegisterSym & DefRangeSubfieldRegister)272d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
273d88c1a5aSDimitry Andric     CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
274d88c1a5aSDimitry Andric 
275d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
276d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
277d88c1a5aSDimitry Andric   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
278d88c1a5aSDimitry Andric   error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
279d88c1a5aSDimitry Andric   error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
280d88c1a5aSDimitry Andric 
281d88c1a5aSDimitry Andric   return Error::success();
282d88c1a5aSDimitry Andric }
283d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldSym & DefRangeSubfield)284d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
285d88c1a5aSDimitry Andric     CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
286d88c1a5aSDimitry Andric 
287d88c1a5aSDimitry Andric   error(IO.mapInteger(DefRangeSubfield.Program));
288d88c1a5aSDimitry Andric   error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
289d88c1a5aSDimitry Andric   error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
290d88c1a5aSDimitry Andric   error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
291d88c1a5aSDimitry Andric 
292d88c1a5aSDimitry Andric   return Error::success();
293d88c1a5aSDimitry Andric }
294d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeSym & DefRange)295d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
296d88c1a5aSDimitry Andric                                             DefRangeSym &DefRange) {
297d88c1a5aSDimitry Andric 
298d88c1a5aSDimitry Andric   error(IO.mapInteger(DefRange.Program));
299d88c1a5aSDimitry Andric   error(mapLocalVariableAddrRange(IO, DefRange.Range));
300d88c1a5aSDimitry Andric   error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
301d88c1a5aSDimitry Andric 
302d88c1a5aSDimitry Andric   return Error::success();
303d88c1a5aSDimitry Andric }
304d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,FrameCookieSym & FrameCookie)305d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
306d88c1a5aSDimitry Andric                                             FrameCookieSym &FrameCookie) {
307d88c1a5aSDimitry Andric 
308d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameCookie.CodeOffset));
309d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameCookie.Register));
31024d58133SDimitry Andric   error(IO.mapEnum(FrameCookie.CookieKind));
311d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameCookie.Flags));
312d88c1a5aSDimitry Andric 
313d88c1a5aSDimitry Andric   return Error::success();
314d88c1a5aSDimitry Andric }
315d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,FrameProcSym & FrameProc)316d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
317d88c1a5aSDimitry Andric                                             FrameProcSym &FrameProc) {
318d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameProc.TotalFrameBytes));
319d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameProc.PaddingFrameBytes));
320d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameProc.OffsetToPadding));
321d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
322d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
323d88c1a5aSDimitry Andric   error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
324d88c1a5aSDimitry Andric   error(IO.mapEnum(FrameProc.Flags));
325d88c1a5aSDimitry Andric 
326d88c1a5aSDimitry Andric   return Error::success();
327d88c1a5aSDimitry Andric }
328d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,HeapAllocationSiteSym & HeapAllocSite)329d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
330d88c1a5aSDimitry Andric     CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
331d88c1a5aSDimitry Andric 
332d88c1a5aSDimitry Andric   error(IO.mapInteger(HeapAllocSite.CodeOffset));
333d88c1a5aSDimitry Andric   error(IO.mapInteger(HeapAllocSite.Segment));
334d88c1a5aSDimitry Andric   error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
335d88c1a5aSDimitry Andric   error(IO.mapInteger(HeapAllocSite.Type));
336d88c1a5aSDimitry Andric 
337d88c1a5aSDimitry Andric   return Error::success();
338d88c1a5aSDimitry Andric }
339d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,InlineSiteSym & InlineSite)340d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
341d88c1a5aSDimitry Andric                                             InlineSiteSym &InlineSite) {
342d88c1a5aSDimitry Andric 
343d88c1a5aSDimitry Andric   error(IO.mapInteger(InlineSite.Parent));
344d88c1a5aSDimitry Andric   error(IO.mapInteger(InlineSite.End));
345d88c1a5aSDimitry Andric   error(IO.mapInteger(InlineSite.Inlinee));
346d88c1a5aSDimitry Andric   error(IO.mapByteVectorTail(InlineSite.AnnotationData));
347d88c1a5aSDimitry Andric 
348d88c1a5aSDimitry Andric   return Error::success();
349d88c1a5aSDimitry Andric }
350d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,RegisterSym & Register)351d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
352d88c1a5aSDimitry Andric                                             RegisterSym &Register) {
353d88c1a5aSDimitry Andric 
354d88c1a5aSDimitry Andric   error(IO.mapInteger(Register.Index));
355d88c1a5aSDimitry Andric   error(IO.mapEnum(Register.Register));
356d88c1a5aSDimitry Andric   error(IO.mapStringZ(Register.Name));
357d88c1a5aSDimitry Andric 
358d88c1a5aSDimitry Andric   return Error::success();
359d88c1a5aSDimitry Andric }
360d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,PublicSym32 & Public)361d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
362d88c1a5aSDimitry Andric                                             PublicSym32 &Public) {
363d88c1a5aSDimitry Andric 
364edd7eaddSDimitry Andric   error(IO.mapEnum(Public.Flags));
365d88c1a5aSDimitry Andric   error(IO.mapInteger(Public.Offset));
366d88c1a5aSDimitry Andric   error(IO.mapInteger(Public.Segment));
367d88c1a5aSDimitry Andric   error(IO.mapStringZ(Public.Name));
368d88c1a5aSDimitry Andric 
369d88c1a5aSDimitry Andric   return Error::success();
370d88c1a5aSDimitry Andric }
371d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ProcRefSym & ProcRef)372d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
373d88c1a5aSDimitry Andric                                             ProcRefSym &ProcRef) {
374d88c1a5aSDimitry Andric 
375d88c1a5aSDimitry Andric   error(IO.mapInteger(ProcRef.SumName));
376d88c1a5aSDimitry Andric   error(IO.mapInteger(ProcRef.SymOffset));
377d88c1a5aSDimitry Andric   error(IO.mapInteger(ProcRef.Module));
378d88c1a5aSDimitry Andric   error(IO.mapStringZ(ProcRef.Name));
379d88c1a5aSDimitry Andric 
380d88c1a5aSDimitry Andric   return Error::success();
381d88c1a5aSDimitry Andric }
382d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,LabelSym & Label)383d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
384d88c1a5aSDimitry Andric 
385d88c1a5aSDimitry Andric   error(IO.mapInteger(Label.CodeOffset));
386d88c1a5aSDimitry Andric   error(IO.mapInteger(Label.Segment));
387d88c1a5aSDimitry Andric   error(IO.mapEnum(Label.Flags));
388d88c1a5aSDimitry Andric   error(IO.mapStringZ(Label.Name));
389d88c1a5aSDimitry Andric 
390d88c1a5aSDimitry Andric   return Error::success();
391d88c1a5aSDimitry Andric }
392d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,LocalSym & Local)393d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
394d88c1a5aSDimitry Andric   error(IO.mapInteger(Local.Type));
395d88c1a5aSDimitry Andric   error(IO.mapEnum(Local.Flags));
396d88c1a5aSDimitry Andric   error(IO.mapStringZ(Local.Name));
397d88c1a5aSDimitry Andric 
398d88c1a5aSDimitry Andric   return Error::success();
399d88c1a5aSDimitry Andric }
400d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ObjNameSym & ObjName)401d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
402d88c1a5aSDimitry Andric                                             ObjNameSym &ObjName) {
403d88c1a5aSDimitry Andric 
404d88c1a5aSDimitry Andric   error(IO.mapInteger(ObjName.Signature));
405d88c1a5aSDimitry Andric   error(IO.mapStringZ(ObjName.Name));
406d88c1a5aSDimitry Andric 
407d88c1a5aSDimitry Andric   return Error::success();
408d88c1a5aSDimitry Andric }
409d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ProcSym & Proc)410d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
411d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.Parent));
412d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.End));
413d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.Next));
414d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.CodeSize));
415d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.DbgStart));
416d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.DbgEnd));
417d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.FunctionType));
418d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.CodeOffset));
419d88c1a5aSDimitry Andric   error(IO.mapInteger(Proc.Segment));
420d88c1a5aSDimitry Andric   error(IO.mapEnum(Proc.Flags));
421d88c1a5aSDimitry Andric   error(IO.mapStringZ(Proc.Name));
422d88c1a5aSDimitry Andric   return Error::success();
423d88c1a5aSDimitry Andric }
424d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ScopeEndSym & ScopeEnd)425d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
426d88c1a5aSDimitry Andric                                             ScopeEndSym &ScopeEnd) {
427d88c1a5aSDimitry Andric   return Error::success();
428d88c1a5aSDimitry Andric }
429d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,CallerSym & Caller)430d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
431d88c1a5aSDimitry Andric   error(IO.mapVectorN<uint32_t>(
432d88c1a5aSDimitry Andric       Caller.Indices,
433d88c1a5aSDimitry Andric       [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
434d88c1a5aSDimitry Andric   return Error::success();
435d88c1a5aSDimitry Andric }
436d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,RegRelativeSym & RegRel)437d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
438d88c1a5aSDimitry Andric                                             RegRelativeSym &RegRel) {
439d88c1a5aSDimitry Andric 
440d88c1a5aSDimitry Andric   error(IO.mapInteger(RegRel.Offset));
441d88c1a5aSDimitry Andric   error(IO.mapInteger(RegRel.Type));
44224d58133SDimitry Andric   error(IO.mapEnum(RegRel.Register));
443d88c1a5aSDimitry Andric   error(IO.mapStringZ(RegRel.Name));
444d88c1a5aSDimitry Andric 
445d88c1a5aSDimitry Andric   return Error::success();
446d88c1a5aSDimitry Andric }
447d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ThreadLocalDataSym & Data)448d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
449d88c1a5aSDimitry Andric                                             ThreadLocalDataSym &Data) {
450d88c1a5aSDimitry Andric 
451d88c1a5aSDimitry Andric   error(IO.mapInteger(Data.Type));
452d88c1a5aSDimitry Andric   error(IO.mapInteger(Data.DataOffset));
453d88c1a5aSDimitry Andric   error(IO.mapInteger(Data.Segment));
454d88c1a5aSDimitry Andric   error(IO.mapStringZ(Data.Name));
455d88c1a5aSDimitry Andric 
456d88c1a5aSDimitry Andric   return Error::success();
457d88c1a5aSDimitry Andric }
458d88c1a5aSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,UDTSym & UDT)459d88c1a5aSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
460d88c1a5aSDimitry Andric 
461d88c1a5aSDimitry Andric   error(IO.mapInteger(UDT.Type));
462d88c1a5aSDimitry Andric   error(IO.mapStringZ(UDT.Name));
463d88c1a5aSDimitry Andric 
464d88c1a5aSDimitry Andric   return Error::success();
465d88c1a5aSDimitry Andric }
4664ba319b5SDimitry Andric 
visitKnownRecord(CVSymbol & CVR,UsingNamespaceSym & UN)4674ba319b5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4684ba319b5SDimitry Andric                                             UsingNamespaceSym &UN) {
4694ba319b5SDimitry Andric 
4704ba319b5SDimitry Andric   error(IO.mapStringZ(UN.Name));
4714ba319b5SDimitry Andric 
4724ba319b5SDimitry Andric   return Error::success();
4734ba319b5SDimitry Andric }
474*b5893f02SDimitry Andric 
decodeFramePtrReg(EncodedFramePtrReg EncodedReg,CPUType CPU)475*b5893f02SDimitry Andric RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
476*b5893f02SDimitry Andric                                        CPUType CPU) {
477*b5893f02SDimitry Andric   assert(unsigned(EncodedReg) < 4);
478*b5893f02SDimitry Andric   switch (CPU) {
479*b5893f02SDimitry Andric   // FIXME: Add ARM and AArch64 variants here.
480*b5893f02SDimitry Andric   default:
481*b5893f02SDimitry Andric     break;
482*b5893f02SDimitry Andric   case CPUType::Intel8080:
483*b5893f02SDimitry Andric   case CPUType::Intel8086:
484*b5893f02SDimitry Andric   case CPUType::Intel80286:
485*b5893f02SDimitry Andric   case CPUType::Intel80386:
486*b5893f02SDimitry Andric   case CPUType::Intel80486:
487*b5893f02SDimitry Andric   case CPUType::Pentium:
488*b5893f02SDimitry Andric   case CPUType::PentiumPro:
489*b5893f02SDimitry Andric   case CPUType::Pentium3:
490*b5893f02SDimitry Andric     switch (EncodedReg) {
491*b5893f02SDimitry Andric     case EncodedFramePtrReg::None:     return RegisterId::NONE;
492*b5893f02SDimitry Andric     case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
493*b5893f02SDimitry Andric     case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
494*b5893f02SDimitry Andric     case EncodedFramePtrReg::BasePtr:  return RegisterId::EBX;
495*b5893f02SDimitry Andric     }
496*b5893f02SDimitry Andric     llvm_unreachable("bad encoding");
497*b5893f02SDimitry Andric   case CPUType::X64:
498*b5893f02SDimitry Andric     switch (EncodedReg) {
499*b5893f02SDimitry Andric     case EncodedFramePtrReg::None:     return RegisterId::NONE;
500*b5893f02SDimitry Andric     case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
501*b5893f02SDimitry Andric     case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
502*b5893f02SDimitry Andric     case EncodedFramePtrReg::BasePtr:  return RegisterId::R13;
503*b5893f02SDimitry Andric     }
504*b5893f02SDimitry Andric     llvm_unreachable("bad encoding");
505*b5893f02SDimitry Andric   }
506*b5893f02SDimitry Andric   return RegisterId::NONE;
507*b5893f02SDimitry Andric }
508*b5893f02SDimitry Andric 
encodeFramePtrReg(RegisterId Reg,CPUType CPU)509*b5893f02SDimitry Andric EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
510*b5893f02SDimitry Andric   switch (CPU) {
511*b5893f02SDimitry Andric   // FIXME: Add ARM and AArch64 variants here.
512*b5893f02SDimitry Andric   default:
513*b5893f02SDimitry Andric     break;
514*b5893f02SDimitry Andric   case CPUType::Intel8080:
515*b5893f02SDimitry Andric   case CPUType::Intel8086:
516*b5893f02SDimitry Andric   case CPUType::Intel80286:
517*b5893f02SDimitry Andric   case CPUType::Intel80386:
518*b5893f02SDimitry Andric   case CPUType::Intel80486:
519*b5893f02SDimitry Andric   case CPUType::Pentium:
520*b5893f02SDimitry Andric   case CPUType::PentiumPro:
521*b5893f02SDimitry Andric   case CPUType::Pentium3:
522*b5893f02SDimitry Andric     switch (Reg) {
523*b5893f02SDimitry Andric     case RegisterId::VFRAME:
524*b5893f02SDimitry Andric       return EncodedFramePtrReg::StackPtr;
525*b5893f02SDimitry Andric     case RegisterId::EBP:
526*b5893f02SDimitry Andric       return EncodedFramePtrReg::FramePtr;
527*b5893f02SDimitry Andric     case RegisterId::EBX:
528*b5893f02SDimitry Andric       return EncodedFramePtrReg::BasePtr;
529*b5893f02SDimitry Andric     default:
530*b5893f02SDimitry Andric       break;
531*b5893f02SDimitry Andric     }
532*b5893f02SDimitry Andric     break;
533*b5893f02SDimitry Andric   case CPUType::X64:
534*b5893f02SDimitry Andric     switch (Reg) {
535*b5893f02SDimitry Andric     case RegisterId::RSP:
536*b5893f02SDimitry Andric       return EncodedFramePtrReg::StackPtr;
537*b5893f02SDimitry Andric     case RegisterId::RBP:
538*b5893f02SDimitry Andric       return EncodedFramePtrReg::FramePtr;
539*b5893f02SDimitry Andric     case RegisterId::R13:
540*b5893f02SDimitry Andric       return EncodedFramePtrReg::BasePtr;
541*b5893f02SDimitry Andric     default:
542*b5893f02SDimitry Andric       break;
543*b5893f02SDimitry Andric     }
544*b5893f02SDimitry Andric     break;
545*b5893f02SDimitry Andric   }
546*b5893f02SDimitry Andric   return EncodedFramePtrReg::None;
547*b5893f02SDimitry Andric }
548