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