146225b19SZachary Turner //===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
246225b19SZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
646225b19SZachary Turner //
746225b19SZachary Turner //===----------------------------------------------------------------------===//
846225b19SZachary Turner 
946225b19SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
1046225b19SZachary Turner 
1146225b19SZachary Turner using namespace llvm;
1246225b19SZachary Turner using namespace llvm::codeview;
1346225b19SZachary Turner 
1446225b19SZachary Turner #define error(X)                                                               \
1546225b19SZachary Turner   if (auto EC = X)                                                             \
1646225b19SZachary Turner     return EC;
1746225b19SZachary Turner 
1846225b19SZachary Turner namespace {
1946225b19SZachary Turner struct MapGap {
2046225b19SZachary Turner   Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
2146225b19SZachary Turner     error(IO.mapInteger(Gap.GapStartOffset));
2246225b19SZachary Turner     error(IO.mapInteger(Gap.Range));
2346225b19SZachary Turner     return Error::success();
2446225b19SZachary Turner   }
2546225b19SZachary Turner };
2646225b19SZachary Turner }
2746225b19SZachary Turner 
2846225b19SZachary Turner static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
2946225b19SZachary Turner                                        LocalVariableAddrRange &Range) {
3046225b19SZachary Turner   error(IO.mapInteger(Range.OffsetStart));
3146225b19SZachary Turner   error(IO.mapInteger(Range.ISectStart));
3246225b19SZachary Turner   error(IO.mapInteger(Range.Range));
3346225b19SZachary Turner   return Error::success();
3446225b19SZachary Turner }
3546225b19SZachary Turner 
3646225b19SZachary Turner Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
3746225b19SZachary Turner   error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
3846225b19SZachary Turner   return Error::success();
3946225b19SZachary Turner }
4046225b19SZachary Turner 
4146225b19SZachary Turner Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
42ebd3ae83SZachary Turner   error(IO.padToAlignment(alignOf(Container)));
4346225b19SZachary Turner   error(IO.endRecord());
4446225b19SZachary Turner   return Error::success();
4546225b19SZachary Turner }
4646225b19SZachary Turner 
4746225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
4846225b19SZachary Turner 
4946225b19SZachary Turner   error(IO.mapInteger(Block.Parent));
5046225b19SZachary Turner   error(IO.mapInteger(Block.End));
5146225b19SZachary Turner   error(IO.mapInteger(Block.CodeSize));
5246225b19SZachary Turner   error(IO.mapInteger(Block.CodeOffset));
5346225b19SZachary Turner   error(IO.mapInteger(Block.Segment));
5446225b19SZachary Turner   error(IO.mapStringZ(Block.Name));
5546225b19SZachary Turner 
5646225b19SZachary Turner   return Error::success();
5746225b19SZachary Turner }
5846225b19SZachary Turner 
5946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
6046225b19SZachary Turner 
6146225b19SZachary Turner   error(IO.mapInteger(Thunk.Parent));
6246225b19SZachary Turner   error(IO.mapInteger(Thunk.End));
6346225b19SZachary Turner   error(IO.mapInteger(Thunk.Next));
6446225b19SZachary Turner   error(IO.mapInteger(Thunk.Offset));
6546225b19SZachary Turner   error(IO.mapInteger(Thunk.Segment));
6646225b19SZachary Turner   error(IO.mapInteger(Thunk.Length));
6746225b19SZachary Turner   error(IO.mapEnum(Thunk.Thunk));
6846225b19SZachary Turner   error(IO.mapStringZ(Thunk.Name));
6946225b19SZachary Turner   error(IO.mapByteVectorTail(Thunk.VariantData));
7046225b19SZachary Turner 
7146225b19SZachary Turner   return Error::success();
7246225b19SZachary Turner }
7346225b19SZachary Turner 
7446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
7546225b19SZachary Turner                                             TrampolineSym &Tramp) {
7646225b19SZachary Turner 
7746225b19SZachary Turner   error(IO.mapEnum(Tramp.Type));
7846225b19SZachary Turner   error(IO.mapInteger(Tramp.Size));
7946225b19SZachary Turner   error(IO.mapInteger(Tramp.ThunkOffset));
8046225b19SZachary Turner   error(IO.mapInteger(Tramp.TargetOffset));
8146225b19SZachary Turner   error(IO.mapInteger(Tramp.ThunkSection));
8246225b19SZachary Turner   error(IO.mapInteger(Tramp.TargetSection));
8346225b19SZachary Turner 
8446225b19SZachary Turner   return Error::success();
8546225b19SZachary Turner }
8646225b19SZachary Turner 
8746225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
8846225b19SZachary Turner                                             SectionSym &Section) {
8946225b19SZachary Turner   uint8_t Padding = 0;
9046225b19SZachary Turner 
9146225b19SZachary Turner   error(IO.mapInteger(Section.SectionNumber));
9246225b19SZachary Turner   error(IO.mapInteger(Section.Alignment));
9346225b19SZachary Turner   error(IO.mapInteger(Padding));
9446225b19SZachary Turner   error(IO.mapInteger(Section.Rva));
9546225b19SZachary Turner   error(IO.mapInteger(Section.Length));
9646225b19SZachary Turner   error(IO.mapInteger(Section.Characteristics));
9746225b19SZachary Turner   error(IO.mapStringZ(Section.Name));
9846225b19SZachary Turner 
9946225b19SZachary Turner   return Error::success();
10046225b19SZachary Turner }
10146225b19SZachary Turner 
10246225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
10346225b19SZachary Turner                                             CoffGroupSym &CoffGroup) {
10446225b19SZachary Turner 
10546225b19SZachary Turner   error(IO.mapInteger(CoffGroup.Size));
10646225b19SZachary Turner   error(IO.mapInteger(CoffGroup.Characteristics));
10746225b19SZachary Turner   error(IO.mapInteger(CoffGroup.Offset));
10846225b19SZachary Turner   error(IO.mapInteger(CoffGroup.Segment));
10946225b19SZachary Turner   error(IO.mapStringZ(CoffGroup.Name));
11046225b19SZachary Turner 
11146225b19SZachary Turner   return Error::success();
11246225b19SZachary Turner }
11346225b19SZachary Turner 
11446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
11546225b19SZachary Turner                                             BPRelativeSym &BPRel) {
11646225b19SZachary Turner 
11746225b19SZachary Turner   error(IO.mapInteger(BPRel.Offset));
11846225b19SZachary Turner   error(IO.mapInteger(BPRel.Type));
11946225b19SZachary Turner   error(IO.mapStringZ(BPRel.Name));
12046225b19SZachary Turner 
12146225b19SZachary Turner   return Error::success();
12246225b19SZachary Turner }
12346225b19SZachary Turner 
12446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
12546225b19SZachary Turner                                             BuildInfoSym &BuildInfo) {
12646225b19SZachary Turner 
12746225b19SZachary Turner   error(IO.mapInteger(BuildInfo.BuildId));
12846225b19SZachary Turner 
12946225b19SZachary Turner   return Error::success();
13046225b19SZachary Turner }
13146225b19SZachary Turner 
13246225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
13346225b19SZachary Turner                                             CallSiteInfoSym &CallSiteInfo) {
13446225b19SZachary Turner   uint16_t Padding = 0;
13546225b19SZachary Turner 
13646225b19SZachary Turner   error(IO.mapInteger(CallSiteInfo.CodeOffset));
13746225b19SZachary Turner   error(IO.mapInteger(CallSiteInfo.Segment));
13846225b19SZachary Turner   error(IO.mapInteger(Padding));
13946225b19SZachary Turner   error(IO.mapInteger(CallSiteInfo.Type));
14046225b19SZachary Turner 
14146225b19SZachary Turner   return Error::success();
14246225b19SZachary Turner }
14346225b19SZachary Turner 
14446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
14546225b19SZachary Turner                                             EnvBlockSym &EnvBlock) {
14646225b19SZachary Turner 
14746225b19SZachary Turner   uint8_t Reserved = 0;
14846225b19SZachary Turner   error(IO.mapInteger(Reserved));
14946225b19SZachary Turner   error(IO.mapStringZVectorZ(EnvBlock.Fields));
15046225b19SZachary Turner 
15146225b19SZachary Turner   return Error::success();
15246225b19SZachary Turner }
15346225b19SZachary Turner 
15446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
15546225b19SZachary Turner                                             FileStaticSym &FileStatic) {
15646225b19SZachary Turner 
15746225b19SZachary Turner   error(IO.mapInteger(FileStatic.Index));
15846225b19SZachary Turner   error(IO.mapInteger(FileStatic.ModFilenameOffset));
15946225b19SZachary Turner   error(IO.mapEnum(FileStatic.Flags));
16046225b19SZachary Turner   error(IO.mapStringZ(FileStatic.Name));
16146225b19SZachary Turner 
16246225b19SZachary Turner   return Error::success();
16346225b19SZachary Turner }
16446225b19SZachary Turner 
16546225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
16646225b19SZachary Turner 
16746225b19SZachary Turner   error(IO.mapInteger(Export.Ordinal));
16846225b19SZachary Turner   error(IO.mapEnum(Export.Flags));
16946225b19SZachary Turner   error(IO.mapStringZ(Export.Name));
17046225b19SZachary Turner 
17146225b19SZachary Turner   return Error::success();
17246225b19SZachary Turner }
17346225b19SZachary Turner 
17446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
17546225b19SZachary Turner                                             Compile2Sym &Compile2) {
17646225b19SZachary Turner 
17746225b19SZachary Turner   error(IO.mapEnum(Compile2.Flags));
17846225b19SZachary Turner   error(IO.mapEnum(Compile2.Machine));
17946225b19SZachary Turner   error(IO.mapInteger(Compile2.VersionFrontendMajor));
18046225b19SZachary Turner   error(IO.mapInteger(Compile2.VersionFrontendMinor));
18146225b19SZachary Turner   error(IO.mapInteger(Compile2.VersionFrontendBuild));
18246225b19SZachary Turner   error(IO.mapInteger(Compile2.VersionBackendMajor));
18346225b19SZachary Turner   error(IO.mapInteger(Compile2.VersionBackendMinor));
18446225b19SZachary Turner   error(IO.mapInteger(Compile2.VersionBackendBuild));
18546225b19SZachary Turner   error(IO.mapStringZ(Compile2.Version));
18646225b19SZachary Turner   error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
18746225b19SZachary Turner 
18846225b19SZachary Turner   return Error::success();
18946225b19SZachary Turner }
19046225b19SZachary Turner 
19146225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
19246225b19SZachary Turner                                             Compile3Sym &Compile3) {
19346225b19SZachary Turner 
19446225b19SZachary Turner   error(IO.mapEnum(Compile3.Flags));
19546225b19SZachary Turner   error(IO.mapEnum(Compile3.Machine));
19646225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionFrontendMajor));
19746225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionFrontendMinor));
19846225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionFrontendBuild));
19946225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionFrontendQFE));
20046225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionBackendMajor));
20146225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionBackendMinor));
20246225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionBackendBuild));
20346225b19SZachary Turner   error(IO.mapInteger(Compile3.VersionBackendQFE));
20446225b19SZachary Turner   error(IO.mapStringZ(Compile3.Version));
20546225b19SZachary Turner 
20646225b19SZachary Turner   return Error::success();
20746225b19SZachary Turner }
20846225b19SZachary Turner 
20946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
21046225b19SZachary Turner                                             ConstantSym &Constant) {
21146225b19SZachary Turner 
21246225b19SZachary Turner   error(IO.mapInteger(Constant.Type));
21346225b19SZachary Turner   error(IO.mapEncodedInteger(Constant.Value));
21446225b19SZachary Turner   error(IO.mapStringZ(Constant.Name));
21546225b19SZachary Turner 
21646225b19SZachary Turner   return Error::success();
21746225b19SZachary Turner }
21846225b19SZachary Turner 
21946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
22046225b19SZachary Turner 
22146225b19SZachary Turner   error(IO.mapInteger(Data.Type));
22246225b19SZachary Turner   error(IO.mapInteger(Data.DataOffset));
22346225b19SZachary Turner   error(IO.mapInteger(Data.Segment));
22446225b19SZachary Turner   error(IO.mapStringZ(Data.Name));
22546225b19SZachary Turner 
22646225b19SZachary Turner   return Error::success();
22746225b19SZachary Turner }
22846225b19SZachary Turner 
22946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
23046225b19SZachary Turner     CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
23146225b19SZachary Turner 
23246225b19SZachary Turner   error(IO.mapInteger(DefRangeFramePointerRel.Offset));
23346225b19SZachary Turner   error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
23446225b19SZachary Turner   error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
23546225b19SZachary Turner 
23646225b19SZachary Turner   return Error::success();
23746225b19SZachary Turner }
23846225b19SZachary Turner 
23946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
24046225b19SZachary Turner     CVSymbol &CVR,
24146225b19SZachary Turner     DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
24246225b19SZachary Turner 
24346225b19SZachary Turner   error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
24446225b19SZachary Turner 
24546225b19SZachary Turner   return Error::success();
24646225b19SZachary Turner }
24746225b19SZachary Turner 
24846225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
24946225b19SZachary Turner     CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
25046225b19SZachary Turner 
25146225b19SZachary Turner   error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
25246225b19SZachary Turner   error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
25346225b19SZachary Turner   error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
25446225b19SZachary Turner   error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
25546225b19SZachary Turner   error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
25646225b19SZachary Turner 
25746225b19SZachary Turner   return Error::success();
25846225b19SZachary Turner }
25946225b19SZachary Turner 
26046225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
26146225b19SZachary Turner     CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
26246225b19SZachary Turner 
26346225b19SZachary Turner   error(IO.mapObject(DefRangeRegister.Hdr.Register));
26446225b19SZachary Turner   error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
26546225b19SZachary Turner   error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
26646225b19SZachary Turner   error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
26746225b19SZachary Turner 
26846225b19SZachary Turner   return Error::success();
26946225b19SZachary Turner }
27046225b19SZachary Turner 
27146225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
27246225b19SZachary Turner     CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
27346225b19SZachary Turner 
27446225b19SZachary Turner   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
27546225b19SZachary Turner   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
27646225b19SZachary Turner   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
27746225b19SZachary Turner   error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
27846225b19SZachary Turner   error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
27946225b19SZachary Turner 
28046225b19SZachary Turner   return Error::success();
28146225b19SZachary Turner }
28246225b19SZachary Turner 
28346225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
28446225b19SZachary Turner     CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
28546225b19SZachary Turner 
28646225b19SZachary Turner   error(IO.mapInteger(DefRangeSubfield.Program));
28746225b19SZachary Turner   error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
28846225b19SZachary Turner   error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
28946225b19SZachary Turner   error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
29046225b19SZachary Turner 
29146225b19SZachary Turner   return Error::success();
29246225b19SZachary Turner }
29346225b19SZachary Turner 
29446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
29546225b19SZachary Turner                                             DefRangeSym &DefRange) {
29646225b19SZachary Turner 
29746225b19SZachary Turner   error(IO.mapInteger(DefRange.Program));
29846225b19SZachary Turner   error(mapLocalVariableAddrRange(IO, DefRange.Range));
29946225b19SZachary Turner   error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
30046225b19SZachary Turner 
30146225b19SZachary Turner   return Error::success();
30246225b19SZachary Turner }
30346225b19SZachary Turner 
30446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
30546225b19SZachary Turner                                             FrameCookieSym &FrameCookie) {
30646225b19SZachary Turner 
30746225b19SZachary Turner   error(IO.mapInteger(FrameCookie.CodeOffset));
30846225b19SZachary Turner   error(IO.mapInteger(FrameCookie.Register));
30963055455SZachary Turner   error(IO.mapEnum(FrameCookie.CookieKind));
31046225b19SZachary Turner   error(IO.mapInteger(FrameCookie.Flags));
31146225b19SZachary Turner 
31246225b19SZachary Turner   return Error::success();
31346225b19SZachary Turner }
31446225b19SZachary Turner 
31546225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
31646225b19SZachary Turner                                             FrameProcSym &FrameProc) {
31746225b19SZachary Turner   error(IO.mapInteger(FrameProc.TotalFrameBytes));
31846225b19SZachary Turner   error(IO.mapInteger(FrameProc.PaddingFrameBytes));
31946225b19SZachary Turner   error(IO.mapInteger(FrameProc.OffsetToPadding));
32046225b19SZachary Turner   error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
32146225b19SZachary Turner   error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
32246225b19SZachary Turner   error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
32346225b19SZachary Turner   error(IO.mapEnum(FrameProc.Flags));
32446225b19SZachary Turner 
32546225b19SZachary Turner   return Error::success();
32646225b19SZachary Turner }
32746225b19SZachary Turner 
32846225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
32946225b19SZachary Turner     CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
33046225b19SZachary Turner 
33146225b19SZachary Turner   error(IO.mapInteger(HeapAllocSite.CodeOffset));
33246225b19SZachary Turner   error(IO.mapInteger(HeapAllocSite.Segment));
33346225b19SZachary Turner   error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
33446225b19SZachary Turner   error(IO.mapInteger(HeapAllocSite.Type));
33546225b19SZachary Turner 
33646225b19SZachary Turner   return Error::success();
33746225b19SZachary Turner }
33846225b19SZachary Turner 
33946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
34046225b19SZachary Turner                                             InlineSiteSym &InlineSite) {
34146225b19SZachary Turner 
34246225b19SZachary Turner   error(IO.mapInteger(InlineSite.Parent));
34346225b19SZachary Turner   error(IO.mapInteger(InlineSite.End));
34446225b19SZachary Turner   error(IO.mapInteger(InlineSite.Inlinee));
34546225b19SZachary Turner   error(IO.mapByteVectorTail(InlineSite.AnnotationData));
34646225b19SZachary Turner 
34746225b19SZachary Turner   return Error::success();
34846225b19SZachary Turner }
34946225b19SZachary Turner 
35046225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
35146225b19SZachary Turner                                             RegisterSym &Register) {
35246225b19SZachary Turner 
35346225b19SZachary Turner   error(IO.mapInteger(Register.Index));
35446225b19SZachary Turner   error(IO.mapEnum(Register.Register));
35546225b19SZachary Turner   error(IO.mapStringZ(Register.Name));
35646225b19SZachary Turner 
35746225b19SZachary Turner   return Error::success();
35846225b19SZachary Turner }
35946225b19SZachary Turner 
36046225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
36146225b19SZachary Turner                                             PublicSym32 &Public) {
36246225b19SZachary Turner 
36318d90e17SReid Kleckner   error(IO.mapEnum(Public.Flags));
36446225b19SZachary Turner   error(IO.mapInteger(Public.Offset));
36546225b19SZachary Turner   error(IO.mapInteger(Public.Segment));
36646225b19SZachary Turner   error(IO.mapStringZ(Public.Name));
36746225b19SZachary Turner 
36846225b19SZachary Turner   return Error::success();
36946225b19SZachary Turner }
37046225b19SZachary Turner 
37146225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
37246225b19SZachary Turner                                             ProcRefSym &ProcRef) {
37346225b19SZachary Turner 
37446225b19SZachary Turner   error(IO.mapInteger(ProcRef.SumName));
37546225b19SZachary Turner   error(IO.mapInteger(ProcRef.SymOffset));
37646225b19SZachary Turner   error(IO.mapInteger(ProcRef.Module));
37746225b19SZachary Turner   error(IO.mapStringZ(ProcRef.Name));
37846225b19SZachary Turner 
37946225b19SZachary Turner   return Error::success();
38046225b19SZachary Turner }
38146225b19SZachary Turner 
38246225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
38346225b19SZachary Turner 
38446225b19SZachary Turner   error(IO.mapInteger(Label.CodeOffset));
38546225b19SZachary Turner   error(IO.mapInteger(Label.Segment));
38646225b19SZachary Turner   error(IO.mapEnum(Label.Flags));
38746225b19SZachary Turner   error(IO.mapStringZ(Label.Name));
38846225b19SZachary Turner 
38946225b19SZachary Turner   return Error::success();
39046225b19SZachary Turner }
39146225b19SZachary Turner 
39246225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
39346225b19SZachary Turner   error(IO.mapInteger(Local.Type));
39446225b19SZachary Turner   error(IO.mapEnum(Local.Flags));
39546225b19SZachary Turner   error(IO.mapStringZ(Local.Name));
39646225b19SZachary Turner 
39746225b19SZachary Turner   return Error::success();
39846225b19SZachary Turner }
39946225b19SZachary Turner 
40046225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
40146225b19SZachary Turner                                             ObjNameSym &ObjName) {
40246225b19SZachary Turner 
40346225b19SZachary Turner   error(IO.mapInteger(ObjName.Signature));
40446225b19SZachary Turner   error(IO.mapStringZ(ObjName.Name));
40546225b19SZachary Turner 
40646225b19SZachary Turner   return Error::success();
40746225b19SZachary Turner }
40846225b19SZachary Turner 
40946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
41046225b19SZachary Turner   error(IO.mapInteger(Proc.Parent));
41146225b19SZachary Turner   error(IO.mapInteger(Proc.End));
41246225b19SZachary Turner   error(IO.mapInteger(Proc.Next));
41346225b19SZachary Turner   error(IO.mapInteger(Proc.CodeSize));
41446225b19SZachary Turner   error(IO.mapInteger(Proc.DbgStart));
41546225b19SZachary Turner   error(IO.mapInteger(Proc.DbgEnd));
41646225b19SZachary Turner   error(IO.mapInteger(Proc.FunctionType));
41746225b19SZachary Turner   error(IO.mapInteger(Proc.CodeOffset));
41846225b19SZachary Turner   error(IO.mapInteger(Proc.Segment));
41946225b19SZachary Turner   error(IO.mapEnum(Proc.Flags));
42046225b19SZachary Turner   error(IO.mapStringZ(Proc.Name));
42146225b19SZachary Turner   return Error::success();
42246225b19SZachary Turner }
42346225b19SZachary Turner 
42446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
42546225b19SZachary Turner                                             ScopeEndSym &ScopeEnd) {
42646225b19SZachary Turner   return Error::success();
42746225b19SZachary Turner }
42846225b19SZachary Turner 
42946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
43046225b19SZachary Turner   error(IO.mapVectorN<uint32_t>(
43146225b19SZachary Turner       Caller.Indices,
43246225b19SZachary Turner       [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
43346225b19SZachary Turner   return Error::success();
43446225b19SZachary Turner }
43546225b19SZachary Turner 
43646225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
43746225b19SZachary Turner                                             RegRelativeSym &RegRel) {
43846225b19SZachary Turner 
43946225b19SZachary Turner   error(IO.mapInteger(RegRel.Offset));
44046225b19SZachary Turner   error(IO.mapInteger(RegRel.Type));
44163055455SZachary Turner   error(IO.mapEnum(RegRel.Register));
44246225b19SZachary Turner   error(IO.mapStringZ(RegRel.Name));
44346225b19SZachary Turner 
44446225b19SZachary Turner   return Error::success();
44546225b19SZachary Turner }
44646225b19SZachary Turner 
44746225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
44846225b19SZachary Turner                                             ThreadLocalDataSym &Data) {
44946225b19SZachary Turner 
45046225b19SZachary Turner   error(IO.mapInteger(Data.Type));
45146225b19SZachary Turner   error(IO.mapInteger(Data.DataOffset));
45246225b19SZachary Turner   error(IO.mapInteger(Data.Segment));
45346225b19SZachary Turner   error(IO.mapStringZ(Data.Name));
45446225b19SZachary Turner 
45546225b19SZachary Turner   return Error::success();
45646225b19SZachary Turner }
45746225b19SZachary Turner 
45846225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
45946225b19SZachary Turner 
46046225b19SZachary Turner   error(IO.mapInteger(UDT.Type));
46146225b19SZachary Turner   error(IO.mapStringZ(UDT.Name));
46246225b19SZachary Turner 
46346225b19SZachary Turner   return Error::success();
46446225b19SZachary Turner }
465ee8a7200SAlexandre Ganea 
466ee8a7200SAlexandre Ganea Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
467ee8a7200SAlexandre Ganea                                             UsingNamespaceSym &UN) {
468ee8a7200SAlexandre Ganea 
469ee8a7200SAlexandre Ganea   error(IO.mapStringZ(UN.Name));
470ee8a7200SAlexandre Ganea 
471ee8a7200SAlexandre Ganea   return Error::success();
472ee8a7200SAlexandre Ganea }
4739ea2c012SReid Kleckner 
4749ea2c012SReid Kleckner RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
4759ea2c012SReid Kleckner                                        CPUType CPU) {
4769ea2c012SReid Kleckner   assert(unsigned(EncodedReg) < 4);
4779ea2c012SReid Kleckner   switch (CPU) {
4789ea2c012SReid Kleckner   // FIXME: Add ARM and AArch64 variants here.
4799ea2c012SReid Kleckner   default:
4809ea2c012SReid Kleckner     break;
4819ea2c012SReid Kleckner   case CPUType::Intel8080:
4829ea2c012SReid Kleckner   case CPUType::Intel8086:
4839ea2c012SReid Kleckner   case CPUType::Intel80286:
4849ea2c012SReid Kleckner   case CPUType::Intel80386:
4859ea2c012SReid Kleckner   case CPUType::Intel80486:
4869ea2c012SReid Kleckner   case CPUType::Pentium:
4879ea2c012SReid Kleckner   case CPUType::PentiumPro:
4889ea2c012SReid Kleckner   case CPUType::Pentium3:
4899ea2c012SReid Kleckner     switch (EncodedReg) {
4909ea2c012SReid Kleckner     case EncodedFramePtrReg::None:     return RegisterId::NONE;
4919ea2c012SReid Kleckner     case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
4929ea2c012SReid Kleckner     case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
4939ea2c012SReid Kleckner     case EncodedFramePtrReg::BasePtr:  return RegisterId::EBX;
4949ea2c012SReid Kleckner     }
4959ea2c012SReid Kleckner     llvm_unreachable("bad encoding");
4969ea2c012SReid Kleckner   case CPUType::X64:
4979ea2c012SReid Kleckner     switch (EncodedReg) {
4989ea2c012SReid Kleckner     case EncodedFramePtrReg::None:     return RegisterId::NONE;
4999ea2c012SReid Kleckner     case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
5009ea2c012SReid Kleckner     case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
5019ea2c012SReid Kleckner     case EncodedFramePtrReg::BasePtr:  return RegisterId::R13;
5029ea2c012SReid Kleckner     }
5039ea2c012SReid Kleckner     llvm_unreachable("bad encoding");
5049ea2c012SReid Kleckner   }
5059ea2c012SReid Kleckner   return RegisterId::NONE;
5069ea2c012SReid Kleckner }
5079ea2c012SReid Kleckner 
5089ea2c012SReid Kleckner EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
5099ea2c012SReid Kleckner   switch (CPU) {
5109ea2c012SReid Kleckner   // FIXME: Add ARM and AArch64 variants here.
5119ea2c012SReid Kleckner   default:
5129ea2c012SReid Kleckner     break;
5139ea2c012SReid Kleckner   case CPUType::Intel8080:
5149ea2c012SReid Kleckner   case CPUType::Intel8086:
5159ea2c012SReid Kleckner   case CPUType::Intel80286:
5169ea2c012SReid Kleckner   case CPUType::Intel80386:
5179ea2c012SReid Kleckner   case CPUType::Intel80486:
5189ea2c012SReid Kleckner   case CPUType::Pentium:
5199ea2c012SReid Kleckner   case CPUType::PentiumPro:
5209ea2c012SReid Kleckner   case CPUType::Pentium3:
5219ea2c012SReid Kleckner     switch (Reg) {
5229ea2c012SReid Kleckner     case RegisterId::VFRAME:
5239ea2c012SReid Kleckner       return EncodedFramePtrReg::StackPtr;
5249ea2c012SReid Kleckner     case RegisterId::EBP:
5259ea2c012SReid Kleckner       return EncodedFramePtrReg::FramePtr;
5269ea2c012SReid Kleckner     case RegisterId::EBX:
5279ea2c012SReid Kleckner       return EncodedFramePtrReg::BasePtr;
5289ea2c012SReid Kleckner     default:
5299ea2c012SReid Kleckner       break;
5309ea2c012SReid Kleckner     }
53146ff186bSReid Kleckner     break;
5329ea2c012SReid Kleckner   case CPUType::X64:
5339ea2c012SReid Kleckner     switch (Reg) {
5349ea2c012SReid Kleckner     case RegisterId::RSP:
5359ea2c012SReid Kleckner       return EncodedFramePtrReg::StackPtr;
5369ea2c012SReid Kleckner     case RegisterId::RBP:
5379ea2c012SReid Kleckner       return EncodedFramePtrReg::FramePtr;
5389ea2c012SReid Kleckner     case RegisterId::R13:
5399ea2c012SReid Kleckner       return EncodedFramePtrReg::BasePtr;
5409ea2c012SReid Kleckner     default:
5419ea2c012SReid Kleckner       break;
5429ea2c012SReid Kleckner     }
54346ff186bSReid Kleckner     break;
5449ea2c012SReid Kleckner   }
5459ea2c012SReid Kleckner   return EncodedFramePtrReg::None;
5469ea2c012SReid Kleckner }
547