LCOV - code coverage report
Current view: top level - lib/DebugInfo/CodeView - SymbolRecordMapping.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 182 259 70.3 %
Date: 2017-09-14 15:23:50 Functions: 30 42 71.4 %
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           3 :   Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
      22           9 :     error(IO.mapInteger(Gap.GapStartOffset));
      23           9 :     error(IO.mapInteger(Gap.Range));
      24           9 :     return Error::success();
      25             :   }
      26             : };
      27             : }
      28             : 
      29         116 : static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
      30             :                                        LocalVariableAddrRange &Range) {
      31         348 :   error(IO.mapInteger(Range.OffsetStart));
      32         348 :   error(IO.mapInteger(Range.ISectStart));
      33         348 :   error(IO.mapInteger(Range.Range));
      34         348 :   return Error::success();
      35             : }
      36             : 
      37        1998 : Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
      38        9990 :   error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
      39        5994 :   return Error::success();
      40             : }
      41             : 
      42        1998 : Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
      43        7992 :   error(IO.padToAlignment(alignOf(Container)));
      44        5994 :   error(IO.endRecord());
      45        5994 :   return Error::success();
      46             : }
      47             : 
      48           8 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
      49             : 
      50          24 :   error(IO.mapInteger(Block.Parent));
      51          24 :   error(IO.mapInteger(Block.End));
      52          24 :   error(IO.mapInteger(Block.CodeSize));
      53          24 :   error(IO.mapInteger(Block.CodeOffset));
      54          24 :   error(IO.mapInteger(Block.Segment));
      55          24 :   error(IO.mapStringZ(Block.Name));
      56             : 
      57          24 :   return Error::success();
      58             : }
      59             : 
      60           0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
      61             : 
      62           0 :   error(IO.mapInteger(Thunk.Parent));
      63           0 :   error(IO.mapInteger(Thunk.End));
      64           0 :   error(IO.mapInteger(Thunk.Next));
      65           0 :   error(IO.mapInteger(Thunk.Offset));
      66           0 :   error(IO.mapInteger(Thunk.Segment));
      67           0 :   error(IO.mapInteger(Thunk.Length));
      68           0 :   error(IO.mapEnum(Thunk.Thunk));
      69           0 :   error(IO.mapStringZ(Thunk.Name));
      70           0 :   error(IO.mapByteVectorTail(Thunk.VariantData));
      71             : 
      72           0 :   return Error::success();
      73             : }
      74             : 
      75           6 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
      76             :                                             TrampolineSym &Tramp) {
      77             : 
      78          18 :   error(IO.mapEnum(Tramp.Type));
      79          18 :   error(IO.mapInteger(Tramp.Size));
      80          18 :   error(IO.mapInteger(Tramp.ThunkOffset));
      81          18 :   error(IO.mapInteger(Tramp.TargetOffset));
      82          18 :   error(IO.mapInteger(Tramp.ThunkSection));
      83          18 :   error(IO.mapInteger(Tramp.TargetSection));
      84             : 
      85          18 :   return Error::success();
      86             : }
      87             : 
      88         194 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
      89             :                                             SectionSym &Section) {
      90         194 :   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         582 :   return Error::success();
     101             : }
     102             : 
     103          30 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     104             :                                             CoffGroupSym &CoffGroup) {
     105             : 
     106          90 :   error(IO.mapInteger(CoffGroup.Size));
     107          90 :   error(IO.mapInteger(CoffGroup.Characteristics));
     108          90 :   error(IO.mapInteger(CoffGroup.Offset));
     109          90 :   error(IO.mapInteger(CoffGroup.Segment));
     110          90 :   error(IO.mapStringZ(CoffGroup.Name));
     111             : 
     112          90 :   return Error::success();
     113             : }
     114             : 
     115           9 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     116             :                                             BPRelativeSym &BPRel) {
     117             : 
     118          27 :   error(IO.mapInteger(BPRel.Offset));
     119          27 :   error(IO.mapInteger(BPRel.Type));
     120          27 :   error(IO.mapStringZ(BPRel.Name));
     121             : 
     122          27 :   return Error::success();
     123             : }
     124             : 
     125          53 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     126             :                                             BuildInfoSym &BuildInfo) {
     127             : 
     128         159 :   error(IO.mapInteger(BuildInfo.BuildId));
     129             : 
     130         159 :   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           0 :   return Error::success();
     143             : }
     144             : 
     145          58 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     146             :                                             EnvBlockSym &EnvBlock) {
     147             : 
     148          58 :   uint8_t Reserved = 0;
     149         174 :   error(IO.mapInteger(Reserved));
     150         174 :   error(IO.mapStringZVectorZ(EnvBlock.Fields));
     151             : 
     152         174 :   return Error::success();
     153             : }
     154             : 
     155           0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     156             :                                             FileStaticSym &FileStatic) {
     157             : 
     158           0 :   error(IO.mapInteger(FileStatic.Index));
     159           0 :   error(IO.mapInteger(FileStatic.ModFilenameOffset));
     160           0 :   error(IO.mapEnum(FileStatic.Flags));
     161           0 :   error(IO.mapStringZ(FileStatic.Name));
     162             : 
     163           0 :   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           0 :   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           0 :   return Error::success();
     190             : }
     191             : 
     192         170 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     193             :                                             Compile3Sym &Compile3) {
     194             : 
     195         510 :   error(IO.mapEnum(Compile3.Flags));
     196         510 :   error(IO.mapEnum(Compile3.Machine));
     197         510 :   error(IO.mapInteger(Compile3.VersionFrontendMajor));
     198         510 :   error(IO.mapInteger(Compile3.VersionFrontendMinor));
     199         510 :   error(IO.mapInteger(Compile3.VersionFrontendBuild));
     200         510 :   error(IO.mapInteger(Compile3.VersionFrontendQFE));
     201         510 :   error(IO.mapInteger(Compile3.VersionBackendMajor));
     202         510 :   error(IO.mapInteger(Compile3.VersionBackendMinor));
     203         510 :   error(IO.mapInteger(Compile3.VersionBackendBuild));
     204         510 :   error(IO.mapInteger(Compile3.VersionBackendQFE));
     205         510 :   error(IO.mapStringZ(Compile3.Version));
     206             : 
     207         510 :   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           0 :   return Error::success();
     218             : }
     219             : 
     220          73 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
     221             : 
     222         219 :   error(IO.mapInteger(Data.Type));
     223         219 :   error(IO.mapInteger(Data.DataOffset));
     224         146 :   error(IO.mapInteger(Data.Segment));
     225         219 :   error(IO.mapStringZ(Data.Name));
     226             : 
     227         219 :   return Error::success();
     228             : }
     229             : 
     230           1 : Error SymbolRecordMapping::visitKnownRecord(
     231             :     CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
     232             : 
     233           3 :   error(IO.mapInteger(DefRangeFramePointerRel.Offset));
     234           3 :   error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
     235           3 :   error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
     236             : 
     237           3 :   return Error::success();
     238             : }
     239             : 
     240           0 : Error SymbolRecordMapping::visitKnownRecord(
     241             :     CVSymbol &CVR,
     242             :     DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
     243             : 
     244           0 :   error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
     245             : 
     246           0 :   return Error::success();
     247             : }
     248             : 
     249          95 : Error SymbolRecordMapping::visitKnownRecord(
     250             :     CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
     251             : 
     252         285 :   error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
     253         285 :   error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
     254         285 :   error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
     255         285 :   error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
     256         285 :   error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
     257             : 
     258         285 :   return Error::success();
     259             : }
     260             : 
     261          15 : Error SymbolRecordMapping::visitKnownRecord(
     262             :     CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
     263             : 
     264          45 :   error(IO.mapObject(DefRangeRegister.Hdr.Register));
     265          45 :   error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
     266          45 :   error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
     267          45 :   error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
     268             : 
     269          45 :   return Error::success();
     270             : }
     271             : 
     272           5 : Error SymbolRecordMapping::visitKnownRecord(
     273             :     CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
     274             : 
     275          15 :   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
     276          15 :   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
     277          15 :   error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
     278          15 :   error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
     279          15 :   error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
     280             : 
     281          15 :   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           0 :   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           0 :   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           0 :   return Error::success();
     314             : }
     315             : 
     316          82 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     317             :                                             FrameProcSym &FrameProc) {
     318         246 :   error(IO.mapInteger(FrameProc.TotalFrameBytes));
     319         246 :   error(IO.mapInteger(FrameProc.PaddingFrameBytes));
     320         246 :   error(IO.mapInteger(FrameProc.OffsetToPadding));
     321         246 :   error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
     322         246 :   error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
     323         246 :   error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
     324         246 :   error(IO.mapEnum(FrameProc.Flags));
     325             : 
     326         246 :   return Error::success();
     327             : }
     328             : 
     329           0 : Error SymbolRecordMapping::visitKnownRecord(
     330             :     CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
     331             : 
     332           0 :   error(IO.mapInteger(HeapAllocSite.CodeOffset));
     333           0 :   error(IO.mapInteger(HeapAllocSite.Segment));
     334           0 :   error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
     335           0 :   error(IO.mapInteger(HeapAllocSite.Type));
     336             : 
     337           0 :   return Error::success();
     338             : }
     339             : 
     340          26 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     341             :                                             InlineSiteSym &InlineSite) {
     342             : 
     343          78 :   error(IO.mapInteger(InlineSite.Parent));
     344          78 :   error(IO.mapInteger(InlineSite.End));
     345          78 :   error(IO.mapInteger(InlineSite.Inlinee));
     346          78 :   error(IO.mapByteVectorTail(InlineSite.AnnotationData));
     347             : 
     348          78 :   return Error::success();
     349             : }
     350             : 
     351           0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     352             :                                             RegisterSym &Register) {
     353             : 
     354           0 :   error(IO.mapInteger(Register.Index));
     355           0 :   error(IO.mapEnum(Register.Register));
     356           0 :   error(IO.mapStringZ(Register.Name));
     357             : 
     358           0 :   return Error::success();
     359             : }
     360             : 
     361         187 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     362             :                                             PublicSym32 &Public) {
     363             : 
     364         561 :   error(IO.mapEnum(Public.Flags));
     365         561 :   error(IO.mapInteger(Public.Offset));
     366         561 :   error(IO.mapInteger(Public.Segment));
     367         561 :   error(IO.mapStringZ(Public.Name));
     368             : 
     369         561 :   return Error::success();
     370             : }
     371             : 
     372          48 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     373             :                                             ProcRefSym &ProcRef) {
     374             : 
     375         144 :   error(IO.mapInteger(ProcRef.SumName));
     376         144 :   error(IO.mapInteger(ProcRef.SymOffset));
     377         144 :   error(IO.mapInteger(ProcRef.Module));
     378         144 :   error(IO.mapStringZ(ProcRef.Name));
     379             : 
     380         144 :   return Error::success();
     381             : }
     382             : 
     383           1 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
     384             : 
     385           3 :   error(IO.mapInteger(Label.CodeOffset));
     386           3 :   error(IO.mapInteger(Label.Segment));
     387           3 :   error(IO.mapEnum(Label.Flags));
     388           3 :   error(IO.mapStringZ(Label.Name));
     389             : 
     390           3 :   return Error::success();
     391             : }
     392             : 
     393         108 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
     394         324 :   error(IO.mapInteger(Local.Type));
     395         324 :   error(IO.mapEnum(Local.Flags));
     396         324 :   error(IO.mapStringZ(Local.Name));
     397             : 
     398         324 :   return Error::success();
     399             : }
     400             : 
     401         116 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     402             :                                             ObjNameSym &ObjName) {
     403             : 
     404         348 :   error(IO.mapInteger(ObjName.Signature));
     405         348 :   error(IO.mapStringZ(ObjName.Name));
     406             : 
     407         348 :   return Error::success();
     408             : }
     409             : 
     410         183 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
     411         549 :   error(IO.mapInteger(Proc.Parent));
     412         549 :   error(IO.mapInteger(Proc.End));
     413         549 :   error(IO.mapInteger(Proc.Next));
     414         549 :   error(IO.mapInteger(Proc.CodeSize));
     415         549 :   error(IO.mapInteger(Proc.DbgStart));
     416         549 :   error(IO.mapInteger(Proc.DbgEnd));
     417         549 :   error(IO.mapInteger(Proc.FunctionType));
     418         549 :   error(IO.mapInteger(Proc.CodeOffset));
     419         549 :   error(IO.mapInteger(Proc.Segment));
     420         549 :   error(IO.mapEnum(Proc.Flags));
     421         549 :   error(IO.mapStringZ(Proc.Name));
     422         549 :   return Error::success();
     423             : }
     424             : 
     425         215 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     426             :                                             ScopeEndSym &ScopeEnd) {
     427         645 :   return Error::success();
     428             : }
     429             : 
     430           2 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
     431          12 :   error(IO.mapVectorN<uint32_t>(
     432             :       Caller.Indices,
     433             :       [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
     434           6 :   return Error::success();
     435             : }
     436             : 
     437          23 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     438             :                                             RegRelativeSym &RegRel) {
     439             : 
     440          69 :   error(IO.mapInteger(RegRel.Offset));
     441          69 :   error(IO.mapInteger(RegRel.Type));
     442          69 :   error(IO.mapEnum(RegRel.Register));
     443          69 :   error(IO.mapStringZ(RegRel.Name));
     444             : 
     445          69 :   return Error::success();
     446             : }
     447             : 
     448           2 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
     449             :                                             ThreadLocalDataSym &Data) {
     450             : 
     451           6 :   error(IO.mapInteger(Data.Type));
     452           6 :   error(IO.mapInteger(Data.DataOffset));
     453           6 :   error(IO.mapInteger(Data.Segment));
     454           6 :   error(IO.mapStringZ(Data.Name));
     455             : 
     456           6 :   return Error::success();
     457             : }
     458             : 
     459         288 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
     460             : 
     461         864 :   error(IO.mapInteger(UDT.Type));
     462         864 :   error(IO.mapStringZ(UDT.Name));
     463             : 
     464         864 :   return Error::success();
     465             : }

Generated by: LCOV version 1.13