146225b19SZachary Turner //===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
246225b19SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler 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 {
operator ()__anona3e15cc80111::MapGap2046225b19SZachary 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 
mapLocalVariableAddrRange(CodeViewRecordIO & IO,LocalVariableAddrRange & Range)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 
visitSymbolBegin(CVSymbol & Record)3646225b19SZachary Turner Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
3746225b19SZachary Turner   error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
3846225b19SZachary Turner   return Error::success();
3946225b19SZachary Turner }
4046225b19SZachary Turner 
visitSymbolEnd(CVSymbol & Record)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 
visitKnownRecord(CVSymbol & CVR,BlockSym & Block)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 
visitKnownRecord(CVSymbol & CVR,Thunk32Sym & Thunk)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 
visitKnownRecord(CVSymbol & CVR,TrampolineSym & Tramp)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 
visitKnownRecord(CVSymbol & CVR,SectionSym & Section)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 
visitKnownRecord(CVSymbol & CVR,CoffGroupSym & CoffGroup)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 
visitKnownRecord(CVSymbol & CVR,BPRelativeSym & BPRel)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 
visitKnownRecord(CVSymbol & CVR,BuildInfoSym & BuildInfo)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 
visitKnownRecord(CVSymbol & CVR,CallSiteInfoSym & CallSiteInfo)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 
visitKnownRecord(CVSymbol & CVR,EnvBlockSym & EnvBlock)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 
visitKnownRecord(CVSymbol & CVR,FileStaticSym & FileStatic)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 
visitKnownRecord(CVSymbol & CVR,ExportSym & Export)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 
visitKnownRecord(CVSymbol & CVR,Compile2Sym & Compile2)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 
visitKnownRecord(CVSymbol & CVR,Compile3Sym & Compile3)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 
visitKnownRecord(CVSymbol & CVR,ConstantSym & Constant)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 
visitKnownRecord(CVSymbol & CVR,DataSym & Data)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 
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelSym & DefRangeFramePointerRel)22946225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(
23046225b19SZachary Turner     CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
23146225b19SZachary Turner 
232*da60fc81SNilanjana Basu   error(IO.mapObject(DefRangeFramePointerRel.Hdr.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 
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelFullScopeSym & DefRangeFramePointerRelFullScope)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 
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterRelSym & DefRangeRegisterRel)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 
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterSym & DefRangeRegister)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 
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldRegisterSym & DefRangeSubfieldRegister)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 
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldSym & DefRangeSubfield)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 
visitKnownRecord(CVSymbol & CVR,DefRangeSym & DefRange)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 
visitKnownRecord(CVSymbol & CVR,FrameCookieSym & FrameCookie)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 
visitKnownRecord(CVSymbol & CVR,FrameProcSym & FrameProc)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 
visitKnownRecord(CVSymbol & CVR,HeapAllocationSiteSym & HeapAllocSite)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 
visitKnownRecord(CVSymbol & CVR,InlineSiteSym & InlineSite)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 
visitKnownRecord(CVSymbol & CVR,RegisterSym & Register)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 
visitKnownRecord(CVSymbol & CVR,PublicSym32 & Public)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 
visitKnownRecord(CVSymbol & CVR,ProcRefSym & ProcRef)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 
visitKnownRecord(CVSymbol & CVR,LabelSym & Label)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 
visitKnownRecord(CVSymbol & CVR,LocalSym & Local)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 
visitKnownRecord(CVSymbol & CVR,ObjNameSym & ObjName)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 
visitKnownRecord(CVSymbol & CVR,ProcSym & Proc)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 
visitKnownRecord(CVSymbol & CVR,ScopeEndSym & ScopeEnd)42446225b19SZachary Turner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
42546225b19SZachary Turner                                             ScopeEndSym &ScopeEnd) {
42646225b19SZachary Turner   return Error::success();
42746225b19SZachary Turner }
42846225b19SZachary Turner 
visitKnownRecord(CVSymbol & CVR,CallerSym & Caller)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 
visitKnownRecord(CVSymbol & CVR,RegRelativeSym & RegRel)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 
visitKnownRecord(CVSymbol & CVR,ThreadLocalDataSym & Data)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 
visitKnownRecord(CVSymbol & CVR,UDTSym & UDT)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 
visitKnownRecord(CVSymbol & CVR,UsingNamespaceSym & UN)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 
visitKnownRecord(CVSymbol & CVR,AnnotationSym & Annot)4747c438c5bSReid Kleckner Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4757c438c5bSReid Kleckner                                             AnnotationSym &Annot) {
4767c438c5bSReid Kleckner 
4777c438c5bSReid Kleckner   error(IO.mapInteger(Annot.CodeOffset));
4787c438c5bSReid Kleckner   error(IO.mapInteger(Annot.Segment));
4797c438c5bSReid Kleckner   error(IO.mapVectorN<uint16_t>(
4807c438c5bSReid Kleckner       Annot.Strings,
4817c438c5bSReid Kleckner       [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));
4827c438c5bSReid Kleckner 
4837c438c5bSReid Kleckner   return Error::success();
4847c438c5bSReid Kleckner }
4857c438c5bSReid Kleckner 
decodeFramePtrReg(EncodedFramePtrReg EncodedReg,CPUType CPU)4869ea2c012SReid Kleckner RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
4879ea2c012SReid Kleckner                                        CPUType CPU) {
4889ea2c012SReid Kleckner   assert(unsigned(EncodedReg) < 4);
4899ea2c012SReid Kleckner   switch (CPU) {
4909ea2c012SReid Kleckner   // FIXME: Add ARM and AArch64 variants here.
4919ea2c012SReid Kleckner   default:
4929ea2c012SReid Kleckner     break;
4939ea2c012SReid Kleckner   case CPUType::Intel8080:
4949ea2c012SReid Kleckner   case CPUType::Intel8086:
4959ea2c012SReid Kleckner   case CPUType::Intel80286:
4969ea2c012SReid Kleckner   case CPUType::Intel80386:
4979ea2c012SReid Kleckner   case CPUType::Intel80486:
4989ea2c012SReid Kleckner   case CPUType::Pentium:
4999ea2c012SReid Kleckner   case CPUType::PentiumPro:
5009ea2c012SReid Kleckner   case CPUType::Pentium3:
5019ea2c012SReid Kleckner     switch (EncodedReg) {
5029ea2c012SReid Kleckner     case EncodedFramePtrReg::None:     return RegisterId::NONE;
5039ea2c012SReid Kleckner     case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
5049ea2c012SReid Kleckner     case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
5059ea2c012SReid Kleckner     case EncodedFramePtrReg::BasePtr:  return RegisterId::EBX;
5069ea2c012SReid Kleckner     }
5079ea2c012SReid Kleckner     llvm_unreachable("bad encoding");
5089ea2c012SReid Kleckner   case CPUType::X64:
5099ea2c012SReid Kleckner     switch (EncodedReg) {
5109ea2c012SReid Kleckner     case EncodedFramePtrReg::None:     return RegisterId::NONE;
5119ea2c012SReid Kleckner     case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
5129ea2c012SReid Kleckner     case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
5139ea2c012SReid Kleckner     case EncodedFramePtrReg::BasePtr:  return RegisterId::R13;
5149ea2c012SReid Kleckner     }
5159ea2c012SReid Kleckner     llvm_unreachable("bad encoding");
5169ea2c012SReid Kleckner   }
5179ea2c012SReid Kleckner   return RegisterId::NONE;
5189ea2c012SReid Kleckner }
5199ea2c012SReid Kleckner 
encodeFramePtrReg(RegisterId Reg,CPUType CPU)5209ea2c012SReid Kleckner EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
5219ea2c012SReid Kleckner   switch (CPU) {
5229ea2c012SReid Kleckner   // FIXME: Add ARM and AArch64 variants here.
5239ea2c012SReid Kleckner   default:
5249ea2c012SReid Kleckner     break;
5259ea2c012SReid Kleckner   case CPUType::Intel8080:
5269ea2c012SReid Kleckner   case CPUType::Intel8086:
5279ea2c012SReid Kleckner   case CPUType::Intel80286:
5289ea2c012SReid Kleckner   case CPUType::Intel80386:
5299ea2c012SReid Kleckner   case CPUType::Intel80486:
5309ea2c012SReid Kleckner   case CPUType::Pentium:
5319ea2c012SReid Kleckner   case CPUType::PentiumPro:
5329ea2c012SReid Kleckner   case CPUType::Pentium3:
5339ea2c012SReid Kleckner     switch (Reg) {
5349ea2c012SReid Kleckner     case RegisterId::VFRAME:
5359ea2c012SReid Kleckner       return EncodedFramePtrReg::StackPtr;
5369ea2c012SReid Kleckner     case RegisterId::EBP:
5379ea2c012SReid Kleckner       return EncodedFramePtrReg::FramePtr;
5389ea2c012SReid Kleckner     case RegisterId::EBX:
5399ea2c012SReid Kleckner       return EncodedFramePtrReg::BasePtr;
5409ea2c012SReid Kleckner     default:
5419ea2c012SReid Kleckner       break;
5429ea2c012SReid Kleckner     }
54346ff186bSReid Kleckner     break;
5449ea2c012SReid Kleckner   case CPUType::X64:
5459ea2c012SReid Kleckner     switch (Reg) {
5469ea2c012SReid Kleckner     case RegisterId::RSP:
5479ea2c012SReid Kleckner       return EncodedFramePtrReg::StackPtr;
5489ea2c012SReid Kleckner     case RegisterId::RBP:
5499ea2c012SReid Kleckner       return EncodedFramePtrReg::FramePtr;
5509ea2c012SReid Kleckner     case RegisterId::R13:
5519ea2c012SReid Kleckner       return EncodedFramePtrReg::BasePtr;
5529ea2c012SReid Kleckner     default:
5539ea2c012SReid Kleckner       break;
5549ea2c012SReid Kleckner     }
55546ff186bSReid Kleckner     break;
5569ea2c012SReid Kleckner   }
5579ea2c012SReid Kleckner   return EncodedFramePtrReg::None;
5589ea2c012SReid Kleckner }
559