diff options
| author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
|---|---|---|
| committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
| commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
| tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp | |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp')
| -rw-r--r-- | contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp | 558 | 
1 files changed, 558 insertions, 0 deletions
| diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp new file mode 100644 index 00000000000..3b627930e27 --- /dev/null +++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp @@ -0,0 +1,558 @@ +//===- 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, 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, +                                            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(); +} + +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; +} | 
