• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- ModuleSubstream.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_MODULESUBSTREAM_H
11 #define LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAM_H
12 
13 #include "llvm/DebugInfo/CodeView/CodeView.h"
14 #include "llvm/DebugInfo/CodeView/StreamArray.h"
15 #include "llvm/DebugInfo/CodeView/StreamRef.h"
16 #include "llvm/Support/Endian.h"
17 #include "llvm/Support/Error.h"
18 
19 namespace llvm {
20 namespace codeview {
21 
22 // Corresponds to the `CV_DebugSSubsectionHeader_t` structure.
23 struct ModuleSubsectionHeader {
24   support::ulittle32_t Kind;   // codeview::ModuleSubstreamKind enum
25   support::ulittle32_t Length; // number of bytes occupied by this record.
26 };
27 
28 // Corresponds to the `CV_DebugSLinesHeader_t` structure.
29 struct LineSubstreamHeader {
30   support::ulittle32_t RelocOffset;  // Code offset of line contribution.
31   support::ulittle16_t RelocSegment; // Code segment of line contribution.
32   support::ulittle16_t Flags;        // See LineFlags enumeration.
33   support::ulittle32_t CodeSize;     // Code size of this line contribution.
34 };
35 
36 // Corresponds to the `CV_DebugSLinesFileBlockHeader_t` structure.
37 struct LineFileBlockHeader {
38   support::ulittle32_t NameIndex; // Index in DBI name buffer of filename.
39   support::ulittle32_t NumLines;  // Number of lines
40   support::ulittle32_t BlockSize; // Code size of block, in bytes.
41   // The following two variable length arrays appear immediately after the
42   // header.  The structure definitions follow.
43   // LineNumberEntry   Lines[NumLines];
44   // ColumnNumberEntry Columns[NumLines];
45 };
46 
47 // Corresponds to `CV_Line_t` structure
48 struct LineNumberEntry {
49   support::ulittle32_t Offset; // Offset to start of code bytes for line number
50   support::ulittle32_t Flags;  // Start:24, End:7, IsStatement:1
51 };
52 
53 // Corresponds to `CV_Column_t` structure
54 struct ColumnNumberEntry {
55   support::ulittle16_t StartColumn;
56   support::ulittle16_t EndColumn;
57 };
58 
59 class ModuleSubstream {
60 public:
61   ModuleSubstream();
62   ModuleSubstream(ModuleSubstreamKind Kind, StreamRef Data);
63   static Error initialize(StreamRef Stream, ModuleSubstream &Info);
64   uint32_t getRecordLength() const;
65   ModuleSubstreamKind getSubstreamKind() const;
66   StreamRef getRecordData() const;
67 
68 private:
69   ModuleSubstreamKind Kind;
70   StreamRef Data;
71 };
72 
73 template <> struct VarStreamArrayExtractor<ModuleSubstream> {
74   Error operator()(StreamRef Stream, uint32_t &Length,
75                    ModuleSubstream &Info) const {
76     if (auto EC = ModuleSubstream::initialize(Stream, Info))
77       return EC;
78     Length = Info.getRecordLength();
79     return Error::success();
80   }
81 };
82 
83 typedef VarStreamArray<ModuleSubstream> ModuleSubstreamArray;
84 }
85 }
86 
87 #endif // LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAM_H
88