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