Skip to content

Commit eff3c34

Browse files
authored
[lldb] Remove Debugger::Get{Output,Error}Stream (NFC) (#126821)
Remove Debugger::GetOutputStream and Debugger::GetErrorStream in preparation for replacing both with a new variant that needs to be locked and hence can't be handed out like we do right now. The patch replaces most uses with GetAsyncOutputStream and GetAsyncErrorStream respectively. There methods return new StreamSP objects that automatically get flushed on destruction. See #126630 for more details.
1 parent bee9664 commit eff3c34

File tree

15 files changed

+95
-109
lines changed

15 files changed

+95
-109
lines changed

lldb/include/lldb/Core/Debugger.h

-4
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,6 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
143143

144144
File &GetErrorFile() { return m_error_stream_sp->GetFile(); }
145145

146-
StreamFile &GetOutputStream() { return *m_output_stream_sp; }
147-
148-
StreamFile &GetErrorStream() { return *m_error_stream_sp; }
149-
150146
repro::DataRecorder *GetInputRecorder();
151147

152148
Status SetInputString(const char *data);

lldb/source/API/SBDebugger.cpp

+10-18
Original file line numberDiff line numberDiff line change
@@ -508,39 +508,31 @@ SBFile SBDebugger::GetInputFile() {
508508

509509
FILE *SBDebugger::GetOutputFileHandle() {
510510
LLDB_INSTRUMENT_VA(this);
511-
if (m_opaque_sp) {
512-
StreamFile &stream_file = m_opaque_sp->GetOutputStream();
513-
return stream_file.GetFile().GetStream();
514-
}
511+
if (m_opaque_sp)
512+
return m_opaque_sp->GetOutputStreamSP()->GetFile().GetStream();
515513
return nullptr;
516514
}
517515

518516
SBFile SBDebugger::GetOutputFile() {
519517
LLDB_INSTRUMENT_VA(this);
520-
if (m_opaque_sp) {
521-
SBFile file(m_opaque_sp->GetOutputStream().GetFileSP());
522-
return file;
523-
}
518+
if (m_opaque_sp)
519+
return SBFile(m_opaque_sp->GetOutputStreamSP()->GetFileSP());
524520
return SBFile();
525521
}
526522

527523
FILE *SBDebugger::GetErrorFileHandle() {
528524
LLDB_INSTRUMENT_VA(this);
529525

530-
if (m_opaque_sp) {
531-
StreamFile &stream_file = m_opaque_sp->GetErrorStream();
532-
return stream_file.GetFile().GetStream();
533-
}
526+
if (m_opaque_sp)
527+
return m_opaque_sp->GetErrorStreamSP()->GetFile().GetStream();
534528
return nullptr;
535529
}
536530

537531
SBFile SBDebugger::GetErrorFile() {
538532
LLDB_INSTRUMENT_VA(this);
539533
SBFile file;
540-
if (m_opaque_sp) {
541-
SBFile file(m_opaque_sp->GetErrorStream().GetFileSP());
542-
return file;
543-
}
534+
if (m_opaque_sp)
535+
return SBFile(m_opaque_sp->GetErrorStreamSP()->GetFileSP());
544536
return SBFile();
545537
}
546538

@@ -581,8 +573,8 @@ void SBDebugger::HandleCommand(const char *command) {
581573

582574
sb_interpreter.HandleCommand(command, result, false);
583575

584-
result.PutError(m_opaque_sp->GetErrorStream().GetFileSP());
585-
result.PutOutput(m_opaque_sp->GetOutputStream().GetFileSP());
576+
result.PutError(m_opaque_sp->GetErrorStreamSP()->GetFileSP());
577+
result.PutOutput(m_opaque_sp->GetOutputStreamSP()->GetFileSP());
586578

587579
if (!m_opaque_sp->GetAsyncExecution()) {
588580
SBProcess process(GetCommandInterpreter().GetProcess());

lldb/source/Core/Debugger.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,11 @@ Status Debugger::SetPropertyValue(const ExecutionContext *exe_ctx,
257257
std::list<Status> errors;
258258
StreamString feedback_stream;
259259
if (!target_sp->LoadScriptingResources(errors, feedback_stream)) {
260-
Stream &s = GetErrorStream();
261-
for (auto &error : errors) {
262-
s.Printf("%s\n", error.AsCString());
263-
}
260+
lldb::StreamSP s = GetAsyncErrorStream();
261+
for (auto &error : errors)
262+
s->Printf("%s\n", error.AsCString());
264263
if (feedback_stream.GetSize())
265-
s.PutCString(feedback_stream.GetString());
264+
s->PutCString(feedback_stream.GetString());
266265
}
267266
}
268267
}

lldb/source/Core/DynamicLoader.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
263263
module_sp = std::make_shared<Module>(module_spec);
264264
} else if (force_symbol_search && error.AsCString("") &&
265265
error.AsCString("")[0] != '\0') {
266-
target.GetDebugger().GetErrorStream() << error.AsCString();
266+
*target.GetDebugger().GetAsyncErrorStream() << error.AsCString();
267267
}
268268
}
269269

@@ -328,19 +328,19 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
328328
}
329329
} else {
330330
if (force_symbol_search) {
331-
Stream &s = target.GetDebugger().GetErrorStream();
332-
s.Printf("Unable to find file");
331+
lldb::StreamSP s = target.GetDebugger().GetAsyncErrorStream();
332+
s->Printf("Unable to find file");
333333
if (!name.empty())
334-
s.Printf(" %s", name.str().c_str());
334+
s->Printf(" %s", name.str().c_str());
335335
if (uuid.IsValid())
336-
s.Printf(" with UUID %s", uuid.GetAsString().c_str());
336+
s->Printf(" with UUID %s", uuid.GetAsString().c_str());
337337
if (value != LLDB_INVALID_ADDRESS) {
338338
if (value_is_offset)
339-
s.Printf(" with slide 0x%" PRIx64, value);
339+
s->Printf(" with slide 0x%" PRIx64, value);
340340
else
341-
s.Printf(" at address 0x%" PRIx64, value);
341+
s->Printf(" at address 0x%" PRIx64, value);
342342
}
343-
s.Printf("\n");
343+
s->Printf("\n");
344344
}
345345
LLDB_LOGF(log,
346346
"Unable to find binary %s with UUID %s and load it at "

lldb/source/Interpreter/ScriptInterpreter.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ ScriptInterpreterIORedirect::ScriptInterpreterIORedirect(
245245
if (outfile_handle)
246246
::setbuf(outfile_handle, nullptr);
247247

248-
result->SetImmediateOutputFile(debugger.GetOutputStream().GetFileSP());
249-
result->SetImmediateErrorFile(debugger.GetErrorStream().GetFileSP());
248+
result->SetImmediateOutputFile(debugger.GetOutputStreamSP()->GetFileSP());
249+
result->SetImmediateErrorFile(debugger.GetErrorStreamSP()->GetFileSP());
250250
}
251251
}
252252

lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp

+40-41
Original file line numberDiff line numberDiff line change
@@ -738,9 +738,9 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
738738
}
739739

740740
if (IsKernel() && m_uuid.IsValid()) {
741-
Stream &s = target.GetDebugger().GetOutputStream();
742-
s.Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
743-
s.Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
741+
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
742+
s->Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
743+
s->Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
744744

745745
// Start of a kernel debug session, we have the UUID of the kernel.
746746
// Go through the target's list of modules and if there are any kernel
@@ -830,12 +830,12 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
830830
}
831831

832832
if (IsKernel() && !m_module_sp) {
833-
Stream &s = target.GetDebugger().GetErrorStream();
834-
s.Printf("WARNING: Unable to locate kernel binary on the debugger "
835-
"system.\n");
833+
lldb::StreamSP s = target.GetDebugger().GetAsyncErrorStream();
834+
s->Printf("WARNING: Unable to locate kernel binary on the debugger "
835+
"system.\n");
836836
if (kernel_search_error.Fail() && kernel_search_error.AsCString("") &&
837837
kernel_search_error.AsCString("")[0] != '\0') {
838-
s << kernel_search_error.AsCString();
838+
*s << kernel_search_error.AsCString();
839839
}
840840
}
841841
}
@@ -974,22 +974,19 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
974974
bool is_loaded = IsLoaded();
975975

976976
if (is_loaded && m_module_sp && IsKernel()) {
977-
Stream &s = target.GetDebugger().GetOutputStream();
977+
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
978978
ObjectFile *kernel_object_file = m_module_sp->GetObjectFile();
979979
if (kernel_object_file) {
980980
addr_t file_address =
981981
kernel_object_file->GetBaseAddress().GetFileAddress();
982982
if (m_load_address != LLDB_INVALID_ADDRESS &&
983983
file_address != LLDB_INVALID_ADDRESS) {
984-
s.Printf("Kernel slid 0x%" PRIx64 " in memory.\n",
985-
m_load_address - file_address);
984+
s->Printf("Kernel slid 0x%" PRIx64 " in memory.\n",
985+
m_load_address - file_address);
986986
}
987987
}
988-
{
989-
s.Printf("Loaded kernel file %s\n",
990-
m_module_sp->GetFileSpec().GetPath().c_str());
991-
}
992-
s.Flush();
988+
s->Printf("Loaded kernel file %s\n",
989+
m_module_sp->GetFileSpec().GetPath().c_str());
993990
}
994991

995992
// Notify the target about the module being added;
@@ -1195,10 +1192,11 @@ bool DynamicLoaderDarwinKernel::ReadKextSummaryHeader() {
11951192
lldb::offset_t offset = 0;
11961193
m_kext_summary_header.version = data.GetU32(&offset);
11971194
if (m_kext_summary_header.version > 128) {
1198-
Stream &s = m_process->GetTarget().GetDebugger().GetOutputStream();
1199-
s.Printf("WARNING: Unable to read kext summary header, got "
1200-
"improbable version number %u\n",
1201-
m_kext_summary_header.version);
1195+
lldb::StreamSP s =
1196+
m_process->GetTarget().GetDebugger().GetOutputStreamSP();
1197+
s->Printf("WARNING: Unable to read kext summary header, got "
1198+
"improbable version number %u\n",
1199+
m_kext_summary_header.version);
12021200
// If we get an improbably large version number, we're probably
12031201
// getting bad memory.
12041202
m_kext_summary_header_addr.Clear();
@@ -1209,11 +1207,11 @@ bool DynamicLoaderDarwinKernel::ReadKextSummaryHeader() {
12091207
if (m_kext_summary_header.entry_size > 4096) {
12101208
// If we get an improbably large entry_size, we're probably
12111209
// getting bad memory.
1212-
Stream &s =
1213-
m_process->GetTarget().GetDebugger().GetOutputStream();
1214-
s.Printf("WARNING: Unable to read kext summary header, got "
1215-
"improbable entry_size %u\n",
1216-
m_kext_summary_header.entry_size);
1210+
lldb::StreamSP s =
1211+
m_process->GetTarget().GetDebugger().GetOutputStreamSP();
1212+
s->Printf("WARNING: Unable to read kext summary header, got "
1213+
"improbable entry_size %u\n",
1214+
m_kext_summary_header.entry_size);
12171215
m_kext_summary_header_addr.Clear();
12181216
return false;
12191217
}
@@ -1227,10 +1225,11 @@ bool DynamicLoaderDarwinKernel::ReadKextSummaryHeader() {
12271225
if (m_kext_summary_header.entry_count > 10000) {
12281226
// If we get an improbably large number of kexts, we're probably
12291227
// getting bad memory.
1230-
Stream &s = m_process->GetTarget().GetDebugger().GetOutputStream();
1231-
s.Printf("WARNING: Unable to read kext summary header, got "
1232-
"improbable number of kexts %u\n",
1233-
m_kext_summary_header.entry_count);
1228+
lldb::StreamSP s =
1229+
m_process->GetTarget().GetDebugger().GetOutputStreamSP();
1230+
s->Printf("WARNING: Unable to read kext summary header, got "
1231+
"improbable number of kexts %u\n",
1232+
m_kext_summary_header.entry_count);
12341233
m_kext_summary_header_addr.Clear();
12351234
return false;
12361235
}
@@ -1331,17 +1330,18 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
13311330
number_of_old_kexts_being_removed == 0)
13321331
return true;
13331332

1334-
Stream &s = m_process->GetTarget().GetDebugger().GetOutputStream();
1333+
lldb::StreamSP s = m_process->GetTarget().GetDebugger().GetOutputStreamSP();
13351334
if (load_kexts) {
13361335
if (number_of_new_kexts_being_added > 0 &&
13371336
number_of_old_kexts_being_removed > 0) {
1338-
s.Printf("Loading %d kext modules and unloading %d kext modules ",
1339-
number_of_new_kexts_being_added,
1340-
number_of_old_kexts_being_removed);
1337+
s->Printf("Loading %d kext modules and unloading %d kext modules ",
1338+
number_of_new_kexts_being_added,
1339+
number_of_old_kexts_being_removed);
13411340
} else if (number_of_new_kexts_being_added > 0) {
1342-
s.Printf("Loading %d kext modules ", number_of_new_kexts_being_added);
1341+
s->Printf("Loading %d kext modules ", number_of_new_kexts_being_added);
13431342
} else if (number_of_old_kexts_being_removed > 0) {
1344-
s.Printf("Unloading %d kext modules ", number_of_old_kexts_being_removed);
1343+
s->Printf("Unloading %d kext modules ",
1344+
number_of_old_kexts_being_removed);
13451345
}
13461346
}
13471347

@@ -1405,7 +1405,7 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
14051405
if (image_info.GetModule()) {
14061406
unloaded_module_list.AppendIfNeeded(image_info.GetModule());
14071407
}
1408-
s.Printf(".");
1408+
s->Printf(".");
14091409
image_info.Clear();
14101410
// should pull it out of the KextImageInfos vector but that would
14111411
// mutate the list and invalidate the to_be_removed bool vector;
@@ -1417,11 +1417,11 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
14171417
}
14181418

14191419
if (load_kexts) {
1420-
s.Printf(" done.\n");
1420+
s->Printf(" done.\n");
14211421
if (kexts_failed_to_load.size() > 0 && number_of_new_kexts_being_added > 0) {
1422-
s.Printf("Failed to load %d of %d kexts:\n",
1423-
(int)kexts_failed_to_load.size(),
1424-
number_of_new_kexts_being_added);
1422+
s->Printf("Failed to load %d of %d kexts:\n",
1423+
(int)kexts_failed_to_load.size(),
1424+
number_of_new_kexts_being_added);
14251425
// print a sorted list of <kext-name, uuid> kexts which failed to load
14261426
unsigned longest_name = 0;
14271427
std::sort(kexts_failed_to_load.begin(), kexts_failed_to_load.end());
@@ -1433,10 +1433,9 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
14331433
std::string uuid;
14341434
if (ku.second.IsValid())
14351435
uuid = ku.second.GetAsString();
1436-
s.Printf(" %-*s %s\n", longest_name, ku.first.c_str(), uuid.c_str());
1436+
s->Printf(" %-*s %s\n", longest_name, ku.first.c_str(), uuid.c_str());
14371437
}
14381438
}
1439-
s.Flush();
14401439
}
14411440

14421441
return true;

lldb/source/Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.cpp

+11-12
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,9 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
327327
Target &target = process->GetTarget();
328328

329329
if (IsKernel() && m_uuid.IsValid()) {
330-
Stream &s = target.GetDebugger().GetOutputStream();
331-
s.Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
332-
s.Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
330+
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
331+
s->Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
332+
s->Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
333333
}
334334

335335
// Test if the module is loaded into the taget,
@@ -355,9 +355,9 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
355355
if (!m_module_sp)
356356
m_module_sp = target.GetOrCreateModule(module_spec, true);
357357
if (IsKernel() && !m_module_sp) {
358-
Stream &s = target.GetDebugger().GetOutputStream();
359-
s.Printf("WARNING: Unable to locate kernel binary on the debugger "
360-
"system.\n");
358+
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
359+
s->Printf("WARNING: Unable to locate kernel binary on the debugger "
360+
"system.\n");
361361
}
362362
}
363363

@@ -464,20 +464,19 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
464464
}
465465

466466
if (IsLoaded() && m_module_sp && IsKernel()) {
467-
Stream &s = target.GetDebugger().GetOutputStream();
467+
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
468468
ObjectFile *kernel_object_file = m_module_sp->GetObjectFile();
469469
if (kernel_object_file) {
470470
addr_t file_address =
471471
kernel_object_file->GetBaseAddress().GetFileAddress();
472472
if (m_load_address != LLDB_INVALID_ADDRESS &&
473473
file_address != LLDB_INVALID_ADDRESS) {
474-
s.Printf("Kernel slide 0x%" PRIx64 " in memory.\n",
475-
m_load_address - file_address);
476-
s.Printf("Loaded kernel file %s\n",
477-
m_module_sp->GetFileSpec().GetPath().c_str());
474+
s->Printf("Kernel slide 0x%" PRIx64 " in memory.\n",
475+
m_load_address - file_address);
476+
s->Printf("Loaded kernel file %s\n",
477+
m_module_sp->GetFileSpec().GetPath().c_str());
478478
}
479479
}
480-
s.Flush();
481480
}
482481

483482
return IsLoaded();

lldb/source/Plugins/InstrumentationRuntime/TSan/InstrumentationRuntimeTSan.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -864,13 +864,14 @@ bool InstrumentationRuntimeTSan::NotifyBreakpointHit(
864864
CreateStopReasonWithInstrumentationData(
865865
*thread_sp, stop_reason_description, report));
866866

867-
StreamFile &s = process_sp->GetTarget().GetDebugger().GetOutputStream();
868-
s.Printf("ThreadSanitizer report breakpoint hit. Use 'thread "
869-
"info -s' to get extended information about the "
870-
"report.\n");
867+
lldb::StreamSP s =
868+
process_sp->GetTarget().GetDebugger().GetAsyncOutputStream();
869+
s->Printf("ThreadSanitizer report breakpoint hit. Use 'thread "
870+
"info -s' to get extended information about the "
871+
"report.\n");
871872

872873
return true; // Return true to stop the target
873-
} else
874+
}
874875
return false; // Let target run
875876
}
876877

lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -622,14 +622,14 @@ AppleObjCTrampolineHandler::AppleObjCTrampolineHandler(
622622
// step through any method dispatches. Warn to that effect and get out of
623623
// here.
624624
if (process_sp->CanJIT()) {
625-
process_sp->GetTarget().GetDebugger().GetErrorStream().Printf(
625+
process_sp->GetTarget().GetDebugger().GetAsyncErrorStream()->Printf(
626626
"Could not find implementation lookup function \"%s\""
627627
" step in through ObjC method dispatch will not work.\n",
628628
get_impl_name.AsCString());
629629
}
630630
return;
631631
}
632-
632+
633633
// We will either set the implementation to the _stret or non_stret version,
634634
// so either way it's safe to start filling the m_lookup_..._code here.
635635
m_lookup_implementation_function_code.assign(

0 commit comments

Comments
 (0)