brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.7 KiB · 525343b Raw
579 lines · cpp
1//===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"10 11using namespace llvm;12using namespace llvm::codeview;13 14#define error(X)                                                               \15  if (auto EC = X)                                                             \16    return EC;17 18namespace {19struct MapGap {20  Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {21    error(IO.mapInteger(Gap.GapStartOffset));22    error(IO.mapInteger(Gap.Range));23    return Error::success();24  }25};26}27 28static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,29                                       LocalVariableAddrRange &Range) {30  error(IO.mapInteger(Range.OffsetStart));31  error(IO.mapInteger(Range.ISectStart));32  error(IO.mapInteger(Range.Range));33  return Error::success();34}35 36Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {37  error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));38  return Error::success();39}40 41Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {42  error(IO.padToAlignment(alignOf(Container)));43  error(IO.endRecord());44  return Error::success();45}46 47Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {48 49  error(IO.mapInteger(Block.Parent));50  error(IO.mapInteger(Block.End));51  error(IO.mapInteger(Block.CodeSize));52  error(IO.mapInteger(Block.CodeOffset));53  error(IO.mapInteger(Block.Segment));54  error(IO.mapStringZ(Block.Name));55 56  return Error::success();57}58 59Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {60 61  error(IO.mapInteger(Thunk.Parent));62  error(IO.mapInteger(Thunk.End));63  error(IO.mapInteger(Thunk.Next));64  error(IO.mapInteger(Thunk.Offset));65  error(IO.mapInteger(Thunk.Segment));66  error(IO.mapInteger(Thunk.Length));67  error(IO.mapEnum(Thunk.Thunk));68  error(IO.mapStringZ(Thunk.Name));69  error(IO.mapByteVectorTail(Thunk.VariantData));70 71  return Error::success();72}73 74Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,75                                            TrampolineSym &Tramp) {76 77  error(IO.mapEnum(Tramp.Type));78  error(IO.mapInteger(Tramp.Size));79  error(IO.mapInteger(Tramp.ThunkOffset));80  error(IO.mapInteger(Tramp.TargetOffset));81  error(IO.mapInteger(Tramp.ThunkSection));82  error(IO.mapInteger(Tramp.TargetSection));83 84  return Error::success();85}86 87Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,88                                            SectionSym &Section) {89  uint8_t Padding = 0;90 91  error(IO.mapInteger(Section.SectionNumber));92  error(IO.mapInteger(Section.Alignment));93  error(IO.mapInteger(Padding));94  error(IO.mapInteger(Section.Rva));95  error(IO.mapInteger(Section.Length));96  error(IO.mapInteger(Section.Characteristics));97  error(IO.mapStringZ(Section.Name));98 99  return Error::success();100}101 102Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,103                                            CoffGroupSym &CoffGroup) {104 105  error(IO.mapInteger(CoffGroup.Size));106  error(IO.mapInteger(CoffGroup.Characteristics));107  error(IO.mapInteger(CoffGroup.Offset));108  error(IO.mapInteger(CoffGroup.Segment));109  error(IO.mapStringZ(CoffGroup.Name));110 111  return Error::success();112}113 114Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,115                                            BPRelativeSym &BPRel) {116 117  error(IO.mapInteger(BPRel.Offset));118  error(IO.mapInteger(BPRel.Type));119  error(IO.mapStringZ(BPRel.Name));120 121  return Error::success();122}123 124Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,125                                            BuildInfoSym &BuildInfo) {126 127  error(IO.mapInteger(BuildInfo.BuildId));128 129  return Error::success();130}131 132Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,133                                            CallSiteInfoSym &CallSiteInfo) {134  uint16_t Padding = 0;135 136  error(IO.mapInteger(CallSiteInfo.CodeOffset));137  error(IO.mapInteger(CallSiteInfo.Segment));138  error(IO.mapInteger(Padding));139  error(IO.mapInteger(CallSiteInfo.Type));140 141  return Error::success();142}143 144Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,145                                            EnvBlockSym &EnvBlock) {146 147  uint8_t Reserved = 0;148  error(IO.mapInteger(Reserved));149  error(IO.mapStringZVectorZ(EnvBlock.Fields));150 151  return Error::success();152}153 154Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,155                                            FileStaticSym &FileStatic) {156 157  error(IO.mapInteger(FileStatic.Index));158  error(IO.mapInteger(FileStatic.ModFilenameOffset));159  error(IO.mapEnum(FileStatic.Flags));160  error(IO.mapStringZ(FileStatic.Name));161 162  return Error::success();163}164 165Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {166 167  error(IO.mapInteger(Export.Ordinal));168  error(IO.mapEnum(Export.Flags));169  error(IO.mapStringZ(Export.Name));170 171  return Error::success();172}173 174Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,175                                            Compile2Sym &Compile2) {176 177  error(IO.mapEnum(Compile2.Flags));178  error(IO.mapEnum(Compile2.Machine));179  error(IO.mapInteger(Compile2.VersionFrontendMajor));180  error(IO.mapInteger(Compile2.VersionFrontendMinor));181  error(IO.mapInteger(Compile2.VersionFrontendBuild));182  error(IO.mapInteger(Compile2.VersionBackendMajor));183  error(IO.mapInteger(Compile2.VersionBackendMinor));184  error(IO.mapInteger(Compile2.VersionBackendBuild));185  error(IO.mapStringZ(Compile2.Version));186  error(IO.mapStringZVectorZ(Compile2.ExtraStrings));187 188  return Error::success();189}190 191Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,192                                            Compile3Sym &Compile3) {193 194  error(IO.mapEnum(Compile3.Flags));195  error(IO.mapEnum(Compile3.Machine));196  error(IO.mapInteger(Compile3.VersionFrontendMajor));197  error(IO.mapInteger(Compile3.VersionFrontendMinor));198  error(IO.mapInteger(Compile3.VersionFrontendBuild));199  error(IO.mapInteger(Compile3.VersionFrontendQFE));200  error(IO.mapInteger(Compile3.VersionBackendMajor));201  error(IO.mapInteger(Compile3.VersionBackendMinor));202  error(IO.mapInteger(Compile3.VersionBackendBuild));203  error(IO.mapInteger(Compile3.VersionBackendQFE));204  error(IO.mapStringZ(Compile3.Version));205 206  return Error::success();207}208 209Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,210                                            ConstantSym &Constant) {211 212  error(IO.mapInteger(Constant.Type));213  error(IO.mapEncodedInteger(Constant.Value));214  error(IO.mapStringZ(Constant.Name));215 216  return Error::success();217}218 219Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {220 221  error(IO.mapInteger(Data.Type));222  error(IO.mapInteger(Data.DataOffset));223  error(IO.mapInteger(Data.Segment));224  error(IO.mapStringZ(Data.Name));225 226  return Error::success();227}228 229Error SymbolRecordMapping::visitKnownRecord(230    CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {231 232  error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));233  error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));234  error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));235 236  return Error::success();237}238 239Error SymbolRecordMapping::visitKnownRecord(240    CVSymbol &CVR,241    DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {242 243  error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));244 245  return Error::success();246}247 248Error SymbolRecordMapping::visitKnownRecord(249    CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {250 251  error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));252  error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));253  error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));254  error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));255  error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));256 257  return Error::success();258}259 260Error SymbolRecordMapping::visitKnownRecord(261    CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {262 263  error(IO.mapObject(DefRangeRegister.Hdr.Register));264  error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));265  error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));266  error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));267 268  return Error::success();269}270 271Error SymbolRecordMapping::visitKnownRecord(272    CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {273 274  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));275  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));276  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));277  error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));278  error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));279 280  return Error::success();281}282 283Error SymbolRecordMapping::visitKnownRecord(284    CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {285 286  error(IO.mapInteger(DefRangeSubfield.Program));287  error(IO.mapInteger(DefRangeSubfield.OffsetInParent));288  error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));289  error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));290 291  return Error::success();292}293 294Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,295                                            DefRangeSym &DefRange) {296 297  error(IO.mapInteger(DefRange.Program));298  error(mapLocalVariableAddrRange(IO, DefRange.Range));299  error(IO.mapVectorTail(DefRange.Gaps, MapGap()));300 301  return Error::success();302}303 304Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,305                                            FrameCookieSym &FrameCookie) {306 307  error(IO.mapInteger(FrameCookie.CodeOffset));308  error(IO.mapInteger(FrameCookie.Register));309  error(IO.mapEnum(FrameCookie.CookieKind));310  error(IO.mapInteger(FrameCookie.Flags));311 312  return Error::success();313}314 315Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,316                                            FrameProcSym &FrameProc) {317  error(IO.mapInteger(FrameProc.TotalFrameBytes));318  error(IO.mapInteger(FrameProc.PaddingFrameBytes));319  error(IO.mapInteger(FrameProc.OffsetToPadding));320  error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));321  error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));322  error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));323  error(IO.mapEnum(FrameProc.Flags));324 325  return Error::success();326}327 328Error SymbolRecordMapping::visitKnownRecord(329    CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {330 331  error(IO.mapInteger(HeapAllocSite.CodeOffset));332  error(IO.mapInteger(HeapAllocSite.Segment));333  error(IO.mapInteger(HeapAllocSite.CallInstructionSize));334  error(IO.mapInteger(HeapAllocSite.Type));335 336  return Error::success();337}338 339Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,340                                            InlineSiteSym &InlineSite) {341 342  error(IO.mapInteger(InlineSite.Parent));343  error(IO.mapInteger(InlineSite.End));344  error(IO.mapInteger(InlineSite.Inlinee));345  error(IO.mapByteVectorTail(InlineSite.AnnotationData));346 347  return Error::success();348}349 350Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,351                                            RegisterSym &Register) {352 353  error(IO.mapInteger(Register.Index));354  error(IO.mapEnum(Register.Register));355  error(IO.mapStringZ(Register.Name));356 357  return Error::success();358}359 360Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,361                                            PublicSym32 &Public) {362 363  error(IO.mapEnum(Public.Flags));364  error(IO.mapInteger(Public.Offset));365  error(IO.mapInteger(Public.Segment));366  error(IO.mapStringZ(Public.Name));367 368  return Error::success();369}370 371Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,372                                            ProcRefSym &ProcRef) {373 374  error(IO.mapInteger(ProcRef.SumName));375  error(IO.mapInteger(ProcRef.SymOffset));376  error(IO.mapInteger(ProcRef.Module));377  error(IO.mapStringZ(ProcRef.Name));378 379  return Error::success();380}381 382Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {383 384  error(IO.mapInteger(Label.CodeOffset));385  error(IO.mapInteger(Label.Segment));386  error(IO.mapEnum(Label.Flags));387  error(IO.mapStringZ(Label.Name));388 389  return Error::success();390}391 392Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {393  error(IO.mapInteger(Local.Type));394  error(IO.mapEnum(Local.Flags));395  error(IO.mapStringZ(Local.Name));396 397  return Error::success();398}399 400Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,401                                            ObjNameSym &ObjName) {402 403  error(IO.mapInteger(ObjName.Signature));404  error(IO.mapStringZ(ObjName.Name));405 406  return Error::success();407}408 409Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {410  error(IO.mapInteger(Proc.Parent));411  error(IO.mapInteger(Proc.End));412  error(IO.mapInteger(Proc.Next));413  error(IO.mapInteger(Proc.CodeSize));414  error(IO.mapInteger(Proc.DbgStart));415  error(IO.mapInteger(Proc.DbgEnd));416  error(IO.mapInteger(Proc.FunctionType));417  error(IO.mapInteger(Proc.CodeOffset));418  error(IO.mapInteger(Proc.Segment));419  error(IO.mapEnum(Proc.Flags));420  error(IO.mapStringZ(Proc.Name));421  return Error::success();422}423 424Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,425                                            ScopeEndSym &ScopeEnd) {426  return Error::success();427}428 429Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {430  error(IO.mapVectorN<uint32_t>(431      Caller.Indices,432      [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));433  return Error::success();434}435 436Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,437                                            RegRelativeSym &RegRel) {438 439  error(IO.mapInteger(RegRel.Offset));440  error(IO.mapInteger(RegRel.Type));441  error(IO.mapEnum(RegRel.Register));442  error(IO.mapStringZ(RegRel.Name));443 444  return Error::success();445}446 447Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,448                                            ThreadLocalDataSym &Data) {449 450  error(IO.mapInteger(Data.Type));451  error(IO.mapInteger(Data.DataOffset));452  error(IO.mapInteger(Data.Segment));453  error(IO.mapStringZ(Data.Name));454 455  return Error::success();456}457 458Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {459 460  error(IO.mapInteger(UDT.Type));461  error(IO.mapStringZ(UDT.Name));462 463  return Error::success();464}465 466Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,467                                            UsingNamespaceSym &UN) {468 469  error(IO.mapStringZ(UN.Name));470 471  return Error::success();472}473 474Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,475                                            AnnotationSym &Annot) {476 477  error(IO.mapInteger(Annot.CodeOffset));478  error(IO.mapInteger(Annot.Segment));479  error(IO.mapVectorN<uint16_t>(480      Annot.Strings,481      [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));482 483  return Error::success();484}485 486Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,487                                            JumpTableSym &JumpTable) {488  error(IO.mapInteger(JumpTable.BaseOffset));489  error(IO.mapInteger(JumpTable.BaseSegment));490  error(IO.mapEnum(JumpTable.SwitchType));491  error(IO.mapInteger(JumpTable.BranchOffset));492  error(IO.mapInteger(JumpTable.TableOffset));493  error(IO.mapInteger(JumpTable.BranchSegment));494  error(IO.mapInteger(JumpTable.TableSegment));495  error(IO.mapInteger(JumpTable.EntriesCount));496  return Error::success();497}498 499Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,500                                            HotPatchFuncSym &HotPatchFunc) {501  error(IO.mapInteger(HotPatchFunc.Function));502  error(IO.mapStringZ(HotPatchFunc.Name));503  return Error::success();504}505 506RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,507                                       CPUType CPU) {508  assert(unsigned(EncodedReg) < 4);509  switch (CPU) {510  // FIXME: Add ARM and AArch64 variants here.511  default:512    break;513  case CPUType::Intel8080:514  case CPUType::Intel8086:515  case CPUType::Intel80286:516  case CPUType::Intel80386:517  case CPUType::Intel80486:518  case CPUType::Pentium:519  case CPUType::PentiumPro:520  case CPUType::Pentium3:521    switch (EncodedReg) {522    case EncodedFramePtrReg::None:     return RegisterId::NONE;523    case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;524    case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;525    case EncodedFramePtrReg::BasePtr:  return RegisterId::EBX;526    }527    llvm_unreachable("bad encoding");528  case CPUType::X64:529    switch (EncodedReg) {530    case EncodedFramePtrReg::None:     return RegisterId::NONE;531    case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;532    case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;533    case EncodedFramePtrReg::BasePtr:  return RegisterId::R13;534    }535    llvm_unreachable("bad encoding");536  }537  return RegisterId::NONE;538}539 540EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {541  switch (CPU) {542  // FIXME: Add ARM and AArch64 variants here.543  default:544    break;545  case CPUType::Intel8080:546  case CPUType::Intel8086:547  case CPUType::Intel80286:548  case CPUType::Intel80386:549  case CPUType::Intel80486:550  case CPUType::Pentium:551  case CPUType::PentiumPro:552  case CPUType::Pentium3:553    switch (Reg) {554    case RegisterId::VFRAME:555      return EncodedFramePtrReg::StackPtr;556    case RegisterId::EBP:557      return EncodedFramePtrReg::FramePtr;558    case RegisterId::EBX:559      return EncodedFramePtrReg::BasePtr;560    default:561      break;562    }563    break;564  case CPUType::X64:565    switch (Reg) {566    case RegisterId::RSP:567      return EncodedFramePtrReg::StackPtr;568    case RegisterId::RBP:569      return EncodedFramePtrReg::FramePtr;570    case RegisterId::R13:571      return EncodedFramePtrReg::BasePtr;572    default:573      break;574    }575    break;576  }577  return EncodedFramePtrReg::None;578}579