LLDB mainline
LineEntry.cpp
Go to the documentation of this file.
1//===-- LineEntry.cpp -----------------------------------------------------===//
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
11#include "lldb/Target/Process.h"
12#include "lldb/Target/Target.h"
13
14using namespace lldb_private;
15
21
23 range.Clear();
24 file_sp = std::make_shared<SupportFile>();
25 original_file_sp = std::make_shared<SupportFile>();
27 column = 0;
33}
34
35bool LineEntry::IsValid() const {
36 return (range.GetBaseAddress().IsValid() || synthetic) &&
38}
39
40bool LineEntry::DumpStopContext(Stream *s, bool show_fullpaths) const {
41 const FileSpec &file = file_sp->GetSpecOnly();
42 if (file) {
43 if (show_fullpaths)
44 file.Dump(s->AsRawOstream());
45 else
46 file.GetFilename().Dump(s);
47
48 if (line)
49 s->PutChar(':');
50 }
51 if (line) {
52 s->Printf("%u", line);
53 if (column) {
54 s->PutChar(':');
55 s->Printf("%u", column);
56 }
57 }
58 return file || line;
59}
60
61bool LineEntry::Dump(Stream *s, Target *target, bool show_file,
63 Address::DumpStyle fallback_style, bool show_range) const {
64 if (show_range) {
65 // Show address range
66 if (!range.Dump(s, target, style, fallback_style))
67 return false;
68 } else {
69 // Show address only
70 if (!range.GetBaseAddress().Dump(s, target, style, fallback_style))
71 return false;
72 }
73 if (show_file)
74 *s << ", file = " << GetFile();
75 if (line)
76 s->Printf(", line = %u", line);
77 if (column)
78 s->Printf(", column = %u", column);
80 *s << ", is_start_of_statement = TRUE";
81
83 *s << ", is_start_of_basic_block = TRUE";
84
86 *s << ", is_prologue_end = TRUE";
87
89 *s << ", is_epilogue_begin = TRUE";
90
92 *s << ", is_terminal_entry = TRUE";
93 return true;
94}
95
97 CompileUnit *cu, Target *target,
98 bool show_address_only) const {
99
100 if (level == lldb::eDescriptionLevelBrief ||
102 if (show_address_only) {
103 range.GetBaseAddress().Dump(s, target, Address::DumpStyleLoadAddress,
105 } else {
106 range.Dump(s, target, Address::DumpStyleLoadAddress,
108 }
109
110 *s << ": " << GetFile();
111
112 if (line) {
113 s->Printf(":%u", line);
114 if (column)
115 s->Printf(":%u", column);
116 }
117
118 if (level == lldb::eDescriptionLevelFull) {
120 *s << ", is_start_of_statement = TRUE";
121
123 *s << ", is_start_of_basic_block = TRUE";
124
125 if (is_prologue_end)
126 *s << ", is_prologue_end = TRUE";
127
129 *s << ", is_epilogue_begin = TRUE";
130
132 *s << ", is_terminal_entry = TRUE";
133 } else {
135 s->EOL();
136 }
137 } else {
138 return Dump(s, target, true, Address::DumpStyleLoadAddress,
140 }
141 return true;
142}
143
145 return LineEntry::Compare(a, b) < 0;
146}
147
148int LineEntry::Compare(const LineEntry &a, const LineEntry &b) {
151 if (result != 0)
152 return result;
153
154 const lldb::addr_t a_byte_size = a.range.GetByteSize();
155 const lldb::addr_t b_byte_size = b.range.GetByteSize();
156
157 if (a_byte_size < b_byte_size)
158 return -1;
159 if (a_byte_size > b_byte_size)
160 return +1;
161
162 // Check for an end sequence entry mismatch after we have determined that the
163 // address values are equal. If one of the items is an end sequence, we don't
164 // care about the line, file, or column info.
166 return -1;
168 return +1;
169
170 if (a.line < b.line)
171 return -1;
172 if (a.line > b.line)
173 return +1;
174
175 if (a.column < b.column)
176 return -1;
177 if (a.column > b.column)
178 return +1;
179
180 return FileSpec::Compare(a.GetFile(), b.GetFile(), true);
181}
182
184 bool include_inlined_functions) const {
185 // Add each LineEntry's range to complete_line_range until we find a
186 // different file / line number.
187 AddressRange complete_line_range = range;
188 auto symbol_context_scope = lldb::eSymbolContextLineEntry;
189 Declaration start_call_site(original_file_sp->GetSpecOnly(), line);
190 if (include_inlined_functions)
191 symbol_context_scope |= lldb::eSymbolContextBlock;
192
193 while (true) {
194 SymbolContext next_line_sc;
195 Address range_end(complete_line_range.GetBaseAddress());
196 range_end.Slide(complete_line_range.GetByteSize());
197 range_end.CalculateSymbolContext(&next_line_sc, symbol_context_scope);
198
199 if (!next_line_sc.line_entry.IsValid() ||
200 next_line_sc.line_entry.range.GetByteSize() == 0)
201 break;
202
203 if (original_file_sp->Equal(*next_line_sc.line_entry.original_file_sp,
205 (next_line_sc.line_entry.line == 0 ||
206 line == next_line_sc.line_entry.line)) {
207 // Include any line 0 entries - they indicate that this is compiler-
208 // generated code that does not correspond to user source code.
209 // next_line_sc is the same file & line as this LineEntry, so extend
210 // our AddressRange by its size and continue to see if there are more
211 // LineEntries that we can combine. However, if there was nothing to
212 // extend we're done.
213 if (!complete_line_range.Extend(next_line_sc.line_entry.range))
214 break;
215 continue;
216 }
217
218 if (include_inlined_functions && next_line_sc.block &&
219 next_line_sc.block->GetContainingInlinedBlock() != nullptr) {
220 // The next_line_sc might be in a different file if it's an inlined
221 // function. If this is the case then we still want to expand our line
222 // range to include them if the inlined function is at the same call site
223 // as this line entry. The current block could represent a nested inline
224 // function call so we need to need to check up the block tree to see if
225 // we find one.
226 auto inlined_parent_block =
228 start_call_site);
229 if (!inlined_parent_block)
230 // We didn't find any parent inlined block with a call site at this line
231 // entry so this inlined function is probably at another line.
232 break;
233 // Extend our AddressRange by the size of the inlined block, but if there
234 // was nothing to add then we're done.
235 if (!complete_line_range.Extend(next_line_sc.line_entry.range))
236 break;
237 continue;
238 }
239
240 break;
241 }
242 return complete_line_range;
243}
244
246 if (target_sp) {
247 // Apply any file remappings to our file.
248 if (auto new_file_spec = target_sp->GetSourcePathMap().FindFile(
249 original_file_sp->GetSpecOnly())) {
250 file_sp = std::make_shared<SupportFile>(*new_file_spec,
251 original_file_sp->GetChecksum());
252 }
253 }
254}
A section + offset based address range class.
Address & GetBaseAddress()
Get accessor for the base address of the range.
bool Extend(const AddressRange &rhs_range)
Extends this range with rhs_range if it overlaps this range on the right side.
lldb::addr_t GetByteSize() const
Get accessor for the byte size of this range.
A section + offset based address class.
Definition Address.h:62
static int CompareFileAddress(const Address &lhs, const Address &rhs)
Compare two Address objects.
Definition Address.cpp:920
uint32_t CalculateSymbolContext(SymbolContext *sc, lldb::SymbolContextItem resolve_scope=lldb::eSymbolContextEverything) const
Reconstruct a symbol context from an address.
Definition Address.cpp:820
DumpStyle
Dump styles allow the Address::Dump(Stream *,DumpStyle) const function to display Address contents in...
Definition Address.h:66
@ DumpStyleFileAddress
Display as the file address (if any).
Definition Address.h:87
@ DumpStyleModuleWithFileAddress
Display as the file address with the module name prepended (if any).
Definition Address.h:93
@ DumpStyleLoadAddress
Display as the load address (if resolved).
Definition Address.h:99
bool Slide(int64_t offset)
Definition Address.h:452
Block * GetContainingInlinedBlockWithCallSite(const Declaration &find_call_site)
Get the inlined block at the given call site that contains this block.
Definition Block.cpp:223
Block * GetContainingInlinedBlock()
Get the inlined block that contains this block.
Definition Block.cpp:206
A class that describes a compilation unit.
Definition CompileUnit.h:43
void Dump(Stream *s, const char *value_if_empty=nullptr) const
Dump the object description to a stream.
A class that describes the declaration location of a lldb object.
Definition Declaration.h:24
A file utility class.
Definition FileSpec.h:57
const ConstString & GetFilename() const
Filename string const get accessor.
Definition FileSpec.h:251
static int Compare(const FileSpec &lhs, const FileSpec &rhs, bool full)
Compare two FileSpec objects.
Definition FileSpec.cpp:273
void Dump(llvm::raw_ostream &s) const
Dump this object to a Stream.
Definition FileSpec.cpp:325
A stream class that can stream formatted output to a file.
Definition Stream.h:28
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
Definition Stream.h:406
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition Stream.cpp:134
size_t PutChar(char ch)
Definition Stream.cpp:131
size_t EOL()
Output and End of Line character to the stream.
Definition Stream.cpp:155
Wraps a FileSpec and an optional Checksum.
Definition SupportFile.h:22
Defines a symbol context baton that can be handed other debug core functions.
Block * block
The Block for a given query.
LineEntry line_entry
The LineEntry for a given query.
#define LLDB_INVALID_LINE_NUMBER
A class that represents a running process on the host machine.
bool operator<(const Address &lhs, const Address &rhs)
Definition Address.cpp:980
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
@ eDescriptionLevelBrief
@ eDescriptionLevelFull
uint64_t addr_t
Definition lldb-types.h:80
std::shared_ptr< lldb_private::Target > TargetSP
A line table entry class.
Definition LineEntry.h:21
uint16_t column
The column number of the source line, or zero if there is no column information.
Definition LineEntry.h:155
uint16_t is_epilogue_begin
Indicates this entry is one (of possibly many) where execution should be suspended for an exit breakp...
Definition LineEntry.h:169
void Clear()
Clear the object's state.
Definition LineEntry.cpp:22
bool Dump(Stream *s, Target *target, bool show_file, Address::DumpStyle style, Address::DumpStyle fallback_style, bool show_range) const
Dump a description of this object to a Stream.
Definition LineEntry.cpp:61
AddressRange GetSameLineContiguousAddressRange(bool include_inlined_functions) const
Give the range for this LineEntry + any additional LineEntries for this same source line that are con...
bool IsValid() const
Check if a line entry object is valid.
Definition LineEntry.cpp:35
static int Compare(const LineEntry &lhs, const LineEntry &rhs)
Compare two LineEntry objects.
AddressRange range
The section offset address range for this line entry.
Definition LineEntry.h:137
uint32_t line
The source line number, or LLDB_INVALID_LINE_NUMBER if there is no line number information.
Definition LineEntry.h:151
LineEntry()
Default constructor.
Definition LineEntry.cpp:16
bool GetDescription(Stream *s, lldb::DescriptionLevel level, CompileUnit *cu, Target *target, bool show_address_only) const
Definition LineEntry.cpp:96
uint16_t is_start_of_basic_block
Indicates this entry is the beginning of a basic block.
Definition LineEntry.h:161
bool DumpStopContext(Stream *s, bool show_fullpaths) const
Dumps information specific to a process that stops at this line entry to the supplied stream s.
Definition LineEntry.cpp:40
const FileSpec & GetFile() const
Helper to access the file.
Definition LineEntry.h:134
SupportFileNSP file_sp
The source file, possibly mapped by the target.source-map setting.
Definition LineEntry.h:144
uint16_t is_prologue_end
Indicates this entry is one (of possibly many) where execution should be suspended for an entry break...
Definition LineEntry.h:165
uint16_t is_terminal_entry
Indicates this entry is that of the first byte after the end of a sequence of target machine instruct...
Definition LineEntry.h:173
bool synthetic
This gets set for LineEntries created without a valid address range.
Definition LineEntry.h:141
void ApplyFileMappings(lldb::TargetSP target_sp)
Apply file mappings from target.source-map to the LineEntry's file.
SupportFileNSP original_file_sp
The original source file, from debug info.
Definition LineEntry.h:147
uint16_t is_start_of_statement
Indicates this entry is the beginning of a statement.
Definition LineEntry.h:158