LLVM  9.0.0svn
DebugLinesSubsection.h
Go to the documentation of this file.
1 //===- DebugLinesSubsection.h -----------------------------------*- 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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGLINESSUBSECTION_H
10 #define LLVM_DEBUGINFO_CODEVIEW_DEBUGLINESSUBSECTION_H
11 
12 #include "llvm/ADT/StringRef.h"
19 #include "llvm/Support/Endian.h"
20 #include "llvm/Support/Error.h"
21 #include <cstdint>
22 #include <vector>
23 
24 namespace llvm {
25 namespace codeview {
26 
27 class DebugChecksumsSubsection;
28 class DebugStringTableSubsection;
29 
30 // Corresponds to the `CV_DebugSLinesHeader_t` structure.
32  support::ulittle32_t RelocOffset; // Code offset of line contribution.
33  support::ulittle16_t RelocSegment; // Code segment of line contribution.
34  support::ulittle16_t Flags; // See LineFlags enumeration.
35  support::ulittle32_t CodeSize; // Code size of this line contribution.
36 };
37 
38 // Corresponds to the `CV_DebugSLinesFileBlockHeader_t` structure.
40  support::ulittle32_t NameIndex; // Offset of FileChecksum entry in File
41  // checksums buffer. The checksum entry then
42  // contains another offset into the string
43  // table of the actual name.
44  support::ulittle32_t NumLines; // Number of lines
45  support::ulittle32_t BlockSize; // Code size of block, in bytes.
46  // The following two variable length arrays appear immediately after the
47  // header. The structure definitions follow.
48  // LineNumberEntry Lines[NumLines];
49  // ColumnNumberEntry Columns[NumLines];
50 };
51 
52 // Corresponds to `CV_Line_t` structure
54  support::ulittle32_t Offset; // Offset to start of code bytes for line number
55  support::ulittle32_t Flags; // Start:24, End:7, IsStatement:1
56 };
57 
58 // Corresponds to `CV_Column_t` structure
62 };
63 
68 };
69 
71 public:
72  Error operator()(BinaryStreamRef Stream, uint32_t &Len,
73  LineColumnEntry &Item);
74 
75  const LineFragmentHeader *Header = nullptr;
76 };
77 
79  friend class LineColumnExtractor;
80 
83 
84 public:
86 
87  static bool classof(const DebugSubsectionRef *S) {
88  return S->kind() == DebugSubsectionKind::Lines;
89  }
90 
92 
93  Iterator begin() const { return LinesAndColumns.begin(); }
94  Iterator end() const { return LinesAndColumns.end(); }
95 
96  const LineFragmentHeader *header() const { return Header; }
97 
98  bool hasColumnInfo() const;
99 
100 private:
101  const LineFragmentHeader *Header = nullptr;
102  LineInfoArray LinesAndColumns;
103 };
104 
105 class DebugLinesSubsection final : public DebugSubsection {
106  struct Block {
107  Block(uint32_t ChecksumBufferOffset)
108  : ChecksumBufferOffset(ChecksumBufferOffset) {}
109 
110  uint32_t ChecksumBufferOffset;
111  std::vector<LineNumberEntry> Lines;
112  std::vector<ColumnNumberEntry> Columns;
113  };
114 
115 public:
117  DebugStringTableSubsection &Strings);
118 
119  static bool classof(const DebugSubsection *S) {
120  return S->kind() == DebugSubsectionKind::Lines;
121  }
122 
123  void createBlock(StringRef FileName);
124  void addLineInfo(uint32_t Offset, const LineInfo &Line);
125  void addLineAndColumnInfo(uint32_t Offset, const LineInfo &Line,
126  uint32_t ColStart, uint32_t ColEnd);
127 
128  uint32_t calculateSerializedSize() const override;
129  Error commit(BinaryStreamWriter &Writer) const override;
130 
131  void setRelocationAddress(uint16_t Segment, uint32_t Offset);
132  void setCodeSize(uint32_t Size);
133  void setFlags(LineFlags Flags);
134 
135  bool hasColumnInfo() const;
136 
137 private:
138  DebugChecksumsSubsection &Checksums;
139  uint32_t RelocOffset = 0;
140  uint16_t RelocSegment = 0;
141  uint32_t CodeSize = 0;
142  LineFlags Flags = LF_None;
143  std::vector<Block> Blocks;
144 };
145 
146 } // end namespace codeview
147 } // end namespace llvm
148 
149 #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGLINESSUBSECTION_H
This class represents lattice values for constants.
Definition: AllocatorList.h:23
FixedStreamArray is similar to VarStreamArray, except with each record having a fixed-length.
FixedStreamArray< ColumnNumberEntry > Columns
static bool classof(const DebugSubsection *S)
Provides write only access to a subclass of WritableBinaryStream.
Represents a read-write view of a CodeView string table.
BinaryStreamRef is to BinaryStream what ArrayRef is to an Array.
VarStreamArray represents an array of variable length records backed by a stream. ...
DebugSubsectionKind kind() const
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringRef > StandardNames)
Initialize the set of available library functions based on the specified target triple.
uint32_t Size
Definition: Profile.cpp:46
static bool classof(const DebugSubsectionRef *S)
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
Provides read only access to a subclass of BinaryStream.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
const LineFragmentHeader * header() const
DebugSubsectionKind kind() const
FixedStreamArray< LineNumberEntry > LineNumbers