| //===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h" | |
| using namespace llvm; | |
| using namespace llvm::codeview; | |
| #define error(X) \ | |
| if (auto EC = X) \ | |
| return EC; | |
| namespace { | |
| struct MapGap { | |
| Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const { | |
| error(IO.mapInteger(Gap.GapStartOffset)); | |
| error(IO.mapInteger(Gap.Range)); | |
| return Error::success(); | |
| } | |
| }; | |
| } | |
| static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO, | |
| LocalVariableAddrRange &Range) { | |
| error(IO.mapInteger(Range.OffsetStart)); | |
| error(IO.mapInteger(Range.ISectStart)); | |
| error(IO.mapInteger(Range.Range)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) { | |
| error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix))); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) { | |
| error(IO.padToAlignment(alignOf(Container))); | |
| error(IO.endRecord()); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) { | |
| error(IO.mapInteger(Block.Parent)); | |
| error(IO.mapInteger(Block.End)); | |
| error(IO.mapInteger(Block.CodeSize)); | |
| error(IO.mapInteger(Block.CodeOffset)); | |
| error(IO.mapInteger(Block.Segment)); | |
| error(IO.mapStringZ(Block.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) { | |
| error(IO.mapInteger(Thunk.Parent)); | |
| error(IO.mapInteger(Thunk.End)); | |
| error(IO.mapInteger(Thunk.Next)); | |
| error(IO.mapInteger(Thunk.Offset)); | |
| error(IO.mapInteger(Thunk.Segment)); | |
| error(IO.mapInteger(Thunk.Length)); | |
| error(IO.mapEnum(Thunk.Thunk)); | |
| error(IO.mapStringZ(Thunk.Name)); | |
| error(IO.mapByteVectorTail(Thunk.VariantData)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| TrampolineSym &Tramp) { | |
| error(IO.mapEnum(Tramp.Type)); | |
| error(IO.mapInteger(Tramp.Size)); | |
| error(IO.mapInteger(Tramp.ThunkOffset)); | |
| error(IO.mapInteger(Tramp.TargetOffset)); | |
| error(IO.mapInteger(Tramp.ThunkSection)); | |
| error(IO.mapInteger(Tramp.TargetSection)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| SectionSym &Section) { | |
| uint8_t Padding = 0; | |
| error(IO.mapInteger(Section.SectionNumber)); | |
| error(IO.mapInteger(Section.Alignment)); | |
| error(IO.mapInteger(Padding)); | |
| error(IO.mapInteger(Section.Rva)); | |
| error(IO.mapInteger(Section.Length)); | |
| error(IO.mapInteger(Section.Characteristics)); | |
| error(IO.mapStringZ(Section.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| CoffGroupSym &CoffGroup) { | |
| error(IO.mapInteger(CoffGroup.Size)); | |
| error(IO.mapInteger(CoffGroup.Characteristics)); | |
| error(IO.mapInteger(CoffGroup.Offset)); | |
| error(IO.mapInteger(CoffGroup.Segment)); | |
| error(IO.mapStringZ(CoffGroup.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| BPRelativeSym &BPRel) { | |
| error(IO.mapInteger(BPRel.Offset)); | |
| error(IO.mapInteger(BPRel.Type)); | |
| error(IO.mapStringZ(BPRel.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| BuildInfoSym &BuildInfo) { | |
| error(IO.mapInteger(BuildInfo.BuildId)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| CallSiteInfoSym &CallSiteInfo) { | |
| uint16_t Padding = 0; | |
| error(IO.mapInteger(CallSiteInfo.CodeOffset)); | |
| error(IO.mapInteger(CallSiteInfo.Segment)); | |
| error(IO.mapInteger(Padding)); | |
| error(IO.mapInteger(CallSiteInfo.Type)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| EnvBlockSym &EnvBlock) { | |
| uint8_t Reserved = 0; | |
| error(IO.mapInteger(Reserved)); | |
| error(IO.mapStringZVectorZ(EnvBlock.Fields)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| FileStaticSym &FileStatic) { | |
| error(IO.mapInteger(FileStatic.Index)); | |
| error(IO.mapInteger(FileStatic.ModFilenameOffset)); | |
| error(IO.mapEnum(FileStatic.Flags)); | |
| error(IO.mapStringZ(FileStatic.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) { | |
| error(IO.mapInteger(Export.Ordinal)); | |
| error(IO.mapEnum(Export.Flags)); | |
| error(IO.mapStringZ(Export.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| Compile2Sym &Compile2) { | |
| error(IO.mapEnum(Compile2.Flags)); | |
| error(IO.mapEnum(Compile2.Machine)); | |
| error(IO.mapInteger(Compile2.VersionFrontendMajor)); | |
| error(IO.mapInteger(Compile2.VersionFrontendMinor)); | |
| error(IO.mapInteger(Compile2.VersionFrontendBuild)); | |
| error(IO.mapInteger(Compile2.VersionBackendMajor)); | |
| error(IO.mapInteger(Compile2.VersionBackendMinor)); | |
| error(IO.mapInteger(Compile2.VersionBackendBuild)); | |
| error(IO.mapStringZ(Compile2.Version)); | |
| error(IO.mapStringZVectorZ(Compile2.ExtraStrings)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| Compile3Sym &Compile3) { | |
| error(IO.mapEnum(Compile3.Flags)); | |
| error(IO.mapEnum(Compile3.Machine)); | |
| error(IO.mapInteger(Compile3.VersionFrontendMajor)); | |
| error(IO.mapInteger(Compile3.VersionFrontendMinor)); | |
| error(IO.mapInteger(Compile3.VersionFrontendBuild)); | |
| error(IO.mapInteger(Compile3.VersionFrontendQFE)); | |
| error(IO.mapInteger(Compile3.VersionBackendMajor)); | |
| error(IO.mapInteger(Compile3.VersionBackendMinor)); | |
| error(IO.mapInteger(Compile3.VersionBackendBuild)); | |
| error(IO.mapInteger(Compile3.VersionBackendQFE)); | |
| error(IO.mapStringZ(Compile3.Version)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| ConstantSym &Constant) { | |
| error(IO.mapInteger(Constant.Type)); | |
| error(IO.mapEncodedInteger(Constant.Value)); | |
| error(IO.mapStringZ(Constant.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) { | |
| error(IO.mapInteger(Data.Type)); | |
| error(IO.mapInteger(Data.DataOffset)); | |
| error(IO.mapInteger(Data.Segment)); | |
| error(IO.mapStringZ(Data.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) { | |
| error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset)); | |
| error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range)); | |
| error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, | |
| DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) { | |
| error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) { | |
| error(IO.mapObject(DefRangeRegisterRel.Hdr.Register)); | |
| error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags)); | |
| error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset)); | |
| error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range)); | |
| error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, DefRangeRegisterRelIndirSym &DefRangeRegisterRelIndir) { | |
| error(IO.mapObject(DefRangeRegisterRelIndir.Hdr.Register)); | |
| error(IO.mapObject(DefRangeRegisterRelIndir.Hdr.Flags)); | |
| error(IO.mapObject(DefRangeRegisterRelIndir.Hdr.BasePointerOffset)); | |
| error(IO.mapObject(DefRangeRegisterRelIndir.Hdr.OffsetInUdt)); | |
| error(mapLocalVariableAddrRange(IO, DefRangeRegisterRelIndir.Range)); | |
| error(IO.mapVectorTail(DefRangeRegisterRelIndir.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) { | |
| error(IO.mapObject(DefRangeRegister.Hdr.Register)); | |
| error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName)); | |
| error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range)); | |
| error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) { | |
| error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register)); | |
| error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName)); | |
| error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent)); | |
| error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range)); | |
| error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) { | |
| error(IO.mapInteger(DefRangeSubfield.Program)); | |
| error(IO.mapInteger(DefRangeSubfield.OffsetInParent)); | |
| error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range)); | |
| error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| DefRangeSym &DefRange) { | |
| error(IO.mapInteger(DefRange.Program)); | |
| error(mapLocalVariableAddrRange(IO, DefRange.Range)); | |
| error(IO.mapVectorTail(DefRange.Gaps, MapGap())); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| FrameCookieSym &FrameCookie) { | |
| error(IO.mapInteger(FrameCookie.CodeOffset)); | |
| error(IO.mapInteger(FrameCookie.Register)); | |
| error(IO.mapEnum(FrameCookie.CookieKind)); | |
| error(IO.mapInteger(FrameCookie.Flags)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| FrameProcSym &FrameProc) { | |
| error(IO.mapInteger(FrameProc.TotalFrameBytes)); | |
| error(IO.mapInteger(FrameProc.PaddingFrameBytes)); | |
| error(IO.mapInteger(FrameProc.OffsetToPadding)); | |
| error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters)); | |
| error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler)); | |
| error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler)); | |
| error(IO.mapEnum(FrameProc.Flags)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord( | |
| CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) { | |
| error(IO.mapInteger(HeapAllocSite.CodeOffset)); | |
| error(IO.mapInteger(HeapAllocSite.Segment)); | |
| error(IO.mapInteger(HeapAllocSite.CallInstructionSize)); | |
| error(IO.mapInteger(HeapAllocSite.Type)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| InlineSiteSym &InlineSite) { | |
| error(IO.mapInteger(InlineSite.Parent)); | |
| error(IO.mapInteger(InlineSite.End)); | |
| error(IO.mapInteger(InlineSite.Inlinee)); | |
| error(IO.mapByteVectorTail(InlineSite.AnnotationData)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| RegisterSym &Register) { | |
| error(IO.mapInteger(Register.Index)); | |
| error(IO.mapEnum(Register.Register)); | |
| error(IO.mapStringZ(Register.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| PublicSym32 &Public) { | |
| error(IO.mapEnum(Public.Flags)); | |
| error(IO.mapInteger(Public.Offset)); | |
| error(IO.mapInteger(Public.Segment)); | |
| error(IO.mapStringZ(Public.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| ProcRefSym &ProcRef) { | |
| error(IO.mapInteger(ProcRef.SumName)); | |
| error(IO.mapInteger(ProcRef.SymOffset)); | |
| error(IO.mapInteger(ProcRef.Module)); | |
| error(IO.mapStringZ(ProcRef.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) { | |
| error(IO.mapInteger(Label.CodeOffset)); | |
| error(IO.mapInteger(Label.Segment)); | |
| error(IO.mapEnum(Label.Flags)); | |
| error(IO.mapStringZ(Label.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) { | |
| error(IO.mapInteger(Local.Type)); | |
| error(IO.mapEnum(Local.Flags)); | |
| error(IO.mapStringZ(Local.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| ObjNameSym &ObjName) { | |
| error(IO.mapInteger(ObjName.Signature)); | |
| error(IO.mapStringZ(ObjName.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) { | |
| error(IO.mapInteger(Proc.Parent)); | |
| error(IO.mapInteger(Proc.End)); | |
| error(IO.mapInteger(Proc.Next)); | |
| error(IO.mapInteger(Proc.CodeSize)); | |
| error(IO.mapInteger(Proc.DbgStart)); | |
| error(IO.mapInteger(Proc.DbgEnd)); | |
| error(IO.mapInteger(Proc.FunctionType)); | |
| error(IO.mapInteger(Proc.CodeOffset)); | |
| error(IO.mapInteger(Proc.Segment)); | |
| error(IO.mapEnum(Proc.Flags)); | |
| error(IO.mapStringZ(Proc.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| ScopeEndSym &ScopeEnd) { | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) { | |
| error(IO.mapVectorN<uint32_t>( | |
| Caller.Indices, | |
| [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); })); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| RegRelativeSym &RegRel) { | |
| error(IO.mapInteger(RegRel.Offset)); | |
| error(IO.mapInteger(RegRel.Type)); | |
| error(IO.mapEnum(RegRel.Register)); | |
| error(IO.mapStringZ(RegRel.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| RegRelativeIndirSym &RegRelIndir) { | |
| error(IO.mapInteger(RegRelIndir.Offset)); | |
| error(IO.mapInteger(RegRelIndir.Type)); | |
| error(IO.mapInteger(RegRelIndir.OffsetInUdt)); | |
| error(IO.mapEnum(RegRelIndir.Register)); | |
| error(IO.mapStringZ(RegRelIndir.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| ThreadLocalDataSym &Data) { | |
| error(IO.mapInteger(Data.Type)); | |
| error(IO.mapInteger(Data.DataOffset)); | |
| error(IO.mapInteger(Data.Segment)); | |
| error(IO.mapStringZ(Data.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) { | |
| error(IO.mapInteger(UDT.Type)); | |
| error(IO.mapStringZ(UDT.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| UsingNamespaceSym &UN) { | |
| error(IO.mapStringZ(UN.Name)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| AnnotationSym &Annot) { | |
| error(IO.mapInteger(Annot.CodeOffset)); | |
| error(IO.mapInteger(Annot.Segment)); | |
| error(IO.mapVectorN<uint16_t>( | |
| Annot.Strings, | |
| [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); })); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| JumpTableSym &JumpTable) { | |
| error(IO.mapInteger(JumpTable.BaseOffset)); | |
| error(IO.mapInteger(JumpTable.BaseSegment)); | |
| error(IO.mapEnum(JumpTable.SwitchType)); | |
| error(IO.mapInteger(JumpTable.BranchOffset)); | |
| error(IO.mapInteger(JumpTable.TableOffset)); | |
| error(IO.mapInteger(JumpTable.BranchSegment)); | |
| error(IO.mapInteger(JumpTable.TableSegment)); | |
| error(IO.mapInteger(JumpTable.EntriesCount)); | |
| return Error::success(); | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| HotPatchFuncSym &HotPatchFunc) { | |
| error(IO.mapInteger(HotPatchFunc.Function)); | |
| error(IO.mapStringZ(HotPatchFunc.Name)); | |
| return Error::success(); | |
| } | |
| RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg, | |
| CPUType CPU) { | |
| assert(unsigned(EncodedReg) < 4); | |
| switch (CPU) { | |
| // FIXME: Add ARM and AArch64 variants here. | |
| default: | |
| break; | |
| case CPUType::Intel8080: | |
| case CPUType::Intel8086: | |
| case CPUType::Intel80286: | |
| case CPUType::Intel80386: | |
| case CPUType::Intel80486: | |
| case CPUType::Pentium: | |
| case CPUType::PentiumPro: | |
| case CPUType::Pentium3: | |
| switch (EncodedReg) { | |
| case EncodedFramePtrReg::None: return RegisterId::NONE; | |
| case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME; | |
| case EncodedFramePtrReg::FramePtr: return RegisterId::EBP; | |
| case EncodedFramePtrReg::BasePtr: return RegisterId::EBX; | |
| } | |
| llvm_unreachable("bad encoding"); | |
| case CPUType::X64: | |
| switch (EncodedReg) { | |
| case EncodedFramePtrReg::None: return RegisterId::NONE; | |
| case EncodedFramePtrReg::StackPtr: return RegisterId::RSP; | |
| case EncodedFramePtrReg::FramePtr: return RegisterId::RBP; | |
| case EncodedFramePtrReg::BasePtr: return RegisterId::R13; | |
| } | |
| llvm_unreachable("bad encoding"); | |
| } | |
| return RegisterId::NONE; | |
| } | |
| EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) { | |
| switch (CPU) { | |
| // FIXME: Add ARM and AArch64 variants here. | |
| default: | |
| break; | |
| case CPUType::Intel8080: | |
| case CPUType::Intel8086: | |
| case CPUType::Intel80286: | |
| case CPUType::Intel80386: | |
| case CPUType::Intel80486: | |
| case CPUType::Pentium: | |
| case CPUType::PentiumPro: | |
| case CPUType::Pentium3: | |
| switch (Reg) { | |
| case RegisterId::VFRAME: | |
| return EncodedFramePtrReg::StackPtr; | |
| case RegisterId::EBP: | |
| return EncodedFramePtrReg::FramePtr; | |
| case RegisterId::EBX: | |
| return EncodedFramePtrReg::BasePtr; | |
| default: | |
| break; | |
| } | |
| break; | |
| case CPUType::X64: | |
| switch (Reg) { | |
| case RegisterId::RSP: | |
| return EncodedFramePtrReg::StackPtr; | |
| case RegisterId::RBP: | |
| return EncodedFramePtrReg::FramePtr; | |
| case RegisterId::R13: | |
| return EncodedFramePtrReg::BasePtr; | |
| default: | |
| break; | |
| } | |
| break; | |
| } | |
| return EncodedFramePtrReg::None; | |
| } | |
| Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, | |
| AssociationSym &Assoc) { | |
| error(IO.mapEnum(Assoc.AssocKind)); | |
| error(IO.mapInteger(Assoc.CodeOffset)); | |
| error(IO.mapInteger(Assoc.Segment)); | |
| return Error::success(); | |
| } |