Skip to content

Commit 9c90aa6

Browse files
committed
Migrate code over to the new iterator api
1 parent 5d7f2a6 commit 9c90aa6

File tree

4 files changed

+29
-40
lines changed

4 files changed

+29
-40
lines changed

lldb/source/Plugins/Process/minidump/MinidumpParser.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -417,16 +417,9 @@ std::vector<const minidump::Module *> MinidumpParser::GetFilteredModuleList() {
417417
return filtered_modules;
418418
}
419419

420-
std::optional<std::vector<const minidump::ExceptionStream *>>
420+
llvm::iterator_range<ExceptionStreamsIterator>
421421
MinidumpParser::GetExceptionStreams() {
422-
auto ExpectedStream = GetMinidumpFile().getExceptionStreams();
423-
if (ExpectedStream)
424-
return ExpectedStream.get();
425-
426-
LLDB_LOG_ERROR(GetLog(LLDBLog::Process), ExpectedStream.takeError(),
427-
"Failed to read minidump exception stream: {0}");
428-
429-
return std::nullopt;
422+
return GetMinidumpFile().getExceptionStreams();
430423
}
431424

432425
std::optional<minidump::Range>

lldb/source/Plugins/Process/minidump/MinidumpParser.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct Range {
4848
};
4949

5050
using FallibleMemory64Iterator = llvm::object::MinidumpFile::FallibleMemory64Iterator;
51+
using ExceptionStreamsIterator = llvm::object::MinidumpFile::ExceptionStreamsIterator;
5152

5253
class MinidumpParser {
5354
public:
@@ -84,7 +85,7 @@ class MinidumpParser {
8485
// have the same name, it keeps the copy with the lowest load address.
8586
std::vector<const minidump::Module *> GetFilteredModuleList();
8687

87-
std::optional<std::vector<const llvm::minidump::ExceptionStream *>>
88+
llvm::iterator_range<ExceptionStreamsIterator>
8889
GetExceptionStreams();
8990

9091
std::optional<Range> FindMemoryRange(lldb::addr_t addr);

lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -208,26 +208,21 @@ Status ProcessMinidump::DoLoadCore() {
208208
GetTarget().SetArchitecture(arch, true /*set_platform*/);
209209

210210
m_thread_list = m_minidump_parser->GetThreads();
211-
std::optional<std::vector<const minidump::ExceptionStream *>>
212-
exception_streams = m_minidump_parser->GetExceptionStreams();
213-
214-
if (exception_streams) {
215-
for (const auto *exception_stream : *exception_streams) {
216-
if (!exception_stream) {
217-
error.SetErrorString(
218-
"Minidump returned null pointer for exception stream");
219-
return error;
220-
}
221-
if (!m_exceptions_by_tid
222-
.try_emplace(exception_stream->ThreadId, exception_stream)
223-
.second) {
224-
// We only cast to avoid the warning around converting little endian in
225-
// printf.
226-
error.SetErrorStringWithFormat(
227-
"Duplicate exception stream for tid %" PRIu32,
228-
(uint32_t)exception_stream->ThreadId);
229-
return error;
230-
}
211+
auto exception_stream_it = m_minidump_parser->GetExceptionStreams();
212+
for (auto exception_stream : exception_stream_it) {
213+
// If we can't read an exception stream skip it
214+
// We should probably serve a warning
215+
if (!exception_stream)
216+
continue;
217+
218+
if (!m_exceptions_by_tid
219+
.try_emplace(exception_stream->ThreadId, exception_stream.get())
220+
.second) {
221+
// We only cast to avoid the warning around converting little endian in
222+
// printf.
223+
return Status::FromErrorStringWithFormat(
224+
"Duplicate exception stream for tid %" PRIu32,
225+
(uint32_t)exception_stream->ThreadId);
231226
}
232227
}
233228

@@ -254,7 +249,7 @@ void ProcessMinidump::RefreshStateAfterStop() {
254249

255250
for (const auto &[_, exception_stream] : m_exceptions_by_tid) {
256251
constexpr uint32_t BreakpadDumpRequested = 0xFFFFFFFF;
257-
if (exception_stream->ExceptionRecord.ExceptionCode ==
252+
if (exception_stream.ExceptionRecord.ExceptionCode ==
258253
BreakpadDumpRequested) {
259254
// This "ExceptionCode" value is a sentinel that is sometimes used
260255
// when generating a dump for a process that hasn't crashed.
@@ -271,12 +266,12 @@ void ProcessMinidump::RefreshStateAfterStop() {
271266
lldb::StopInfoSP stop_info;
272267
lldb::ThreadSP stop_thread;
273268

274-
Process::m_thread_list.SetSelectedThreadByID(exception_stream->ThreadId);
269+
Process::m_thread_list.SetSelectedThreadByID(exception_stream.ThreadId);
275270
stop_thread = Process::m_thread_list.GetSelectedThread();
276271
ArchSpec arch = GetArchitecture();
277272

278273
if (arch.GetTriple().getOS() == llvm::Triple::Linux) {
279-
uint32_t signo = exception_stream->ExceptionRecord.ExceptionCode;
274+
uint32_t signo = exception_stream.ExceptionRecord.ExceptionCode;
280275
if (signo == 0) {
281276
// No stop.
282277
return;
@@ -285,18 +280,18 @@ void ProcessMinidump::RefreshStateAfterStop() {
285280
stop_info = StopInfo::CreateStopReasonWithSignal(*stop_thread, signo);
286281
} else if (arch.GetTriple().getVendor() == llvm::Triple::Apple) {
287282
stop_info = StopInfoMachException::CreateStopReasonWithMachException(
288-
*stop_thread, exception_stream->ExceptionRecord.ExceptionCode, 2,
289-
exception_stream->ExceptionRecord.ExceptionFlags,
290-
exception_stream->ExceptionRecord.ExceptionAddress, 0);
283+
*stop_thread, exception_stream.ExceptionRecord.ExceptionCode, 2,
284+
exception_stream.ExceptionRecord.ExceptionFlags,
285+
exception_stream.ExceptionRecord.ExceptionAddress, 0);
291286
} else {
292287
std::string desc;
293288
llvm::raw_string_ostream desc_stream(desc);
294289
desc_stream << "Exception "
295290
<< llvm::format_hex(
296-
exception_stream->ExceptionRecord.ExceptionCode, 8)
291+
exception_stream.ExceptionRecord.ExceptionCode, 8)
297292
<< " encountered at address "
298293
<< llvm::format_hex(
299-
exception_stream->ExceptionRecord.ExceptionAddress, 8);
294+
exception_stream.ExceptionRecord.ExceptionAddress, 8);
300295
stop_info = StopInfo::CreateStopReasonWithException(
301296
*stop_thread, desc_stream.str().c_str());
302297
}
@@ -405,7 +400,7 @@ bool ProcessMinidump::DoUpdateThreadList(ThreadList &old_thread_list,
405400

406401
// If the minidump contains an exception context, use it
407402
if (m_exceptions_by_tid.count(thread.ThreadId) > 0)
408-
context_location = m_exceptions_by_tid[thread.ThreadId]->ThreadContext;
403+
context_location = m_exceptions_by_tid[thread.ThreadId].ThreadContext;
409404

410405
llvm::ArrayRef<uint8_t> context;
411406
if (!m_is_wow64)

lldb/source/Plugins/Process/minidump/ProcessMinidump.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class ProcessMinidump : public PostMortemProcess {
107107
private:
108108
lldb::DataBufferSP m_core_data;
109109
llvm::ArrayRef<minidump::Thread> m_thread_list;
110-
std::unordered_map<uint32_t, const minidump::ExceptionStream *>
110+
std::unordered_map<uint32_t, const minidump::ExceptionStream>
111111
m_exceptions_by_tid;
112112
lldb::CommandObjectSP m_command_sp;
113113
bool m_is_wow64;

0 commit comments

Comments
 (0)