1 | //===-- LineEntry.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_LINEENTRY_H |
10 | #define LLDB_SYMBOL_LINEENTRY_H |
11 | |
12 | #include "lldb/Core/AddressRange.h" |
13 | #include "lldb/Utility/FileSpec.h" |
14 | #include "lldb/Utility/SupportFile.h" |
15 | #include "lldb/lldb-private.h" |
16 | |
17 | namespace lldb_private { |
18 | |
19 | /// \class LineEntry LineEntry.h "lldb/Symbol/LineEntry.h" |
20 | /// A line table entry class. |
21 | struct LineEntry { |
22 | /// Default constructor. |
23 | /// |
24 | /// Initialize all member variables to invalid values. |
25 | LineEntry(); |
26 | |
27 | /// Clear the object's state. |
28 | /// |
29 | /// Clears all member variables to invalid values. |
30 | void Clear(); |
31 | |
32 | /// Dump a description of this object to a Stream. |
33 | /// |
34 | /// Dump a description of the contents of this object to the supplied stream |
35 | /// \a s. |
36 | /// |
37 | /// \param[in] s |
38 | /// The stream to which to dump the object description. |
39 | /// |
40 | /// \param[in] show_file |
41 | /// If \b true, display the filename with the line entry which |
42 | /// requires that the compile unit object \a comp_unit be a |
43 | /// valid pointer. |
44 | /// |
45 | /// \param[in] style |
46 | /// The display style for the section offset address. |
47 | /// |
48 | /// \return |
49 | /// Returns \b true if the address was able to be displayed |
50 | /// using \a style. File and load addresses may be unresolved |
51 | /// and it may not be possible to display a valid address value. |
52 | /// Returns \b false if the address was not able to be properly |
53 | /// dumped. |
54 | /// |
55 | /// \see Address::DumpStyle |
56 | bool Dump(Stream *s, Target *target, bool show_file, Address::DumpStyle style, |
57 | Address::DumpStyle fallback_style, bool show_range) const; |
58 | |
59 | bool GetDescription(Stream *s, lldb::DescriptionLevel level, CompileUnit *cu, |
60 | Target *target, bool show_address_only) const; |
61 | |
62 | /// Dumps information specific to a process that stops at this line entry to |
63 | /// the supplied stream \a s. |
64 | /// |
65 | /// \param[in] s |
66 | /// The stream to which to dump the object description. |
67 | /// |
68 | /// \return |
69 | /// Returns \b true if the file and line were properly dumped, |
70 | /// \b false otherwise. |
71 | bool DumpStopContext(Stream *s, bool show_fullpaths) const; |
72 | |
73 | /// Check if a line entry object is valid. |
74 | /// |
75 | /// \return |
76 | /// Returns \b true if the line entry contains a valid section |
77 | /// offset address, file index, and line number, \b false |
78 | /// otherwise. |
79 | bool IsValid() const; |
80 | |
81 | /// Compare two LineEntry objects. |
82 | /// |
83 | /// \param[in] lhs |
84 | /// The Left Hand Side const LineEntry object reference. |
85 | /// |
86 | /// \param[in] rhs |
87 | /// The Right Hand Side const LineEntry object reference. |
88 | /// |
89 | /// \return |
90 | /// -1 if lhs < rhs |
91 | /// 0 if lhs == rhs |
92 | /// 1 if lhs > rhs |
93 | static int Compare(const LineEntry &lhs, const LineEntry &rhs); |
94 | |
95 | /// Give the range for this LineEntry + any additional LineEntries for this |
96 | /// same source line that are contiguous. |
97 | /// |
98 | /// A compiler may emit multiple line entries for a single source line, |
99 | /// e.g. to indicate subexpressions at different columns. This method will |
100 | /// get the AddressRange for all of the LineEntries for this source line |
101 | /// that are contiguous. |
102 | // |
103 | /// Line entries with a line number of 0 are treated specially - these are |
104 | /// compiler-generated line table entries that the user did not write in |
105 | /// their source code, and we want to skip past in the debugger. If this |
106 | /// LineEntry is for line 32, and the following LineEntry is for line 0, we |
107 | /// will extend the range to include the AddressRange of the line 0 |
108 | /// LineEntry (and it will include the range of the following LineEntries |
109 | /// that match either 32 or 0.) |
110 | /// |
111 | /// When \b include_inlined_functions is \b true inlined functions with |
112 | /// a call site at this LineEntry will also be included in the complete |
113 | /// range. |
114 | /// |
115 | /// If the initial LineEntry this method is called on is a line #0, only the |
116 | /// range of continuous LineEntries with line #0 will be included in the |
117 | /// complete range. |
118 | /// |
119 | /// @param[in] include_inlined_functions |
120 | /// Whether to include inlined functions at the same line or not. |
121 | /// |
122 | /// \return |
123 | /// The contiguous AddressRange for this source line. |
124 | AddressRange |
125 | GetSameLineContiguousAddressRange(bool include_inlined_functions) const; |
126 | |
127 | /// Apply file mappings from target.source-map to the LineEntry's file. |
128 | /// |
129 | /// \param[in] target_sp |
130 | /// Shared pointer to the target this LineEntry belongs to. |
131 | void ApplyFileMappings(lldb::TargetSP target_sp); |
132 | |
133 | // Member variables. |
134 | AddressRange range; ///< The section offset address range for this line entry. |
135 | FileSpec file; ///< The source file, possibly mapped by the target.source-map |
136 | ///setting |
137 | lldb::SupportFileSP |
138 | original_file_sp; ///< The original source file, from debug info. |
139 | uint32_t line = LLDB_INVALID_LINE_NUMBER; ///< The source line number, or zero |
140 | ///< if there is no line number |
141 | /// information. |
142 | uint16_t column = |
143 | 0; ///< The column number of the source line, or zero if there |
144 | /// is no column information. |
145 | uint16_t is_start_of_statement : 1, ///< Indicates this entry is the beginning |
146 | ///of a statement. |
147 | is_start_of_basic_block : 1, ///< Indicates this entry is the beginning of |
148 | ///a basic block. |
149 | is_prologue_end : 1, ///< Indicates this entry is one (of possibly many) |
150 | ///where execution should be suspended for an entry |
151 | ///breakpoint of a function. |
152 | is_epilogue_begin : 1, ///< Indicates this entry is one (of possibly many) |
153 | ///where execution should be suspended for an exit |
154 | ///breakpoint of a function. |
155 | is_terminal_entry : 1; ///< Indicates this entry is that of the first byte |
156 | ///after the end of a sequence of target machine |
157 | ///instructions. |
158 | }; |
159 | |
160 | /// Less than operator. |
161 | /// |
162 | /// \param[in] lhs |
163 | /// The Left Hand Side const LineEntry object reference. |
164 | /// |
165 | /// \param[in] rhs |
166 | /// The Right Hand Side const LineEntry object reference. |
167 | /// |
168 | /// \return |
169 | /// Returns \b true if lhs < rhs, false otherwise. |
170 | bool operator<(const LineEntry &lhs, const LineEntry &rhs); |
171 | |
172 | } // namespace lldb_private |
173 | |
174 | #endif // LLDB_SYMBOL_LINEENTRY_H |
175 | |