LCOV - code coverage report
Current view: top level - lib/DebugInfo/CodeView - SymbolRecordMapping.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 188 238 79.0 %
Date: 2018-10-20 13:21:21 Functions: 37 45 82.2 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13