[Target] Generalize some behavior in Thread

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
This commit is contained in:
Alex Langford 2019-05-15 01:46:45 +00:00
parent 658cad1287
commit bd3adfe5e3
3 changed files with 27 additions and 16 deletions

View File

@ -196,11 +196,12 @@ class ObjCExceptionsTestCase(TestBase):
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())

View File

@ -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(

View File

@ -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();
}