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) m_file(file_spec)44 : m_file(file_spec), m_line(line), m_column(column) {} 45 46 /// Construct with a pointer to another Declaration object. Declaration(const Declaration * decl_ptr)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. Clear()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. GetFile()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. GetFile()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. GetLine()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. GetColumn()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 IsValid()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. SetFile(const FileSpec & file_spec)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. SetLine(uint32_t line)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. SetColumn(uint16_t column)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 194