LLVM  4.0.0
ModuleSubstreamVisitor.h
Go to the documentation of this file.
1 //===- ModuleSubstreamVisitor.h ---------------------------------*- 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 #ifndef LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H
11 #define LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H
12 
13 #include "llvm/ADT/ArrayRef.h"
21 #include "llvm/Support/Endian.h"
22 #include "llvm/Support/Error.h"
23 #include <cstdint>
24 
25 namespace llvm {
26 
27 namespace codeview {
28 
33 };
34 
36  uint32_t FileNameOffset; // Byte offset of filename in global stringtable.
37  FileChecksumKind Kind; // The type of checksum.
38  ArrayRef<uint8_t> Checksum; // The bytes of the checksum.
39 };
40 
43 
45 public:
46  virtual ~IModuleSubstreamVisitor() = default;
47 
49  msf::ReadableStreamRef Data) = 0;
52  const LineSubstreamHeader *Header,
53  const LineInfoArray &Lines);
56  const FileChecksumArray &Checksums);
66 };
67 
70 } // end namespace codeview
71 
72 namespace msf {
73 
74 template <> class VarStreamArrayExtractor<codeview::LineColumnEntry> {
75 public:
77  : Header(Header) {}
78 
80  codeview::LineColumnEntry &Item) const {
81  using namespace codeview;
82  const LineFileBlockHeader *BlockHeader;
83  StreamReader Reader(Stream);
84  if (auto EC = Reader.readObject(BlockHeader))
85  return EC;
86  bool HasColumn = Header->Flags & LineFlags::HaveColumns;
87  uint32_t LineInfoSize =
88  BlockHeader->NumLines *
89  (sizeof(LineNumberEntry) + (HasColumn ? sizeof(ColumnNumberEntry) : 0));
90  if (BlockHeader->BlockSize < sizeof(LineFileBlockHeader))
91  return make_error<CodeViewError>(cv_error_code::corrupt_record,
92  "Invalid line block record size");
93  uint32_t Size = BlockHeader->BlockSize - sizeof(LineFileBlockHeader);
94  if (LineInfoSize > Size)
95  return make_error<CodeViewError>(cv_error_code::corrupt_record,
96  "Invalid line block record size");
97  // The value recorded in BlockHeader->BlockSize includes the size of
98  // LineFileBlockHeader.
99  Len = BlockHeader->BlockSize;
100  Item.NameIndex = BlockHeader->NameIndex;
101  if (auto EC = Reader.readArray(Item.LineNumbers, BlockHeader->NumLines))
102  return EC;
103  if (HasColumn) {
104  if (auto EC = Reader.readArray(Item.Columns, BlockHeader->NumLines))
105  return EC;
106  }
107  return Error::success();
108  }
109 
110 private:
111  const codeview::LineSubstreamHeader *Header;
112 };
113 
114 template <> class VarStreamArrayExtractor<codeview::FileChecksumEntry> {
115 public:
117  codeview::FileChecksumEntry &Item) const {
118  using namespace codeview;
119  const FileChecksum *Header;
120  StreamReader Reader(Stream);
121  if (auto EC = Reader.readObject(Header))
122  return EC;
123  Item.FileNameOffset = Header->FileNameOffset;
124  Item.Kind = static_cast<FileChecksumKind>(Header->ChecksumKind);
125  if (auto EC = Reader.readBytes(Item.Checksum, Header->ChecksumSize))
126  return EC;
127  Len = sizeof(FileChecksum) + Header->ChecksumSize;
128  return Error::success();
129  }
130 };
131 
132 } // end namespace msf
133 
134 } // end namespace llvm
135 
136 #endif // LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H
virtual Error visitFileChecksums(msf::ReadableStreamRef Data, const FileChecksumArray &Checksums)
Error operator()(ReadableStreamRef Stream, uint32_t &Len, codeview::LineColumnEntry &Item) const
msf::FixedStreamArray< ColumnNumberEntry > Columns
msf::VarStreamArray< FileChecksumEntry > FileChecksumArray
msf::VarStreamArray< LineColumnEntry > LineInfoArray
virtual Error visitMergedAssemblyInput(msf::ReadableStreamRef Data)
virtual Error visitCrossScopeImports(msf::ReadableStreamRef Data)
virtual Error visitCrossScopeExports(msf::ReadableStreamRef Data)
virtual Error visitInlineeLines(msf::ReadableStreamRef Data)
virtual Error visitSymbols(msf::ReadableStreamRef Data)
virtual Error visitStringTable(msf::ReadableStreamRef Data)
virtual Error visitUnknown(ModuleSubstreamKind Kind, msf::ReadableStreamRef Data)=0
Error readBytes(ArrayRef< uint8_t > &Buffer, uint32_t Size)
msf::FixedStreamArray< LineNumberEntry > LineNumbers
virtual Error visitTypeMDTokenMap(msf::ReadableStreamRef Data)
Error readArray(ArrayRef< T > &Array, uint32_t NumElements)
Definition: StreamReader.h:62
Error visitModuleSubstream(const ModuleSubstream &R, IModuleSubstreamVisitor &V)
Error operator()(ReadableStreamRef Stream, uint32_t &Len, codeview::FileChecksumEntry &Item) const
VarStreamArrayExtractor(const codeview::LineSubstreamHeader *Header)
virtual Error visitILLines(msf::ReadableStreamRef Data)
static ErrorSuccess success()
Create a success value.
virtual Error visitFrameData(msf::ReadableStreamRef Data)
virtual Error visitCoffSymbolRVA(msf::ReadableStreamRef Data)
VarStreamArrayExtractor is intended to be specialized to provide customized extraction logic...
Definition: StreamArray.h:35
const unsigned Kind
virtual Error visitFuncMDTokenMap(msf::ReadableStreamRef Data)
Lightweight error class with error context and mandatory checking.
virtual Error visitLines(msf::ReadableStreamRef Data, const LineSubstreamHeader *Header, const LineInfoArray &Lines)
Error readObject(const T *&Dest)
Definition: StreamReader.h:53