Yi Kong | 8328301 | 2023-12-13 12:57:00 +0900 | [diff] [blame^] | 1 | //===-- Declaration.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 LLDB_SYMBOL_DECLARATION_H |
| 10 | #define LLDB_SYMBOL_DECLARATION_H |
| 11 | |
| 12 | #include "lldb/Utility/FileSpec.h" |
| 13 | #include "lldb/lldb-private.h" |
| 14 | |
| 15 | namespace lldb_private { |
| 16 | |
| 17 | /// \class Declaration Declaration.h "lldb/Core/Declaration.h" |
| 18 | /// A class that describes the declaration location of a |
| 19 | /// lldb object. |
| 20 | /// |
| 21 | /// The declarations include the file specification, line number, and the |
| 22 | /// column info and can help track where functions, blocks, inlined functions, |
| 23 | /// types, variables, any many other debug core objects were declared. |
| 24 | class Declaration { |
| 25 | public: |
| 26 | /// Default constructor. |
| 27 | Declaration() = default; |
| 28 | |
| 29 | /// Construct with file specification, and optional line and column. |
| 30 | /// |
| 31 | /// \param[in] file_spec |
| 32 | /// The file specification that describes where this was |
| 33 | /// declared. |
| 34 | /// |
| 35 | /// \param[in] line |
| 36 | /// The line number that describes where this was declared. Set |
| 37 | /// to zero if there is no line number information. |
| 38 | /// |
| 39 | /// \param[in] column |
| 40 | /// The column number that describes where this was declared. |
| 41 | /// Set to zero if there is no column number information. |
| 42 | Declaration(const FileSpec &file_spec, uint32_t line = 0, |
| 43 | uint16_t column = LLDB_INVALID_COLUMN_NUMBER) |
| 44 | : m_file(file_spec), m_line(line), m_column(column) {} |
| 45 | |
| 46 | /// Construct with a pointer to another Declaration object. |
| 47 | Declaration(const Declaration *decl_ptr) |
| 48 | : m_line(0), m_column(LLDB_INVALID_COLUMN_NUMBER) { |
| 49 | if (decl_ptr) |
| 50 | *this = *decl_ptr; |
| 51 | } |
| 52 | |
| 53 | /// Clear the object's state. |
| 54 | /// |
| 55 | /// Sets the file specification to be empty, and the line and column to |
| 56 | /// zero. |
| 57 | void Clear() { |
| 58 | m_file.Clear(); |
| 59 | m_line = 0; |
| 60 | m_column = 0; |
| 61 | } |
| 62 | |
| 63 | /// Compare two declaration objects. |
| 64 | /// |
| 65 | /// Compares the two file specifications from \a lhs and \a rhs. If the file |
| 66 | /// specifications are equal, then continue to compare the line number and |
| 67 | /// column numbers respectively. |
| 68 | /// |
| 69 | /// \param[in] lhs |
| 70 | /// The Left Hand Side const Declaration object reference. |
| 71 | /// |
| 72 | /// \param[in] rhs |
| 73 | /// The Right Hand Side const Declaration object reference. |
| 74 | /// |
| 75 | /// \return |
| 76 | /// -1 if lhs < rhs |
| 77 | /// 0 if lhs == rhs |
| 78 | /// 1 if lhs > rhs |
| 79 | static int Compare(const Declaration &lhs, const Declaration &rhs); |
| 80 | |
| 81 | /// Checks if this object has the same file and line as another declaration |
| 82 | /// object. |
| 83 | /// |
| 84 | /// \param[in] declaration |
| 85 | /// The const Declaration object to compare with. |
| 86 | /// |
| 87 | /// \return |
| 88 | /// Returns \b true if \b declaration is at the same file and |
| 89 | /// line, \b false otherwise. |
| 90 | bool FileAndLineEqual(const Declaration &declaration) const; |
| 91 | |
| 92 | /// Dump a description of this object to a Stream. |
| 93 | /// |
| 94 | /// Dump a description of the contents of this object to the supplied stream |
| 95 | /// \a s. |
| 96 | /// |
| 97 | /// \param[in] s |
| 98 | /// The stream to which to dump the object description. |
| 99 | void Dump(Stream *s, bool show_fullpaths) const; |
| 100 | |
| 101 | bool DumpStopContext(Stream *s, bool show_fullpaths) const; |
| 102 | |
| 103 | /// Get accessor for file specification. |
| 104 | /// |
| 105 | /// \return |
| 106 | /// A reference to the file specification object. |
| 107 | FileSpec &GetFile() { return m_file; } |
| 108 | |
| 109 | /// Get const accessor for file specification. |
| 110 | /// |
| 111 | /// \return |
| 112 | /// A const reference to the file specification object. |
| 113 | const FileSpec &GetFile() const { return m_file; } |
| 114 | |
| 115 | /// Get accessor for the declaration line number. |
| 116 | /// |
| 117 | /// \return |
| 118 | /// Non-zero indicates a valid line number, zero indicates no |
| 119 | /// line information is available. |
| 120 | uint32_t GetLine() const { return m_line; } |
| 121 | |
| 122 | /// Get accessor for the declaration column number. |
| 123 | /// |
| 124 | /// \return |
| 125 | /// Non-zero indicates a valid column number, zero indicates no |
| 126 | /// column information is available. |
| 127 | uint16_t GetColumn() const { return m_column; } |
| 128 | |
| 129 | /// Convert to boolean operator. |
| 130 | /// |
| 131 | /// This allows code to check a Declaration object to see if it |
| 132 | /// contains anything valid using code such as: |
| 133 | /// |
| 134 | /// \code |
| 135 | /// Declaration decl(...); |
| 136 | /// if (decl) |
| 137 | /// { ... |
| 138 | /// \endcode |
| 139 | /// |
| 140 | /// \return |
| 141 | /// A \b true if both the file_spec and the line are valid, |
| 142 | /// \b false otherwise. |
| 143 | explicit operator bool() const { return IsValid(); } |
| 144 | |
| 145 | bool IsValid() const { |
| 146 | return m_file && m_line != 0 && m_line != LLDB_INVALID_LINE_NUMBER; |
| 147 | } |
| 148 | |
| 149 | /// Get the memory cost of this object. |
| 150 | /// |
| 151 | /// \return |
| 152 | /// The number of bytes that this object occupies in memory. |
| 153 | /// The returned value does not include the bytes for any |
| 154 | /// shared string values. |
| 155 | size_t MemorySize() const; |
| 156 | |
| 157 | /// Set accessor for the declaration file specification. |
| 158 | /// |
| 159 | /// \param[in] file_spec |
| 160 | /// The new declaration file specification. |
| 161 | void SetFile(const FileSpec &file_spec) { m_file = file_spec; } |
| 162 | |
| 163 | /// Set accessor for the declaration line number. |
| 164 | /// |
| 165 | /// \param[in] line |
| 166 | /// Non-zero indicates a valid line number, zero indicates no |
| 167 | /// line information is available. |
| 168 | void SetLine(uint32_t line) { m_line = line; } |
| 169 | |
| 170 | /// Set accessor for the declaration column number. |
| 171 | /// |
| 172 | /// \param[in] column |
| 173 | /// Non-zero indicates a valid column number, zero indicates no |
| 174 | /// column information is available. |
| 175 | void SetColumn(uint16_t column) { m_column = column; } |
| 176 | |
| 177 | protected: |
| 178 | /// The file specification that points to the source file where the |
| 179 | /// declaration occurred. |
| 180 | FileSpec m_file; |
| 181 | /// Non-zero values indicates a valid line number, zero indicates no line |
| 182 | /// number information is available. |
| 183 | uint32_t m_line = 0; |
| 184 | /// Non-zero values indicates a valid column number, zero indicates no column |
| 185 | /// information is available. |
| 186 | uint16_t m_column = LLDB_INVALID_COLUMN_NUMBER; |
| 187 | }; |
| 188 | |
| 189 | bool operator==(const Declaration &lhs, const Declaration &rhs); |
| 190 | |
| 191 | } // namespace lldb_private |
| 192 | |
| 193 | #endif // LLDB_SYMBOL_DECLARATION_H |