Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:43:39

0001 //===- Line.h ---------------------------------------------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 } // namespace codeview
0129 } // namespace llvm
0130 
0131 #endif