Skip to content

Commit

Permalink
[Target] Generalize some behavior in Thread
Browse files Browse the repository at this point in the history
Summary:
I don't think there's a good reason for this behavior to be considered
ObjC-specific. We can generalize this.

Differential Revision: https://reviews.llvm.org/D61776

llvm-svn: 360741
  • Loading branch information
bulbazord committed May 15, 2019
1 parent 658cad1 commit bd3adfe
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 16 deletions.
Expand Up @@ -196,11 +196,12 @@ def test_cxx_exceptions_at_abort(self):
self.expect("thread list",
substrs=['stopped', 'stop reason = signal SIGABRT'])

self.expect('thread exception', substrs=[])
self.expect('thread exception', substrs=['exception ='])

process = self.dbg.GetSelectedTarget().process
thread = process.GetSelectedThread()

# C++ exceptions are not exposed in the API (yet).
self.assertFalse(thread.GetCurrentException().IsValid())
self.assertTrue(thread.GetCurrentException().IsValid())

# C++ exception backtraces are not exposed in the API (yet).
self.assertFalse(thread.GetCurrentExceptionBacktrace().IsValid())
Expand Up @@ -594,6 +594,10 @@ ValueObjectSP ItaniumABILanguageRuntime::GetExceptionObjectForThread(
addr_t exception_addr =
m_process->ReadPointerFromMemory(result_ptr - ptr_size, error);

if (!error.Success()) {
return ValueObjectSP();
}

lldb_private::formatters::InferiorSizedWord exception_isw(exception_addr,
*m_process);
ValueObjectSP exception = ValueObject::CreateValueObjectFromData(
Expand Down
32 changes: 19 additions & 13 deletions lldb/source/Target/Thread.cpp
Expand Up @@ -2209,25 +2209,31 @@ ValueObjectSP Thread::GetCurrentException() {
if (auto e = recognized_frame->GetExceptionObject())
return e;

// FIXME: For now, only ObjC exceptions are supported. This should really
// iterate over all language runtimes and ask them all to give us the current
// exception.
if (auto runtime = GetProcess()->GetObjCLanguageRuntime())
if (auto e = runtime->GetExceptionObjectForThread(shared_from_this()))
return e;
// NOTE: Even though this behavior is generalized, only ObjC is actually
// supported at the moment.
for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes; lang++) {
if (auto runtime = GetProcess()->GetLanguageRuntime(
static_cast<lldb::LanguageType>(lang)))
if (auto e = runtime->GetExceptionObjectForThread(shared_from_this()))
return e;
}

return ValueObjectSP();
}

ThreadSP Thread::GetCurrentExceptionBacktrace() {
ValueObjectSP exception = GetCurrentException();
if (!exception) return ThreadSP();
if (!exception)
return ThreadSP();

// FIXME: For now, only ObjC exceptions are supported. This should really
// iterate over all language runtimes and ask them all to give us the current
// exception.
auto runtime = GetProcess()->GetObjCLanguageRuntime();
if (!runtime) return ThreadSP();
// NOTE: Even though this behavior is generalized, only ObjC is actually
// supported at the moment.
for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes; lang++) {
if (auto runtime = GetProcess()->GetLanguageRuntime(
static_cast<lldb::LanguageType>(lang)))
if (auto bt = runtime->GetBacktraceThreadFromException(exception))
return bt;
}

return runtime->GetBacktraceThreadFromException(exception);
return ThreadSP();
}

0 comments on commit bd3adfe

Please sign in to comment.