1 //===- DebugLinesSubsection.h --------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGLINEFRAGMENT_H
11 #define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGLINEFRAGMENT_H
13 #include "llvm/DebugInfo/CodeView/DebugSubsection.h"
14 #include "llvm/DebugInfo/CodeView/Line.h"
15 #include "llvm/Support/BinaryStreamArray.h"
16 #include "llvm/Support/BinaryStreamReader.h"
17 #include "llvm/Support/Error.h"
22 class DebugChecksumsSubsection;
23 class DebugStringTableSubsection;
25 // Corresponds to the `CV_DebugSLinesHeader_t` structure.
26 struct LineFragmentHeader {
27 support::ulittle32_t RelocOffset; // Code offset of line contribution.
28 support::ulittle16_t RelocSegment; // Code segment of line contribution.
29 support::ulittle16_t Flags; // See LineFlags enumeration.
30 support::ulittle32_t CodeSize; // Code size of this line contribution.
33 // Corresponds to the `CV_DebugSLinesFileBlockHeader_t` structure.
34 struct LineBlockFragmentHeader {
35 support::ulittle32_t NameIndex; // Offset of FileChecksum entry in File
36 // checksums buffer. The checksum entry then
37 // contains another offset into the string
38 // table of the actual name.
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];
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
53 // Corresponds to `CV_Column_t` structure
54 struct ColumnNumberEntry {
55 support::ulittle16_t StartColumn;
56 support::ulittle16_t EndColumn;
59 struct LineColumnEntry {
60 support::ulittle32_t NameIndex;
61 FixedStreamArray<LineNumberEntry> LineNumbers;
62 FixedStreamArray<ColumnNumberEntry> Columns;
65 class LineColumnExtractor {
67 typedef const LineFragmentHeader *ContextType;
69 static Error extract(BinaryStreamRef Stream, uint32_t &Len,
70 LineColumnEntry &Item, const LineFragmentHeader *Ctx);
73 class DebugLinesSubsectionRef final : public DebugSubsectionRef {
74 friend class LineColumnExtractor;
75 typedef VarStreamArray<LineColumnEntry, LineColumnExtractor> LineInfoArray;
76 typedef LineInfoArray::Iterator Iterator;
79 DebugLinesSubsectionRef();
81 static bool classof(const DebugSubsectionRef *S) {
82 return S->kind() == DebugSubsectionKind::Lines;
85 Error initialize(BinaryStreamReader Reader);
87 Iterator begin() const { return LinesAndColumns.begin(); }
88 Iterator end() const { return LinesAndColumns.end(); }
90 const LineFragmentHeader *header() const { return Header; }
92 bool hasColumnInfo() const;
95 const LineFragmentHeader *Header = nullptr;
96 LineInfoArray LinesAndColumns;
99 class DebugLinesSubsection final : public DebugSubsection {
101 Block(uint32_t ChecksumBufferOffset)
102 : ChecksumBufferOffset(ChecksumBufferOffset) {}
104 uint32_t ChecksumBufferOffset;
105 std::vector<LineNumberEntry> Lines;
106 std::vector<ColumnNumberEntry> Columns;
110 DebugLinesSubsection(DebugChecksumsSubsection &Checksums,
111 DebugStringTableSubsection &Strings);
113 static bool classof(const DebugSubsection *S) {
114 return S->kind() == DebugSubsectionKind::Lines;
117 void createBlock(StringRef FileName);
118 void addLineInfo(uint32_t Offset, const LineInfo &Line);
119 void addLineAndColumnInfo(uint32_t Offset, const LineInfo &Line,
120 uint32_t ColStart, uint32_t ColEnd);
122 uint32_t calculateSerializedSize() const override;
123 Error commit(BinaryStreamWriter &Writer) const override;
125 void setRelocationAddress(uint16_t Segment, uint16_t Offset);
126 void setCodeSize(uint32_t Size);
127 void setFlags(LineFlags Flags);
129 bool hasColumnInfo() const;
132 DebugChecksumsSubsection &Checksums;
134 uint16_t RelocOffset = 0;
135 uint16_t RelocSegment = 0;
136 uint32_t CodeSize = 0;
137 LineFlags Flags = LF_None;
138 std::vector<Block> Blocks;