10b57cec5SDimitry Andric //===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric using namespace llvm;
120b57cec5SDimitry Andric using namespace llvm::codeview;
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric #define error(X) \
150b57cec5SDimitry Andric if (auto EC = X) \
160b57cec5SDimitry Andric return EC;
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric namespace {
190b57cec5SDimitry Andric struct MapGap {
operator ()__anonf48edcea0111::MapGap200b57cec5SDimitry Andric Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
210b57cec5SDimitry Andric error(IO.mapInteger(Gap.GapStartOffset));
220b57cec5SDimitry Andric error(IO.mapInteger(Gap.Range));
230b57cec5SDimitry Andric return Error::success();
240b57cec5SDimitry Andric }
250b57cec5SDimitry Andric };
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric
mapLocalVariableAddrRange(CodeViewRecordIO & IO,LocalVariableAddrRange & Range)280b57cec5SDimitry Andric static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
290b57cec5SDimitry Andric LocalVariableAddrRange &Range) {
300b57cec5SDimitry Andric error(IO.mapInteger(Range.OffsetStart));
310b57cec5SDimitry Andric error(IO.mapInteger(Range.ISectStart));
320b57cec5SDimitry Andric error(IO.mapInteger(Range.Range));
330b57cec5SDimitry Andric return Error::success();
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric
visitSymbolBegin(CVSymbol & Record)360b57cec5SDimitry Andric Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
370b57cec5SDimitry Andric error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
380b57cec5SDimitry Andric return Error::success();
390b57cec5SDimitry Andric }
400b57cec5SDimitry Andric
visitSymbolEnd(CVSymbol & Record)410b57cec5SDimitry Andric Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
420b57cec5SDimitry Andric error(IO.padToAlignment(alignOf(Container)));
430b57cec5SDimitry Andric error(IO.endRecord());
440b57cec5SDimitry Andric return Error::success();
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,BlockSym & Block)470b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric error(IO.mapInteger(Block.Parent));
500b57cec5SDimitry Andric error(IO.mapInteger(Block.End));
510b57cec5SDimitry Andric error(IO.mapInteger(Block.CodeSize));
520b57cec5SDimitry Andric error(IO.mapInteger(Block.CodeOffset));
530b57cec5SDimitry Andric error(IO.mapInteger(Block.Segment));
540b57cec5SDimitry Andric error(IO.mapStringZ(Block.Name));
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric return Error::success();
570b57cec5SDimitry Andric }
580b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,Thunk32Sym & Thunk)590b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
600b57cec5SDimitry Andric
610b57cec5SDimitry Andric error(IO.mapInteger(Thunk.Parent));
620b57cec5SDimitry Andric error(IO.mapInteger(Thunk.End));
630b57cec5SDimitry Andric error(IO.mapInteger(Thunk.Next));
640b57cec5SDimitry Andric error(IO.mapInteger(Thunk.Offset));
650b57cec5SDimitry Andric error(IO.mapInteger(Thunk.Segment));
660b57cec5SDimitry Andric error(IO.mapInteger(Thunk.Length));
670b57cec5SDimitry Andric error(IO.mapEnum(Thunk.Thunk));
680b57cec5SDimitry Andric error(IO.mapStringZ(Thunk.Name));
690b57cec5SDimitry Andric error(IO.mapByteVectorTail(Thunk.VariantData));
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric return Error::success();
720b57cec5SDimitry Andric }
730b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,TrampolineSym & Tramp)740b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
750b57cec5SDimitry Andric TrampolineSym &Tramp) {
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric error(IO.mapEnum(Tramp.Type));
780b57cec5SDimitry Andric error(IO.mapInteger(Tramp.Size));
790b57cec5SDimitry Andric error(IO.mapInteger(Tramp.ThunkOffset));
800b57cec5SDimitry Andric error(IO.mapInteger(Tramp.TargetOffset));
810b57cec5SDimitry Andric error(IO.mapInteger(Tramp.ThunkSection));
820b57cec5SDimitry Andric error(IO.mapInteger(Tramp.TargetSection));
830b57cec5SDimitry Andric
840b57cec5SDimitry Andric return Error::success();
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,SectionSym & Section)870b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
880b57cec5SDimitry Andric SectionSym &Section) {
890b57cec5SDimitry Andric uint8_t Padding = 0;
900b57cec5SDimitry Andric
910b57cec5SDimitry Andric error(IO.mapInteger(Section.SectionNumber));
920b57cec5SDimitry Andric error(IO.mapInteger(Section.Alignment));
930b57cec5SDimitry Andric error(IO.mapInteger(Padding));
940b57cec5SDimitry Andric error(IO.mapInteger(Section.Rva));
950b57cec5SDimitry Andric error(IO.mapInteger(Section.Length));
960b57cec5SDimitry Andric error(IO.mapInteger(Section.Characteristics));
970b57cec5SDimitry Andric error(IO.mapStringZ(Section.Name));
980b57cec5SDimitry Andric
990b57cec5SDimitry Andric return Error::success();
1000b57cec5SDimitry Andric }
1010b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,CoffGroupSym & CoffGroup)1020b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1030b57cec5SDimitry Andric CoffGroupSym &CoffGroup) {
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric error(IO.mapInteger(CoffGroup.Size));
1060b57cec5SDimitry Andric error(IO.mapInteger(CoffGroup.Characteristics));
1070b57cec5SDimitry Andric error(IO.mapInteger(CoffGroup.Offset));
1080b57cec5SDimitry Andric error(IO.mapInteger(CoffGroup.Segment));
1090b57cec5SDimitry Andric error(IO.mapStringZ(CoffGroup.Name));
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric return Error::success();
1120b57cec5SDimitry Andric }
1130b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,BPRelativeSym & BPRel)1140b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1150b57cec5SDimitry Andric BPRelativeSym &BPRel) {
1160b57cec5SDimitry Andric
1170b57cec5SDimitry Andric error(IO.mapInteger(BPRel.Offset));
1180b57cec5SDimitry Andric error(IO.mapInteger(BPRel.Type));
1190b57cec5SDimitry Andric error(IO.mapStringZ(BPRel.Name));
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andric return Error::success();
1220b57cec5SDimitry Andric }
1230b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,BuildInfoSym & BuildInfo)1240b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1250b57cec5SDimitry Andric BuildInfoSym &BuildInfo) {
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric error(IO.mapInteger(BuildInfo.BuildId));
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric return Error::success();
1300b57cec5SDimitry Andric }
1310b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,CallSiteInfoSym & CallSiteInfo)1320b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1330b57cec5SDimitry Andric CallSiteInfoSym &CallSiteInfo) {
1340b57cec5SDimitry Andric uint16_t Padding = 0;
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andric error(IO.mapInteger(CallSiteInfo.CodeOffset));
1370b57cec5SDimitry Andric error(IO.mapInteger(CallSiteInfo.Segment));
1380b57cec5SDimitry Andric error(IO.mapInteger(Padding));
1390b57cec5SDimitry Andric error(IO.mapInteger(CallSiteInfo.Type));
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric return Error::success();
1420b57cec5SDimitry Andric }
1430b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,EnvBlockSym & EnvBlock)1440b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1450b57cec5SDimitry Andric EnvBlockSym &EnvBlock) {
1460b57cec5SDimitry Andric
1470b57cec5SDimitry Andric uint8_t Reserved = 0;
1480b57cec5SDimitry Andric error(IO.mapInteger(Reserved));
1490b57cec5SDimitry Andric error(IO.mapStringZVectorZ(EnvBlock.Fields));
1500b57cec5SDimitry Andric
1510b57cec5SDimitry Andric return Error::success();
1520b57cec5SDimitry Andric }
1530b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,FileStaticSym & FileStatic)1540b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1550b57cec5SDimitry Andric FileStaticSym &FileStatic) {
1560b57cec5SDimitry Andric
1570b57cec5SDimitry Andric error(IO.mapInteger(FileStatic.Index));
1580b57cec5SDimitry Andric error(IO.mapInteger(FileStatic.ModFilenameOffset));
1590b57cec5SDimitry Andric error(IO.mapEnum(FileStatic.Flags));
1600b57cec5SDimitry Andric error(IO.mapStringZ(FileStatic.Name));
1610b57cec5SDimitry Andric
1620b57cec5SDimitry Andric return Error::success();
1630b57cec5SDimitry Andric }
1640b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ExportSym & Export)1650b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric error(IO.mapInteger(Export.Ordinal));
1680b57cec5SDimitry Andric error(IO.mapEnum(Export.Flags));
1690b57cec5SDimitry Andric error(IO.mapStringZ(Export.Name));
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric return Error::success();
1720b57cec5SDimitry Andric }
1730b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,Compile2Sym & Compile2)1740b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1750b57cec5SDimitry Andric Compile2Sym &Compile2) {
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric error(IO.mapEnum(Compile2.Flags));
1780b57cec5SDimitry Andric error(IO.mapEnum(Compile2.Machine));
1790b57cec5SDimitry Andric error(IO.mapInteger(Compile2.VersionFrontendMajor));
1800b57cec5SDimitry Andric error(IO.mapInteger(Compile2.VersionFrontendMinor));
1810b57cec5SDimitry Andric error(IO.mapInteger(Compile2.VersionFrontendBuild));
1820b57cec5SDimitry Andric error(IO.mapInteger(Compile2.VersionBackendMajor));
1830b57cec5SDimitry Andric error(IO.mapInteger(Compile2.VersionBackendMinor));
1840b57cec5SDimitry Andric error(IO.mapInteger(Compile2.VersionBackendBuild));
1850b57cec5SDimitry Andric error(IO.mapStringZ(Compile2.Version));
1860b57cec5SDimitry Andric error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
1870b57cec5SDimitry Andric
1880b57cec5SDimitry Andric return Error::success();
1890b57cec5SDimitry Andric }
1900b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,Compile3Sym & Compile3)1910b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
1920b57cec5SDimitry Andric Compile3Sym &Compile3) {
1930b57cec5SDimitry Andric
1940b57cec5SDimitry Andric error(IO.mapEnum(Compile3.Flags));
1950b57cec5SDimitry Andric error(IO.mapEnum(Compile3.Machine));
1960b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionFrontendMajor));
1970b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionFrontendMinor));
1980b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionFrontendBuild));
1990b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionFrontendQFE));
2000b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionBackendMajor));
2010b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionBackendMinor));
2020b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionBackendBuild));
2030b57cec5SDimitry Andric error(IO.mapInteger(Compile3.VersionBackendQFE));
2040b57cec5SDimitry Andric error(IO.mapStringZ(Compile3.Version));
2050b57cec5SDimitry Andric
2060b57cec5SDimitry Andric return Error::success();
2070b57cec5SDimitry Andric }
2080b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ConstantSym & Constant)2090b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
2100b57cec5SDimitry Andric ConstantSym &Constant) {
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andric error(IO.mapInteger(Constant.Type));
2130b57cec5SDimitry Andric error(IO.mapEncodedInteger(Constant.Value));
2140b57cec5SDimitry Andric error(IO.mapStringZ(Constant.Name));
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andric return Error::success();
2170b57cec5SDimitry Andric }
2180b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DataSym & Data)2190b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
2200b57cec5SDimitry Andric
2210b57cec5SDimitry Andric error(IO.mapInteger(Data.Type));
2220b57cec5SDimitry Andric error(IO.mapInteger(Data.DataOffset));
2230b57cec5SDimitry Andric error(IO.mapInteger(Data.Segment));
2240b57cec5SDimitry Andric error(IO.mapStringZ(Data.Name));
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andric return Error::success();
2270b57cec5SDimitry Andric }
2280b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelSym & DefRangeFramePointerRel)2290b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
2300b57cec5SDimitry Andric CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
2310b57cec5SDimitry Andric
2328bcb0991SDimitry Andric error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
2330b57cec5SDimitry Andric error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
2340b57cec5SDimitry Andric error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric return Error::success();
2370b57cec5SDimitry Andric }
2380b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelFullScopeSym & DefRangeFramePointerRelFullScope)2390b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
2400b57cec5SDimitry Andric CVSymbol &CVR,
2410b57cec5SDimitry Andric DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andric error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andric return Error::success();
2460b57cec5SDimitry Andric }
2470b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterRelSym & DefRangeRegisterRel)2480b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
2490b57cec5SDimitry Andric CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andric error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
2520b57cec5SDimitry Andric error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
2530b57cec5SDimitry Andric error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
2540b57cec5SDimitry Andric error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
2550b57cec5SDimitry Andric error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andric return Error::success();
2580b57cec5SDimitry Andric }
2590b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterSym & DefRangeRegister)2600b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
2610b57cec5SDimitry Andric CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric error(IO.mapObject(DefRangeRegister.Hdr.Register));
2640b57cec5SDimitry Andric error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
2650b57cec5SDimitry Andric error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
2660b57cec5SDimitry Andric error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
2670b57cec5SDimitry Andric
2680b57cec5SDimitry Andric return Error::success();
2690b57cec5SDimitry Andric }
2700b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldRegisterSym & DefRangeSubfieldRegister)2710b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
2720b57cec5SDimitry Andric CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
2730b57cec5SDimitry Andric
2740b57cec5SDimitry Andric error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
2750b57cec5SDimitry Andric error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
2760b57cec5SDimitry Andric error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
2770b57cec5SDimitry Andric error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
2780b57cec5SDimitry Andric error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andric return Error::success();
2810b57cec5SDimitry Andric }
2820b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldSym & DefRangeSubfield)2830b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
2840b57cec5SDimitry Andric CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric error(IO.mapInteger(DefRangeSubfield.Program));
2870b57cec5SDimitry Andric error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
2880b57cec5SDimitry Andric error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
2890b57cec5SDimitry Andric error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
2900b57cec5SDimitry Andric
2910b57cec5SDimitry Andric return Error::success();
2920b57cec5SDimitry Andric }
2930b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,DefRangeSym & DefRange)2940b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
2950b57cec5SDimitry Andric DefRangeSym &DefRange) {
2960b57cec5SDimitry Andric
2970b57cec5SDimitry Andric error(IO.mapInteger(DefRange.Program));
2980b57cec5SDimitry Andric error(mapLocalVariableAddrRange(IO, DefRange.Range));
2990b57cec5SDimitry Andric error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andric return Error::success();
3020b57cec5SDimitry Andric }
3030b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,FrameCookieSym & FrameCookie)3040b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
3050b57cec5SDimitry Andric FrameCookieSym &FrameCookie) {
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andric error(IO.mapInteger(FrameCookie.CodeOffset));
3080b57cec5SDimitry Andric error(IO.mapInteger(FrameCookie.Register));
3090b57cec5SDimitry Andric error(IO.mapEnum(FrameCookie.CookieKind));
3100b57cec5SDimitry Andric error(IO.mapInteger(FrameCookie.Flags));
3110b57cec5SDimitry Andric
3120b57cec5SDimitry Andric return Error::success();
3130b57cec5SDimitry Andric }
3140b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,FrameProcSym & FrameProc)3150b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
3160b57cec5SDimitry Andric FrameProcSym &FrameProc) {
3170b57cec5SDimitry Andric error(IO.mapInteger(FrameProc.TotalFrameBytes));
3180b57cec5SDimitry Andric error(IO.mapInteger(FrameProc.PaddingFrameBytes));
3190b57cec5SDimitry Andric error(IO.mapInteger(FrameProc.OffsetToPadding));
3200b57cec5SDimitry Andric error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
3210b57cec5SDimitry Andric error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
3220b57cec5SDimitry Andric error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
3230b57cec5SDimitry Andric error(IO.mapEnum(FrameProc.Flags));
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andric return Error::success();
3260b57cec5SDimitry Andric }
3270b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,HeapAllocationSiteSym & HeapAllocSite)3280b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(
3290b57cec5SDimitry Andric CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
3300b57cec5SDimitry Andric
3310b57cec5SDimitry Andric error(IO.mapInteger(HeapAllocSite.CodeOffset));
3320b57cec5SDimitry Andric error(IO.mapInteger(HeapAllocSite.Segment));
3330b57cec5SDimitry Andric error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
3340b57cec5SDimitry Andric error(IO.mapInteger(HeapAllocSite.Type));
3350b57cec5SDimitry Andric
3360b57cec5SDimitry Andric return Error::success();
3370b57cec5SDimitry Andric }
3380b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,InlineSiteSym & InlineSite)3390b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
3400b57cec5SDimitry Andric InlineSiteSym &InlineSite) {
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andric error(IO.mapInteger(InlineSite.Parent));
3430b57cec5SDimitry Andric error(IO.mapInteger(InlineSite.End));
3440b57cec5SDimitry Andric error(IO.mapInteger(InlineSite.Inlinee));
3450b57cec5SDimitry Andric error(IO.mapByteVectorTail(InlineSite.AnnotationData));
3460b57cec5SDimitry Andric
3470b57cec5SDimitry Andric return Error::success();
3480b57cec5SDimitry Andric }
3490b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,RegisterSym & Register)3500b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
3510b57cec5SDimitry Andric RegisterSym &Register) {
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andric error(IO.mapInteger(Register.Index));
3540b57cec5SDimitry Andric error(IO.mapEnum(Register.Register));
3550b57cec5SDimitry Andric error(IO.mapStringZ(Register.Name));
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric return Error::success();
3580b57cec5SDimitry Andric }
3590b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,PublicSym32 & Public)3600b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
3610b57cec5SDimitry Andric PublicSym32 &Public) {
3620b57cec5SDimitry Andric
3630b57cec5SDimitry Andric error(IO.mapEnum(Public.Flags));
3640b57cec5SDimitry Andric error(IO.mapInteger(Public.Offset));
3650b57cec5SDimitry Andric error(IO.mapInteger(Public.Segment));
3660b57cec5SDimitry Andric error(IO.mapStringZ(Public.Name));
3670b57cec5SDimitry Andric
3680b57cec5SDimitry Andric return Error::success();
3690b57cec5SDimitry Andric }
3700b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ProcRefSym & ProcRef)3710b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
3720b57cec5SDimitry Andric ProcRefSym &ProcRef) {
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andric error(IO.mapInteger(ProcRef.SumName));
3750b57cec5SDimitry Andric error(IO.mapInteger(ProcRef.SymOffset));
3760b57cec5SDimitry Andric error(IO.mapInteger(ProcRef.Module));
3770b57cec5SDimitry Andric error(IO.mapStringZ(ProcRef.Name));
3780b57cec5SDimitry Andric
3790b57cec5SDimitry Andric return Error::success();
3800b57cec5SDimitry Andric }
3810b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,LabelSym & Label)3820b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andric error(IO.mapInteger(Label.CodeOffset));
3850b57cec5SDimitry Andric error(IO.mapInteger(Label.Segment));
3860b57cec5SDimitry Andric error(IO.mapEnum(Label.Flags));
3870b57cec5SDimitry Andric error(IO.mapStringZ(Label.Name));
3880b57cec5SDimitry Andric
3890b57cec5SDimitry Andric return Error::success();
3900b57cec5SDimitry Andric }
3910b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,LocalSym & Local)3920b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
3930b57cec5SDimitry Andric error(IO.mapInteger(Local.Type));
3940b57cec5SDimitry Andric error(IO.mapEnum(Local.Flags));
3950b57cec5SDimitry Andric error(IO.mapStringZ(Local.Name));
3960b57cec5SDimitry Andric
3970b57cec5SDimitry Andric return Error::success();
3980b57cec5SDimitry Andric }
3990b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ObjNameSym & ObjName)4000b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4010b57cec5SDimitry Andric ObjNameSym &ObjName) {
4020b57cec5SDimitry Andric
4030b57cec5SDimitry Andric error(IO.mapInteger(ObjName.Signature));
4040b57cec5SDimitry Andric error(IO.mapStringZ(ObjName.Name));
4050b57cec5SDimitry Andric
4060b57cec5SDimitry Andric return Error::success();
4070b57cec5SDimitry Andric }
4080b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ProcSym & Proc)4090b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
4100b57cec5SDimitry Andric error(IO.mapInteger(Proc.Parent));
4110b57cec5SDimitry Andric error(IO.mapInteger(Proc.End));
4120b57cec5SDimitry Andric error(IO.mapInteger(Proc.Next));
4130b57cec5SDimitry Andric error(IO.mapInteger(Proc.CodeSize));
4140b57cec5SDimitry Andric error(IO.mapInteger(Proc.DbgStart));
4150b57cec5SDimitry Andric error(IO.mapInteger(Proc.DbgEnd));
4160b57cec5SDimitry Andric error(IO.mapInteger(Proc.FunctionType));
4170b57cec5SDimitry Andric error(IO.mapInteger(Proc.CodeOffset));
4180b57cec5SDimitry Andric error(IO.mapInteger(Proc.Segment));
4190b57cec5SDimitry Andric error(IO.mapEnum(Proc.Flags));
4200b57cec5SDimitry Andric error(IO.mapStringZ(Proc.Name));
4210b57cec5SDimitry Andric return Error::success();
4220b57cec5SDimitry Andric }
4230b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ScopeEndSym & ScopeEnd)4240b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4250b57cec5SDimitry Andric ScopeEndSym &ScopeEnd) {
4260b57cec5SDimitry Andric return Error::success();
4270b57cec5SDimitry Andric }
4280b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,CallerSym & Caller)4290b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
4300b57cec5SDimitry Andric error(IO.mapVectorN<uint32_t>(
4310b57cec5SDimitry Andric Caller.Indices,
4320b57cec5SDimitry Andric [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
4330b57cec5SDimitry Andric return Error::success();
4340b57cec5SDimitry Andric }
4350b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,RegRelativeSym & RegRel)4360b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4370b57cec5SDimitry Andric RegRelativeSym &RegRel) {
4380b57cec5SDimitry Andric
4390b57cec5SDimitry Andric error(IO.mapInteger(RegRel.Offset));
4400b57cec5SDimitry Andric error(IO.mapInteger(RegRel.Type));
4410b57cec5SDimitry Andric error(IO.mapEnum(RegRel.Register));
4420b57cec5SDimitry Andric error(IO.mapStringZ(RegRel.Name));
4430b57cec5SDimitry Andric
4440b57cec5SDimitry Andric return Error::success();
4450b57cec5SDimitry Andric }
4460b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,ThreadLocalDataSym & Data)4470b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4480b57cec5SDimitry Andric ThreadLocalDataSym &Data) {
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andric error(IO.mapInteger(Data.Type));
4510b57cec5SDimitry Andric error(IO.mapInteger(Data.DataOffset));
4520b57cec5SDimitry Andric error(IO.mapInteger(Data.Segment));
4530b57cec5SDimitry Andric error(IO.mapStringZ(Data.Name));
4540b57cec5SDimitry Andric
4550b57cec5SDimitry Andric return Error::success();
4560b57cec5SDimitry Andric }
4570b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,UDTSym & UDT)4580b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
4590b57cec5SDimitry Andric
4600b57cec5SDimitry Andric error(IO.mapInteger(UDT.Type));
4610b57cec5SDimitry Andric error(IO.mapStringZ(UDT.Name));
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andric return Error::success();
4640b57cec5SDimitry Andric }
4650b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,UsingNamespaceSym & UN)4660b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4670b57cec5SDimitry Andric UsingNamespaceSym &UN) {
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andric error(IO.mapStringZ(UN.Name));
4700b57cec5SDimitry Andric
4710b57cec5SDimitry Andric return Error::success();
4720b57cec5SDimitry Andric }
4730b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,AnnotationSym & Annot)4740b57cec5SDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
4750b57cec5SDimitry Andric AnnotationSym &Annot) {
4760b57cec5SDimitry Andric
4770b57cec5SDimitry Andric error(IO.mapInteger(Annot.CodeOffset));
4780b57cec5SDimitry Andric error(IO.mapInteger(Annot.Segment));
4790b57cec5SDimitry Andric error(IO.mapVectorN<uint16_t>(
4800b57cec5SDimitry Andric Annot.Strings,
4810b57cec5SDimitry Andric [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));
4820b57cec5SDimitry Andric
4830b57cec5SDimitry Andric return Error::success();
4840b57cec5SDimitry Andric }
4850b57cec5SDimitry Andric
visitKnownRecord(CVSymbol & CVR,JumpTableSym & JumpTable)486*5f757f3fSDimitry Andric Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
487*5f757f3fSDimitry Andric JumpTableSym &JumpTable) {
488*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.BaseOffset));
489*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.BaseSegment));
490*5f757f3fSDimitry Andric error(IO.mapEnum(JumpTable.SwitchType));
491*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.BranchOffset));
492*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.TableOffset));
493*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.BranchSegment));
494*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.TableSegment));
495*5f757f3fSDimitry Andric error(IO.mapInteger(JumpTable.EntriesCount));
496*5f757f3fSDimitry Andric return Error::success();
497*5f757f3fSDimitry Andric }
498*5f757f3fSDimitry Andric
decodeFramePtrReg(EncodedFramePtrReg EncodedReg,CPUType CPU)4990b57cec5SDimitry Andric RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
5000b57cec5SDimitry Andric CPUType CPU) {
5010b57cec5SDimitry Andric assert(unsigned(EncodedReg) < 4);
5020b57cec5SDimitry Andric switch (CPU) {
5030b57cec5SDimitry Andric // FIXME: Add ARM and AArch64 variants here.
5040b57cec5SDimitry Andric default:
5050b57cec5SDimitry Andric break;
5060b57cec5SDimitry Andric case CPUType::Intel8080:
5070b57cec5SDimitry Andric case CPUType::Intel8086:
5080b57cec5SDimitry Andric case CPUType::Intel80286:
5090b57cec5SDimitry Andric case CPUType::Intel80386:
5100b57cec5SDimitry Andric case CPUType::Intel80486:
5110b57cec5SDimitry Andric case CPUType::Pentium:
5120b57cec5SDimitry Andric case CPUType::PentiumPro:
5130b57cec5SDimitry Andric case CPUType::Pentium3:
5140b57cec5SDimitry Andric switch (EncodedReg) {
5150b57cec5SDimitry Andric case EncodedFramePtrReg::None: return RegisterId::NONE;
5160b57cec5SDimitry Andric case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
5170b57cec5SDimitry Andric case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
5180b57cec5SDimitry Andric case EncodedFramePtrReg::BasePtr: return RegisterId::EBX;
5190b57cec5SDimitry Andric }
5200b57cec5SDimitry Andric llvm_unreachable("bad encoding");
5210b57cec5SDimitry Andric case CPUType::X64:
5220b57cec5SDimitry Andric switch (EncodedReg) {
5230b57cec5SDimitry Andric case EncodedFramePtrReg::None: return RegisterId::NONE;
5240b57cec5SDimitry Andric case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
5250b57cec5SDimitry Andric case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
5260b57cec5SDimitry Andric case EncodedFramePtrReg::BasePtr: return RegisterId::R13;
5270b57cec5SDimitry Andric }
5280b57cec5SDimitry Andric llvm_unreachable("bad encoding");
5290b57cec5SDimitry Andric }
5300b57cec5SDimitry Andric return RegisterId::NONE;
5310b57cec5SDimitry Andric }
5320b57cec5SDimitry Andric
encodeFramePtrReg(RegisterId Reg,CPUType CPU)5330b57cec5SDimitry Andric EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
5340b57cec5SDimitry Andric switch (CPU) {
5350b57cec5SDimitry Andric // FIXME: Add ARM and AArch64 variants here.
5360b57cec5SDimitry Andric default:
5370b57cec5SDimitry Andric break;
5380b57cec5SDimitry Andric case CPUType::Intel8080:
5390b57cec5SDimitry Andric case CPUType::Intel8086:
5400b57cec5SDimitry Andric case CPUType::Intel80286:
5410b57cec5SDimitry Andric case CPUType::Intel80386:
5420b57cec5SDimitry Andric case CPUType::Intel80486:
5430b57cec5SDimitry Andric case CPUType::Pentium:
5440b57cec5SDimitry Andric case CPUType::PentiumPro:
5450b57cec5SDimitry Andric case CPUType::Pentium3:
5460b57cec5SDimitry Andric switch (Reg) {
5470b57cec5SDimitry Andric case RegisterId::VFRAME:
5480b57cec5SDimitry Andric return EncodedFramePtrReg::StackPtr;
5490b57cec5SDimitry Andric case RegisterId::EBP:
5500b57cec5SDimitry Andric return EncodedFramePtrReg::FramePtr;
5510b57cec5SDimitry Andric case RegisterId::EBX:
5520b57cec5SDimitry Andric return EncodedFramePtrReg::BasePtr;
5530b57cec5SDimitry Andric default:
5540b57cec5SDimitry Andric break;
5550b57cec5SDimitry Andric }
5560b57cec5SDimitry Andric break;
5570b57cec5SDimitry Andric case CPUType::X64:
5580b57cec5SDimitry Andric switch (Reg) {
5590b57cec5SDimitry Andric case RegisterId::RSP:
5600b57cec5SDimitry Andric return EncodedFramePtrReg::StackPtr;
5610b57cec5SDimitry Andric case RegisterId::RBP:
5620b57cec5SDimitry Andric return EncodedFramePtrReg::FramePtr;
5630b57cec5SDimitry Andric case RegisterId::R13:
5640b57cec5SDimitry Andric return EncodedFramePtrReg::BasePtr;
5650b57cec5SDimitry Andric default:
5660b57cec5SDimitry Andric break;
5670b57cec5SDimitry Andric }
5680b57cec5SDimitry Andric break;
5690b57cec5SDimitry Andric }
5700b57cec5SDimitry Andric return EncodedFramePtrReg::None;
5710b57cec5SDimitry Andric }
572