Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 556fe5f

Browse files
authored
[lldb] Reland: Store SupportFile in FileEntry (NFC) (llvm#85892)
This is another step towards supporting DWARF5 checksums and inline source code in LLDB. This is a reland of llvm#85468 but without the functional change of storing the support file from the line table (yet).
1 parent 0c8dfc8 commit 556fe5f

27 files changed

+69
-60
lines changed

lldb/include/lldb/Core/Disassembler.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ class Disassembler : public std::enable_shared_from_this<Disassembler>,
538538
ElideMixedSourceAndDisassemblyLine(const ExecutionContext &exe_ctx,
539539
const SymbolContext &sc, LineEntry &line) {
540540
SourceLine sl;
541-
sl.file = line.file;
541+
sl.file = line.GetFile();
542542
sl.line = line.line;
543543
sl.column = line.column;
544544
return ElideMixedSourceAndDisassemblyLine(exe_ctx, sc, sl);

lldb/include/lldb/Symbol/LineEntry.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,14 @@ struct LineEntry {
130130
/// Shared pointer to the target this LineEntry belongs to.
131131
void ApplyFileMappings(lldb::TargetSP target_sp);
132132

133+
/// Helper to access the file.
134+
const FileSpec &GetFile() const { return file_sp->GetSpecOnly(); }
135+
133136
/// The section offset address range for this line entry.
134137
AddressRange range;
135138

136139
/// The source file, possibly mapped by the target.source-map setting.
137-
FileSpec file;
140+
lldb::SupportFileSP file_sp;
138141

139142
/// The original source file, from debug info.
140143
lldb::SupportFileSP original_file_sp;

lldb/include/lldb/Utility/SupportFile.h

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ class SupportFile {
4545
/// Materialize the file to disk and return the path to that temporary file.
4646
virtual const FileSpec &Materialize() { return m_file_spec; }
4747

48+
/// Change the file name.
49+
void Update(const FileSpec &file_spec) { m_file_spec = file_spec; }
50+
4851
protected:
4952
FileSpec m_file_spec;
5053
Checksum m_checksum;

lldb/source/API/SBLineEntry.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ SBFileSpec SBLineEntry::GetFileSpec() const {
8181
LLDB_INSTRUMENT_VA(this);
8282

8383
SBFileSpec sb_file_spec;
84-
if (m_opaque_up.get() && m_opaque_up->file)
85-
sb_file_spec.SetFileSpec(m_opaque_up->file);
84+
if (m_opaque_up.get() && m_opaque_up->GetFile())
85+
sb_file_spec.SetFileSpec(m_opaque_up->GetFile());
8686

8787
return sb_file_spec;
8888
}
@@ -109,9 +109,9 @@ void SBLineEntry::SetFileSpec(lldb::SBFileSpec filespec) {
109109
LLDB_INSTRUMENT_VA(this, filespec);
110110

111111
if (filespec.IsValid())
112-
ref().file = filespec.ref();
112+
ref().file_sp = std::make_shared<SupportFile>(filespec.ref());
113113
else
114-
ref().file.Clear();
114+
ref().file_sp = std::make_shared<SupportFile>();
115115
}
116116
void SBLineEntry::SetLine(uint32_t line) {
117117
LLDB_INSTRUMENT_VA(this, line);
@@ -168,7 +168,7 @@ bool SBLineEntry::GetDescription(SBStream &description) {
168168

169169
if (m_opaque_up) {
170170
char file_path[PATH_MAX * 2];
171-
m_opaque_up->file.GetPath(file_path, sizeof(file_path));
171+
m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path));
172172
strm.Printf("%s:%u", file_path, GetLine());
173173
if (GetColumn() > 0)
174174
strm.Printf(":%u", GetColumn());

lldb/source/API/SBThread.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,7 @@ SBError SBThread::StepOverUntil(lldb::SBFrame &sb_frame,
819819
step_file_spec = sb_file_spec.ref();
820820
} else {
821821
if (frame_sc.line_entry.IsValid())
822-
step_file_spec = frame_sc.line_entry.file;
822+
step_file_spec = frame_sc.line_entry.GetFile();
823823
else {
824824
sb_error.SetErrorString("invalid file argument or no file for frame");
825825
return sb_error;

lldb/source/Breakpoint/BreakpointResolver.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ void BreakpointResolver::SetSCMatchesByLine(
221221
auto &match = all_scs[0];
222222
auto worklist_begin = std::partition(
223223
all_scs.begin(), all_scs.end(), [&](const SymbolContext &sc) {
224-
if (sc.line_entry.file == match.line_entry.file ||
224+
if (sc.line_entry.GetFile() == match.line_entry.GetFile() ||
225225
*sc.line_entry.original_file_sp ==
226226
*match.line_entry.original_file_sp) {
227227
// When a match is found, keep track of the smallest line number.

lldb/source/Breakpoint/BreakpointResolverFileLine.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ void BreakpointResolverFileLine::FilterContexts(SymbolContextList &sc_list) {
147147
else
148148
continue;
149149

150-
if (file != sc.line_entry.file) {
151-
LLDB_LOG(log, "unexpected symbol context file {0}", sc.line_entry.file);
150+
if (file != sc.line_entry.GetFile()) {
151+
LLDB_LOG(log, "unexpected symbol context file {0}",
152+
sc.line_entry.GetFile());
152153
continue;
153154
}
154155

@@ -223,7 +224,7 @@ void BreakpointResolverFileLine::DeduceSourceMapping(
223224

224225
const bool case_sensitive = request_file.IsCaseSensitive();
225226
for (const SymbolContext &sc : sc_list) {
226-
FileSpec sc_file = sc.line_entry.file;
227+
FileSpec sc_file = sc.line_entry.GetFile();
227228

228229
if (FileSpec::Equal(sc_file, request_file, /*full*/ true))
229230
continue;

lldb/source/Commands/CommandObjectBreakpoint.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,8 @@ class CommandObjectBreakpointSet : public CommandObjectParsed {
780780
} else {
781781
const SymbolContext &sc =
782782
cur_frame->GetSymbolContext(eSymbolContextLineEntry);
783-
if (sc.line_entry.file) {
784-
file = sc.line_entry.file;
783+
if (sc.line_entry.GetFile()) {
784+
file = sc.line_entry.GetFile();
785785
} else {
786786
result.AppendError("Can't find the file for the selected frame to "
787787
"use as the default file.");

lldb/source/Commands/CommandObjectSource.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ class CommandObjectSourceInfo : public CommandObjectParsed {
158158
if (module_list.GetSize() &&
159159
module_list.GetIndexForModule(module) == LLDB_INVALID_INDEX32)
160160
continue;
161-
if (!FileSpec::Match(file_spec, line_entry.file))
161+
if (!FileSpec::Match(file_spec, line_entry.GetFile()))
162162
continue;
163163
if (start_line > 0 && line_entry.line < start_line)
164164
continue;
@@ -239,7 +239,7 @@ class CommandObjectSourceInfo : public CommandObjectParsed {
239239
num_matches++;
240240
if (num_lines > 0 && num_matches > num_lines)
241241
break;
242-
assert(cu_file_spec == line_entry.file);
242+
assert(cu_file_spec == line_entry.GetFile());
243243
if (!cu_header_printed) {
244244
if (num_matches > 0)
245245
strm << "\n\n";
@@ -760,11 +760,11 @@ class CommandObjectSourceList : public CommandObjectParsed {
760760
bool operator<(const SourceInfo &rhs) const {
761761
if (function.GetCString() < rhs.function.GetCString())
762762
return true;
763-
if (line_entry.file.GetDirectory().GetCString() <
764-
rhs.line_entry.file.GetDirectory().GetCString())
763+
if (line_entry.GetFile().GetDirectory().GetCString() <
764+
rhs.line_entry.GetFile().GetDirectory().GetCString())
765765
return true;
766-
if (line_entry.file.GetFilename().GetCString() <
767-
rhs.line_entry.file.GetFilename().GetCString())
766+
if (line_entry.GetFile().GetFilename().GetCString() <
767+
rhs.line_entry.GetFile().GetFilename().GetCString())
768768
return true;
769769
if (line_entry.line < rhs.line_entry.line)
770770
return true;
@@ -799,7 +799,7 @@ class CommandObjectSourceList : public CommandObjectParsed {
799799
sc.function->GetEndLineSourceInfo(end_file, end_line);
800800
} else {
801801
// We have an inlined function
802-
start_file = source_info.line_entry.file;
802+
start_file = source_info.line_entry.GetFile();
803803
start_line = source_info.line_entry.line;
804804
end_line = start_line + m_options.num_lines;
805805
}

lldb/source/Commands/CommandObjectThread.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1705,7 +1705,7 @@ class CommandObjectThreadJump : public CommandObjectParsed {
17051705
line = sym_ctx.line_entry.line + m_options.m_line_offset;
17061706

17071707
// Try the current file, but override if asked.
1708-
FileSpec file = sym_ctx.line_entry.file;
1708+
FileSpec file = sym_ctx.line_entry.GetFile();
17091709
if (m_options.m_filenames.GetSize() == 1)
17101710
file = m_options.m_filenames.GetFileSpecAtIndex(0);
17111711

lldb/source/Core/Address.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ bool Address::GetDescription(Stream &s, Target &target,
398398
"Non-brief descriptions not implemented");
399399
LineEntry line_entry;
400400
if (CalculateSymbolContextLineEntry(line_entry)) {
401-
s.Printf(" (%s:%u:%u)", line_entry.file.GetFilename().GetCString(),
401+
s.Printf(" (%s:%u:%u)", line_entry.GetFile().GetFilename().GetCString(),
402402
line_entry.line, line_entry.column);
403403
return true;
404404
}

lldb/source/Core/Disassembler.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ Disassembler::GetFunctionDeclLineEntry(const SymbolContext &sc) {
201201
uint32_t func_decl_line;
202202
sc.function->GetStartLineSourceInfo(func_decl_file, func_decl_line);
203203

204-
if (func_decl_file != prologue_end_line.file &&
204+
if (func_decl_file != prologue_end_line.GetFile() &&
205205
func_decl_file != prologue_end_line.original_file_sp->GetSpecOnly())
206206
return {};
207207

@@ -354,7 +354,7 @@ void Disassembler::PrintInstructions(Debugger &debugger, const ArchSpec &arch,
354354
}
355355
if (sc.line_entry.IsValid()) {
356356
SourceLine this_line;
357-
this_line.file = sc.line_entry.file;
357+
this_line.file = sc.line_entry.GetFile();
358358
this_line.line = sc.line_entry.line;
359359
this_line.column = sc.line_entry.column;
360360
if (!ElideMixedSourceAndDisassemblyLine(exe_ctx, sc, this_line))
@@ -406,7 +406,7 @@ void Disassembler::PrintInstructions(Debugger &debugger, const ArchSpec &arch,
406406
uint32_t func_decl_line;
407407
sc.function->GetStartLineSourceInfo(func_decl_file,
408408
func_decl_line);
409-
if (func_decl_file == prologue_end_line.file ||
409+
if (func_decl_file == prologue_end_line.GetFile() ||
410410
func_decl_file ==
411411
prologue_end_line.original_file_sp->GetSpecOnly()) {
412412
// Add all the lines between the function declaration and
@@ -439,7 +439,7 @@ void Disassembler::PrintInstructions(Debugger &debugger, const ArchSpec &arch,
439439

440440
if (sc != prev_sc && sc.comp_unit && sc.line_entry.IsValid()) {
441441
SourceLine this_line;
442-
this_line.file = sc.line_entry.file;
442+
this_line.file = sc.line_entry.GetFile();
443443
this_line.line = sc.line_entry.line;
444444

445445
if (!ElideMixedSourceAndDisassemblyLine(exe_ctx, sc,

lldb/source/Core/FormatEntity.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1792,7 +1792,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
17921792
if (sc && sc->line_entry.IsValid()) {
17931793
Module *module = sc->module_sp.get();
17941794
if (module) {
1795-
if (DumpFile(s, sc->line_entry.file, (FileKind)entry.number))
1795+
if (DumpFile(s, sc->line_entry.GetFile(), (FileKind)entry.number))
17961796
return true;
17971797
}
17981798
}

lldb/source/Core/IOHandlerCursesGUI.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -6894,7 +6894,8 @@ class SourceFileWindowDelegate : public WindowDelegate {
68946894
if (context_changed)
68956895
m_selected_line = m_pc_line;
68966896

6897-
if (m_file_sp && m_file_sp->GetFileSpec() == m_sc.line_entry.file) {
6897+
if (m_file_sp &&
6898+
m_file_sp->GetFileSpec() == m_sc.line_entry.GetFile()) {
68986899
// Same file, nothing to do, we should either have the lines or
68996900
// not (source file missing)
69006901
if (m_selected_line >= static_cast<size_t>(m_first_visible_line)) {
@@ -6909,8 +6910,8 @@ class SourceFileWindowDelegate : public WindowDelegate {
69096910
} else {
69106911
// File changed, set selected line to the line with the PC
69116912
m_selected_line = m_pc_line;
6912-
m_file_sp =
6913-
m_debugger.GetSourceManager().GetFile(m_sc.line_entry.file);
6913+
m_file_sp = m_debugger.GetSourceManager().GetFile(
6914+
m_sc.line_entry.GetFile());
69146915
if (m_file_sp) {
69156916
const size_t num_lines = m_file_sp->GetNumLines();
69166917
m_line_width = 1;
@@ -7000,7 +7001,7 @@ class SourceFileWindowDelegate : public WindowDelegate {
70007001
LineEntry bp_loc_line_entry;
70017002
if (bp_loc_sp->GetAddress().CalculateSymbolContextLineEntry(
70027003
bp_loc_line_entry)) {
7003-
if (m_file_sp->GetFileSpec() == bp_loc_line_entry.file) {
7004+
if (m_file_sp->GetFileSpec() == bp_loc_line_entry.GetFile()) {
70047005
bp_lines.insert(bp_loc_line_entry.line);
70057006
}
70067007
}
@@ -7477,7 +7478,7 @@ class SourceFileWindowDelegate : public WindowDelegate {
74777478
LineEntry bp_loc_line_entry;
74787479
if (bp_loc_sp->GetAddress().CalculateSymbolContextLineEntry(
74797480
bp_loc_line_entry)) {
7480-
if (m_file_sp->GetFileSpec() == bp_loc_line_entry.file &&
7481+
if (m_file_sp->GetFileSpec() == bp_loc_line_entry.GetFile() &&
74817482
m_selected_line + 1 == bp_loc_line_entry.line) {
74827483
bool removed =
74837484
exe_ctx.GetTargetRef().RemoveBreakpointByID(bp_sp->GetID());

lldb/source/Core/SourceManager.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ bool SourceManager::GetDefaultFileAndLine(FileSpec &file_spec, uint32_t &line) {
418418
if (sc.function->GetAddressRange()
419419
.GetBaseAddress()
420420
.CalculateSymbolContextLineEntry(line_entry)) {
421-
SetDefaultFileAndLine(line_entry.file, line_entry.line);
421+
SetDefaultFileAndLine(line_entry.GetFile(), line_entry.line);
422422
file_spec = m_last_file_spec;
423423
line = m_last_line;
424424
return true;

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ bool ClangExpressionSourceCode::GetText(
417417
if (sc.comp_unit && sc.line_entry.IsValid()) {
418418
DebugMacros *dm = sc.comp_unit->GetDebugMacros();
419419
if (dm) {
420-
AddMacroState state(sc.line_entry.file, sc.line_entry.line);
420+
AddMacroState state(sc.line_entry.GetFile(), sc.line_entry.line);
421421
AddMacros(dm, sc.comp_unit, state, debug_macros_stream);
422422
}
423423
}

lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,13 @@ bool lldb_private::formatters::LibcxxFunctionSummaryProvider(
106106
case CPPLanguageRuntime::LibCppStdFunctionCallableCase::Lambda:
107107
stream.Printf(
108108
" Lambda in File %s at Line %u",
109-
callable_info.callable_line_entry.file.GetFilename().GetCString(),
109+
callable_info.callable_line_entry.GetFile().GetFilename().GetCString(),
110110
callable_info.callable_line_entry.line);
111111
break;
112112
case CPPLanguageRuntime::LibCppStdFunctionCallableCase::CallableObject:
113113
stream.Printf(
114114
" Function in File %s at Line %u",
115-
callable_info.callable_line_entry.file.GetFilename().GetCString(),
115+
callable_info.callable_line_entry.GetFile().GetFilename().GetCString(),
116116
callable_info.callable_line_entry.line);
117117
break;
118118
case CPPLanguageRuntime::LibCppStdFunctionCallableCase::FreeOrMemberFunction:

lldb/source/Symbol/CompileUnit.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ void CompileUnit::ResolveSymbolContext(
320320
src_location_spec.GetColumn() ? std::optional<uint16_t>(line_entry.column)
321321
: std::nullopt;
322322

323-
SourceLocationSpec found_entry(line_entry.file, line_entry.line, column,
323+
SourceLocationSpec found_entry(line_entry.GetFile(), line_entry.line, column,
324324
inlines, exact);
325325

326326
while (line_idx != UINT32_MAX) {

lldb/source/Symbol/Function.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ void Function::GetStartLineSourceInfo(FileSpec &source_file,
289289
if (line_table->FindLineEntryByAddress(GetAddressRange().GetBaseAddress(),
290290
line_entry, nullptr)) {
291291
line_no = line_entry.line;
292-
source_file = line_entry.file;
292+
source_file = line_entry.GetFile();
293293
}
294294
}
295295
}
@@ -311,7 +311,7 @@ void Function::GetEndLineSourceInfo(FileSpec &source_file, uint32_t &line_no) {
311311
LineEntry line_entry;
312312
if (line_table->FindLineEntryByAddress(scratch_addr, line_entry, nullptr)) {
313313
line_no = line_entry.line;
314-
source_file = line_entry.file;
314+
source_file = line_entry.GetFile();
315315
}
316316
}
317317

lldb/source/Symbol/LineEntry.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
using namespace lldb_private;
1515

1616
LineEntry::LineEntry()
17-
: range(), file(), is_start_of_statement(0), is_start_of_basic_block(0),
17+
: range(), is_start_of_statement(0), is_start_of_basic_block(0),
1818
is_prologue_end(0), is_epilogue_begin(0), is_terminal_entry(0) {}
1919

2020
void LineEntry::Clear() {
2121
range.Clear();
22-
file.Clear();
22+
file_sp = std::make_shared<SupportFile>();
2323
original_file_sp = std::make_shared<SupportFile>();
2424
line = LLDB_INVALID_LINE_NUMBER;
2525
column = 0;
@@ -35,6 +35,7 @@ bool LineEntry::IsValid() const {
3535
}
3636

3737
bool LineEntry::DumpStopContext(Stream *s, bool show_fullpaths) const {
38+
const FileSpec &file = file_sp->GetSpecOnly();
3839
if (file) {
3940
if (show_fullpaths)
4041
file.Dump(s->AsRawOstream());
@@ -67,7 +68,7 @@ bool LineEntry::Dump(Stream *s, Target *target, bool show_file,
6768
return false;
6869
}
6970
if (show_file)
70-
*s << ", file = " << file;
71+
*s << ", file = " << GetFile();
7172
if (line)
7273
s->Printf(", line = %u", line);
7374
if (column)
@@ -103,7 +104,7 @@ bool LineEntry::GetDescription(Stream *s, lldb::DescriptionLevel level,
103104
Address::DumpStyleFileAddress);
104105
}
105106

106-
*s << ": " << file;
107+
*s << ": " << GetFile();
107108

108109
if (line) {
109110
s->Printf(":%u", line);
@@ -173,7 +174,7 @@ int LineEntry::Compare(const LineEntry &a, const LineEntry &b) {
173174
if (a.column > b.column)
174175
return +1;
175176

176-
return FileSpec::Compare(a.file, b.file, true);
177+
return FileSpec::Compare(a.GetFile(), b.GetFile(), true);
177178
}
178179

179180
AddressRange LineEntry::GetSameLineContiguousAddressRange(
@@ -242,6 +243,6 @@ void LineEntry::ApplyFileMappings(lldb::TargetSP target_sp) {
242243
// Apply any file remappings to our file.
243244
if (auto new_file_spec = target_sp->GetSourcePathMap().FindFile(
244245
original_file_sp->GetSpecOnly()))
245-
file = *new_file_spec;
246+
file_sp->Update(*new_file_spec);
246247
}
247248
}

lldb/source/Symbol/LineTable.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ bool LineTable::ConvertEntryAtIndexToLineEntry(uint32_t idx,
288288
else
289289
line_entry.range.SetByteSize(0);
290290

291-
line_entry.file =
292-
m_comp_unit->GetSupportFiles().GetFileSpecAtIndex(entry.file_idx);
291+
line_entry.file_sp = std::make_shared<SupportFile>(
292+
m_comp_unit->GetSupportFiles().GetFileSpecAtIndex(entry.file_idx));
293293
line_entry.original_file_sp =
294294
m_comp_unit->GetSupportFiles().GetSupportFileAtIndex(entry.file_idx);
295295
line_entry.line = entry.line;

0 commit comments

Comments
 (0)