File indexing completed on 2026-05-10 08:43:39
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_DEBUGINFO_CODEVIEW_LINE_H
0010 #define LLVM_DEBUGINFO_CODEVIEW_LINE_H
0011
0012 #include "llvm/Support/Endian.h"
0013 #include <cinttypes>
0014
0015 namespace llvm {
0016 namespace codeview {
0017
0018 using llvm::support::ulittle32_t;
0019
0020 class LineInfo {
0021 public:
0022 enum : uint32_t {
0023 AlwaysStepIntoLineNumber = 0xfeefee,
0024 NeverStepIntoLineNumber = 0xf00f00
0025 };
0026
0027 enum : int { EndLineDeltaShift = 24 };
0028
0029 enum : uint32_t {
0030 StartLineMask = 0x00ffffff,
0031 EndLineDeltaMask = 0x7f000000,
0032 StatementFlag = 0x80000000u
0033 };
0034
0035 LineInfo(uint32_t StartLine, uint32_t EndLine, bool IsStatement);
0036 LineInfo(uint32_t LineData) : LineData(LineData) {}
0037
0038 uint32_t getStartLine() const { return LineData & StartLineMask; }
0039
0040 uint32_t getLineDelta() const {
0041 return (LineData & EndLineDeltaMask) >> EndLineDeltaShift;
0042 }
0043
0044 uint32_t getEndLine() const { return getStartLine() + getLineDelta(); }
0045
0046 bool isStatement() const { return (LineData & StatementFlag) != 0; }
0047
0048 uint32_t getRawData() const { return LineData; }
0049
0050 bool isAlwaysStepInto() const {
0051 return getStartLine() == AlwaysStepIntoLineNumber;
0052 }
0053
0054 bool isNeverStepInto() const {
0055 return getStartLine() == NeverStepIntoLineNumber;
0056 }
0057
0058 private:
0059 uint32_t LineData;
0060 };
0061
0062 class ColumnInfo {
0063 private:
0064 static const uint32_t StartColumnMask = 0x0000ffffu;
0065 static const uint32_t EndColumnMask = 0xffff0000u;
0066 static const int EndColumnShift = 16;
0067
0068 public:
0069 ColumnInfo(uint16_t StartColumn, uint16_t EndColumn) {
0070 ColumnData =
0071 (static_cast<uint32_t>(StartColumn) & StartColumnMask) |
0072 ((static_cast<uint32_t>(EndColumn) << EndColumnShift) & EndColumnMask);
0073 }
0074
0075 uint16_t getStartColumn() const {
0076 return static_cast<uint16_t>(ColumnData & StartColumnMask);
0077 }
0078
0079 uint16_t getEndColumn() const {
0080 return static_cast<uint16_t>((ColumnData & EndColumnMask) >>
0081 EndColumnShift);
0082 }
0083
0084 uint32_t getRawData() const { return ColumnData; }
0085
0086 private:
0087 uint32_t ColumnData;
0088 };
0089
0090 class Line {
0091 private:
0092 int32_t CodeOffset;
0093 LineInfo LineInf;
0094 ColumnInfo ColumnInf;
0095
0096 public:
0097 Line(int32_t CodeOffset, uint32_t StartLine, uint32_t EndLine,
0098 uint16_t StartColumn, uint16_t EndColumn, bool IsStatement)
0099 : CodeOffset(CodeOffset), LineInf(StartLine, EndLine, IsStatement),
0100 ColumnInf(StartColumn, EndColumn) {}
0101
0102 Line(int32_t CodeOffset, LineInfo LineInf, ColumnInfo ColumnInf)
0103 : CodeOffset(CodeOffset), LineInf(LineInf), ColumnInf(ColumnInf) {}
0104
0105 LineInfo getLineInfo() const { return LineInf; }
0106
0107 ColumnInfo getColumnInfo() const { return ColumnInf; }
0108
0109 int32_t getCodeOffset() const { return CodeOffset; }
0110
0111 uint32_t getStartLine() const { return LineInf.getStartLine(); }
0112
0113 uint32_t getLineDelta() const { return LineInf.getLineDelta(); }
0114
0115 uint32_t getEndLine() const { return LineInf.getEndLine(); }
0116
0117 uint16_t getStartColumn() const { return ColumnInf.getStartColumn(); }
0118
0119 uint16_t getEndColumn() const { return ColumnInf.getEndColumn(); }
0120
0121 bool isStatement() const { return LineInf.isStatement(); }
0122
0123 bool isAlwaysStepInto() const { return LineInf.isAlwaysStepInto(); }
0124
0125 bool isNeverStepInto() const { return LineInf.isNeverStepInto(); }
0126 };
0127
0128 }
0129 }
0130
0131 #endif