diff options
Diffstat (limited to 'source/API/SBThread.cpp')
-rw-r--r-- | source/API/SBThread.cpp | 2579 |
1 files changed, 1159 insertions, 1420 deletions
diff --git a/source/API/SBThread.cpp b/source/API/SBThread.cpp index 47cf80ef29ce..fbde6dd32686 100644 --- a/source/API/SBThread.cpp +++ b/source/API/SBThread.cpp @@ -9,9 +9,9 @@ #include "lldb/API/SBThread.h" -#include "lldb/API/SBSymbolContext.h" #include "lldb/API/SBFileSpec.h" #include "lldb/API/SBStream.h" +#include "lldb/API/SBSymbolContext.h" #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/State.h" @@ -20,20 +20,20 @@ #include "lldb/Core/StructuredData.h" #include "lldb/Core/ValueObject.h" #include "lldb/Interpreter/CommandInterpreter.h" -#include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/CompileUnit.h" -#include "lldb/Target/SystemRuntime.h" -#include "lldb/Target/Thread.h" +#include "lldb/Symbol/SymbolContext.h" #include "lldb/Target/Process.h" #include "lldb/Target/Queue.h" -#include "lldb/Target/UnixSignals.h" #include "lldb/Target/StopInfo.h" +#include "lldb/Target/SystemRuntime.h" #include "lldb/Target/Target.h" +#include "lldb/Target/Thread.h" #include "lldb/Target/ThreadPlan.h" +#include "lldb/Target/ThreadPlanStepInRange.h" #include "lldb/Target/ThreadPlanStepInstruction.h" #include "lldb/Target/ThreadPlanStepOut.h" #include "lldb/Target/ThreadPlanStepRange.h" -#include "lldb/Target/ThreadPlanStepInRange.h" +#include "lldb/Target/UnixSignals.h" #include "lldb/API/SBAddress.h" #include "lldb/API/SBDebugger.h" @@ -47,1658 +47,1397 @@ using namespace lldb; using namespace lldb_private; -const char * -SBThread::GetBroadcasterClassName () -{ - return Thread::GetStaticBroadcasterClass().AsCString(); +const char *SBThread::GetBroadcasterClassName() { + return Thread::GetStaticBroadcasterClass().AsCString(); } //---------------------------------------------------------------------- // Constructors //---------------------------------------------------------------------- -SBThread::SBThread () : - m_opaque_sp (new ExecutionContextRef()) -{ -} +SBThread::SBThread() : m_opaque_sp(new ExecutionContextRef()) {} -SBThread::SBThread (const ThreadSP& lldb_object_sp) : - m_opaque_sp (new ExecutionContextRef(lldb_object_sp)) -{ -} +SBThread::SBThread(const ThreadSP &lldb_object_sp) + : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {} -SBThread::SBThread (const SBThread &rhs) : - m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp)) -{ - -} +SBThread::SBThread(const SBThread &rhs) + : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {} //---------------------------------------------------------------------- // Assignment operator //---------------------------------------------------------------------- -const lldb::SBThread & -SBThread::operator = (const SBThread &rhs) -{ - if (this != &rhs) - *m_opaque_sp = *rhs.m_opaque_sp; - return *this; +const lldb::SBThread &SBThread::operator=(const SBThread &rhs) { + if (this != &rhs) + *m_opaque_sp = *rhs.m_opaque_sp; + return *this; } //---------------------------------------------------------------------- // Destructor //---------------------------------------------------------------------- -SBThread::~SBThread() -{ -} - -lldb::SBQueue -SBThread::GetQueue () const -{ - SBQueue sb_queue; - QueueSP queue_sp; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - queue_sp = exe_ctx.GetThreadPtr()->GetQueue(); - if (queue_sp) - { - sb_queue.SetQueue (queue_sp); - } - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetQueue() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +SBThread::~SBThread() {} + +lldb::SBQueue SBThread::GetQueue() const { + SBQueue sb_queue; + QueueSP queue_sp; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + queue_sp = exe_ctx.GetThreadPtr()->GetQueue(); + if (queue_sp) { + sb_queue.SetQueue(queue_sp); + } + } else { + if (log) + log->Printf("SBThread(%p)::GetQueue() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetQueue () => SBQueue(%p)", - static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get())); - - return sb_queue; -} - - -bool -SBThread::IsValid() const -{ - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + if (log) + log->Printf("SBThread(%p)::GetQueue () => SBQueue(%p)", + static_cast<void *>(exe_ctx.GetThreadPtr()), + static_cast<void *>(queue_sp.get())); - Target *target = exe_ctx.GetTargetPtr(); - Process *process = exe_ctx.GetProcessPtr(); - if (target && process) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&process->GetRunLock())) - return m_opaque_sp->GetThreadSP().get() != NULL; - } - // Without a valid target & process, this thread can't be valid. - return false; + return sb_queue; } -void -SBThread::Clear () -{ - m_opaque_sp->Clear(); +bool SBThread::IsValid() const { + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + Target *target = exe_ctx.GetTargetPtr(); + Process *process = exe_ctx.GetProcessPtr(); + if (target && process) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&process->GetRunLock())) + return m_opaque_sp->GetThreadSP().get() != NULL; + } + // Without a valid target & process, this thread can't be valid. + return false; } +void SBThread::Clear() { m_opaque_sp->Clear(); } -StopReason -SBThread::GetStopReason() -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +StopReason SBThread::GetStopReason() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - StopReason reason = eStopReasonInvalid; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + StopReason reason = eStopReasonInvalid; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - return exe_ctx.GetThreadPtr()->GetStopReason(); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetStopReason() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + return exe_ctx.GetThreadPtr()->GetStopReason(); + } else { + if (log) + log->Printf( + "SBThread(%p)::GetStopReason() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetStopReason () => %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - Thread::StopReasonAsCString (reason)); + if (log) + log->Printf("SBThread(%p)::GetStopReason () => %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + Thread::StopReasonAsCString(reason)); - return reason; + return reason; } -size_t -SBThread::GetStopReasonDataCount () -{ - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); - if (stop_info_sp) - { - StopReason reason = stop_info_sp->GetStopReason(); - switch (reason) - { - case eStopReasonInvalid: - case eStopReasonNone: - case eStopReasonTrace: - case eStopReasonExec: - case eStopReasonPlanComplete: - case eStopReasonThreadExiting: - case eStopReasonInstrumentation: - // There is no data for these stop reasons. - return 0; - - case eStopReasonBreakpoint: - { - break_id_t site_id = stop_info_sp->GetValue(); - lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); - if (bp_site_sp) - return bp_site_sp->GetNumberOfOwners () * 2; - else - return 0; // Breakpoint must have cleared itself... - } - break; - - case eStopReasonWatchpoint: - return 1; - - case eStopReasonSignal: - return 1; - - case eStopReasonException: - return 1; - } - } - } - else - { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - if (log) - log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); +size_t SBThread::GetStopReasonDataCount() { + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); + if (stop_info_sp) { + StopReason reason = stop_info_sp->GetStopReason(); + switch (reason) { + case eStopReasonInvalid: + case eStopReasonNone: + case eStopReasonTrace: + case eStopReasonExec: + case eStopReasonPlanComplete: + case eStopReasonThreadExiting: + case eStopReasonInstrumentation: + // There is no data for these stop reasons. + return 0; + + case eStopReasonBreakpoint: { + break_id_t site_id = stop_info_sp->GetValue(); + lldb::BreakpointSiteSP bp_site_sp( + exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID( + site_id)); + if (bp_site_sp) + return bp_site_sp->GetNumberOfOwners() * 2; + else + return 0; // Breakpoint must have cleared itself... + } break; + + case eStopReasonWatchpoint: + return 1; + + case eStopReasonSignal: + return 1; + + case eStopReasonException: + return 1; } + } + } else { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (log) + log->Printf("SBThread(%p)::GetStopReasonDataCount() => error: process " + "is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } - return 0; + } + return 0; } -uint64_t -SBThread::GetStopReasonDataAtIndex (uint32_t idx) -{ - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - Thread *thread = exe_ctx.GetThreadPtr(); - StopInfoSP stop_info_sp = thread->GetStopInfo (); - if (stop_info_sp) - { - StopReason reason = stop_info_sp->GetStopReason(); - switch (reason) - { - case eStopReasonInvalid: - case eStopReasonNone: - case eStopReasonTrace: - case eStopReasonExec: - case eStopReasonPlanComplete: - case eStopReasonThreadExiting: - case eStopReasonInstrumentation: - // There is no data for these stop reasons. - return 0; - - case eStopReasonBreakpoint: - { - break_id_t site_id = stop_info_sp->GetValue(); - lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); - if (bp_site_sp) - { - uint32_t bp_index = idx / 2; - BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index)); - if (bp_loc_sp) - { - if (idx & 1) - { - // Odd idx, return the breakpoint location ID - return bp_loc_sp->GetID(); - } - else - { - // Even idx, return the breakpoint ID - return bp_loc_sp->GetBreakpoint().GetID(); - } - } - } - return LLDB_INVALID_BREAK_ID; - } - break; - - case eStopReasonWatchpoint: - return stop_info_sp->GetValue(); - - case eStopReasonSignal: - return stop_info_sp->GetValue(); - - case eStopReasonException: - return stop_info_sp->GetValue(); - } +uint64_t SBThread::GetStopReasonDataAtIndex(uint32_t idx) { + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + Thread *thread = exe_ctx.GetThreadPtr(); + StopInfoSP stop_info_sp = thread->GetStopInfo(); + if (stop_info_sp) { + StopReason reason = stop_info_sp->GetStopReason(); + switch (reason) { + case eStopReasonInvalid: + case eStopReasonNone: + case eStopReasonTrace: + case eStopReasonExec: + case eStopReasonPlanComplete: + case eStopReasonThreadExiting: + case eStopReasonInstrumentation: + // There is no data for these stop reasons. + return 0; + + case eStopReasonBreakpoint: { + break_id_t site_id = stop_info_sp->GetValue(); + lldb::BreakpointSiteSP bp_site_sp( + exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID( + site_id)); + if (bp_site_sp) { + uint32_t bp_index = idx / 2; + BreakpointLocationSP bp_loc_sp( + bp_site_sp->GetOwnerAtIndex(bp_index)); + if (bp_loc_sp) { + if (idx & 1) { + // Odd idx, return the breakpoint location ID + return bp_loc_sp->GetID(); + } else { + // Even idx, return the breakpoint ID + return bp_loc_sp->GetBreakpoint().GetID(); + } } + } + return LLDB_INVALID_BREAK_ID; + } break; + + case eStopReasonWatchpoint: + return stop_info_sp->GetValue(); + + case eStopReasonSignal: + return stop_info_sp->GetValue(); + + case eStopReasonException: + return stop_info_sp->GetValue(); } - else - { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - if (log) - log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } + } + } else { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (log) + log->Printf("SBThread(%p)::GetStopReasonDataAtIndex() => error: " + "process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } - return 0; + } + return 0; } -bool -SBThread::GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream) -{ - Stream &strm = stream.ref(); - - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (! exe_ctx.HasThreadScope()) - return false; - - - StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); - StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); - if (! info) - return false; - - info->Dump(strm); - - return true; +bool SBThread::GetStopReasonExtendedInfoAsJSON(lldb::SBStream &stream) { + Stream &strm = stream.ref(); + + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (!exe_ctx.HasThreadScope()) + return false; + + StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); + StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); + if (!info) + return false; + + info->Dump(strm); + + return true; } SBThreadCollection -SBThread::GetStopReasonExtendedBacktraces (InstrumentationRuntimeType type) -{ - ThreadCollectionSP threads; - threads.reset(new ThreadCollection()); - - // We currently only support ThreadSanitizer. - if (type != eInstrumentationRuntimeTypeThreadSanitizer) - return threads; - - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (! exe_ctx.HasThreadScope()) - return threads; - - ProcessSP process_sp = exe_ctx.GetProcessSP(); - - StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); - StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); - if (! info) - return threads; - - return process_sp->GetInstrumentationRuntime(type)->GetBacktracesFromExtendedStopInfo(info); +SBThread::GetStopReasonExtendedBacktraces(InstrumentationRuntimeType type) { + ThreadCollectionSP threads; + threads.reset(new ThreadCollection()); + + // We currently only support ThreadSanitizer. + if (type != eInstrumentationRuntimeTypeThreadSanitizer) + return threads; + + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (!exe_ctx.HasThreadScope()) + return threads; + + ProcessSP process_sp = exe_ctx.GetProcessSP(); + + StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); + StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); + if (!info) + return threads; + + return process_sp->GetInstrumentationRuntime(type) + ->GetBacktracesFromExtendedStopInfo(info); } -size_t -SBThread::GetStopDescription (char *dst, size_t dst_len) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - - StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); - if (stop_info_sp) - { - const char *stop_desc = stop_info_sp->GetDescription(); - if (stop_desc) - { - if (log) - log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"", - static_cast<void*>(exe_ctx.GetThreadPtr()), - stop_desc); - if (dst) - return ::snprintf (dst, dst_len, "%s", stop_desc); - else - { - // NULL dst passed in, return the length needed to contain the description - return ::strlen (stop_desc) + 1; // Include the NULL byte for size - } - } - else - { - size_t stop_desc_len = 0; - switch (stop_info_sp->GetStopReason()) - { - case eStopReasonTrace: - case eStopReasonPlanComplete: - { - static char trace_desc[] = "step"; - stop_desc = trace_desc; - stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size - } - break; - - case eStopReasonBreakpoint: - { - static char bp_desc[] = "breakpoint hit"; - stop_desc = bp_desc; - stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size - } - break; - - case eStopReasonWatchpoint: - { - static char wp_desc[] = "watchpoint hit"; - stop_desc = wp_desc; - stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size - } - break; - - case eStopReasonSignal: - { - stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString(stop_info_sp->GetValue()); - if (stop_desc == NULL || stop_desc[0] == '\0') - { - static char signal_desc[] = "signal"; - stop_desc = signal_desc; - stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size - } - } - break; - - case eStopReasonException: - { - char exc_desc[] = "exception"; - stop_desc = exc_desc; - stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size - } - break; - - case eStopReasonExec: - { - char exc_desc[] = "exec"; - stop_desc = exc_desc; - stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size - } - break; - - case eStopReasonThreadExiting: - { - char limbo_desc[] = "thread exiting"; - stop_desc = limbo_desc; - stop_desc_len = sizeof(limbo_desc); - } - break; - default: - break; - } - - if (stop_desc && stop_desc[0]) - { - if (log) - log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'", - static_cast<void*>(exe_ctx.GetThreadPtr()), - stop_desc); - - if (dst) - return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte - - if (stop_desc_len == 0) - stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte - - return stop_desc_len; - } - } +size_t SBThread::GetStopDescription(char *dst, size_t dst_len) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + + StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); + if (stop_info_sp) { + const char *stop_desc = stop_info_sp->GetDescription(); + if (stop_desc) { + if (log) + log->Printf( + "SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"", + static_cast<void *>(exe_ctx.GetThreadPtr()), stop_desc); + if (dst) + return ::snprintf(dst, dst_len, "%s", stop_desc); + else { + // NULL dst passed in, return the length needed to contain the + // description + return ::strlen(stop_desc) + 1; // Include the NULL byte for size + } + } else { + size_t stop_desc_len = 0; + switch (stop_info_sp->GetStopReason()) { + case eStopReasonTrace: + case eStopReasonPlanComplete: { + static char trace_desc[] = "step"; + stop_desc = trace_desc; + stop_desc_len = + sizeof(trace_desc); // Include the NULL byte for size + } break; + + case eStopReasonBreakpoint: { + static char bp_desc[] = "breakpoint hit"; + stop_desc = bp_desc; + stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size + } break; + + case eStopReasonWatchpoint: { + static char wp_desc[] = "watchpoint hit"; + stop_desc = wp_desc; + stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size + } break; + + case eStopReasonSignal: { + stop_desc = + exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString( + stop_info_sp->GetValue()); + if (stop_desc == NULL || stop_desc[0] == '\0') { + static char signal_desc[] = "signal"; + stop_desc = signal_desc; + stop_desc_len = + sizeof(signal_desc); // Include the NULL byte for size } - } - else - { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + } break; + + case eStopReasonException: { + char exc_desc[] = "exception"; + stop_desc = exc_desc; + stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size + } break; + + case eStopReasonExec: { + char exc_desc[] = "exec"; + stop_desc = exc_desc; + stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size + } break; + + case eStopReasonThreadExiting: { + char limbo_desc[] = "thread exiting"; + stop_desc = limbo_desc; + stop_desc_len = sizeof(limbo_desc); + } break; + default: + break; + } + + if (stop_desc && stop_desc[0]) { if (log) - log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); + log->Printf( + "SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'", + static_cast<void *>(exe_ctx.GetThreadPtr()), stop_desc); + + if (dst) + return ::snprintf(dst, dst_len, "%s", stop_desc) + + 1; // Include the NULL byte + + if (stop_desc_len == 0) + stop_desc_len = ::strlen(stop_desc) + 1; // Include the NULL byte + + return stop_desc_len; + } } + } + } else { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (log) + log->Printf( + "SBThread(%p)::GetStopDescription() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } - if (dst) - *dst = 0; - return 0; + } + if (dst) + *dst = 0; + return 0; } -SBValue -SBThread::GetStopReturnValue () -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - ValueObjectSP return_valobj_sp; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); - if (stop_info_sp) - { - return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); - } - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +SBValue SBThread::GetStopReturnValue() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + ValueObjectSP return_valobj_sp; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); + if (stop_info_sp) { + return_valobj_sp = StopInfo::GetReturnValueObject(stop_info_sp); + } + } else { + if (log) + log->Printf( + "SBThread(%p)::GetStopReturnValue() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - return_valobj_sp.get() - ? return_valobj_sp->GetValueAsCString() - : "<no return value>"); + if (log) + log->Printf("SBThread(%p)::GetStopReturnValue () => %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + return_valobj_sp.get() ? return_valobj_sp->GetValueAsCString() + : "<no return value>"); - return SBValue (return_valobj_sp); + return SBValue(return_valobj_sp); } -void -SBThread::SetThread (const ThreadSP& lldb_object_sp) -{ - m_opaque_sp->SetThreadSP (lldb_object_sp); +void SBThread::SetThread(const ThreadSP &lldb_object_sp) { + m_opaque_sp->SetThreadSP(lldb_object_sp); } -lldb::tid_t -SBThread::GetThreadID () const -{ - ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); - if (thread_sp) - return thread_sp->GetID(); - return LLDB_INVALID_THREAD_ID; +lldb::tid_t SBThread::GetThreadID() const { + ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); + if (thread_sp) + return thread_sp->GetID(); + return LLDB_INVALID_THREAD_ID; } -uint32_t -SBThread::GetIndexID () const -{ - ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); - if (thread_sp) - return thread_sp->GetIndexID(); - return LLDB_INVALID_INDEX32; +uint32_t SBThread::GetIndexID() const { + ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); + if (thread_sp) + return thread_sp->GetIndexID(); + return LLDB_INVALID_INDEX32; } -const char * -SBThread::GetName () const -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - const char *name = NULL; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - name = exe_ctx.GetThreadPtr()->GetName(); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetName() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +const char *SBThread::GetName() const { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + const char *name = NULL; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + name = exe_ctx.GetThreadPtr()->GetName(); + } else { + if (log) + log->Printf("SBThread(%p)::GetName() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetName () => %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - name ? name : "NULL"); + if (log) + log->Printf("SBThread(%p)::GetName () => %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + name ? name : "NULL"); - return name; + return name; } -const char * -SBThread::GetQueueName () const -{ - const char *name = NULL; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - name = exe_ctx.GetThreadPtr()->GetQueueName(); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +const char *SBThread::GetQueueName() const { + const char *name = NULL; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + name = exe_ctx.GetThreadPtr()->GetQueueName(); + } else { + if (log) + log->Printf("SBThread(%p)::GetQueueName() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetQueueName () => %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - name ? name : "NULL"); + if (log) + log->Printf("SBThread(%p)::GetQueueName () => %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + name ? name : "NULL"); - return name; + return name; } -lldb::queue_id_t -SBThread::GetQueueID () const -{ - queue_id_t id = LLDB_INVALID_QUEUE_ID; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - id = exe_ctx.GetThreadPtr()->GetQueueID(); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetQueueID() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +lldb::queue_id_t SBThread::GetQueueID() const { + queue_id_t id = LLDB_INVALID_QUEUE_ID; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + id = exe_ctx.GetThreadPtr()->GetQueueID(); + } else { + if (log) + log->Printf("SBThread(%p)::GetQueueID() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64, - static_cast<void*>(exe_ctx.GetThreadPtr()), id); + if (log) + log->Printf("SBThread(%p)::GetQueueID () => 0x%" PRIx64, + static_cast<void *>(exe_ctx.GetThreadPtr()), id); - return id; + return id; } -bool -SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - bool success = false; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - Thread *thread = exe_ctx.GetThreadPtr(); - StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo(); - if (info_root_sp) - { - StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path); - if (node) - { - if (node->GetType() == StructuredData::Type::eTypeString) - { - strm.Printf ("%s", node->GetAsString()->GetValue().c_str()); - success = true; - } - if (node->GetType() == StructuredData::Type::eTypeInteger) - { - strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue()); - success = true; - } - if (node->GetType() == StructuredData::Type::eTypeFloat) - { - strm.Printf ("0x%f", node->GetAsFloat()->GetValue()); - success = true; - } - if (node->GetType() == StructuredData::Type::eTypeBoolean) - { - if (node->GetAsBoolean()->GetValue() == true) - strm.Printf ("true"); - else - strm.Printf ("false"); - success = true; - } - if (node->GetType() == StructuredData::Type::eTypeNull) - { - strm.Printf ("null"); - success = true; - } - } - } - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); +bool SBThread::GetInfoItemByPathAsString(const char *path, SBStream &strm) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + bool success = false; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + Thread *thread = exe_ctx.GetThreadPtr(); + StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo(); + if (info_root_sp) { + StructuredData::ObjectSP node = + info_root_sp->GetObjectForDotSeparatedPath(path); + if (node) { + if (node->GetType() == StructuredData::Type::eTypeString) { + strm.Printf("%s", node->GetAsString()->GetValue().c_str()); + success = true; + } + if (node->GetType() == StructuredData::Type::eTypeInteger) { + strm.Printf("0x%" PRIx64, node->GetAsInteger()->GetValue()); + success = true; + } + if (node->GetType() == StructuredData::Type::eTypeFloat) { + strm.Printf("0x%f", node->GetAsFloat()->GetValue()); + success = true; + } + if (node->GetType() == StructuredData::Type::eTypeBoolean) { + if (node->GetAsBoolean()->GetValue() == true) + strm.Printf("true"); + else + strm.Printf("false"); + success = true; + } + if (node->GetType() == StructuredData::Type::eTypeNull) { + strm.Printf("null"); + success = true; + } } + } + } else { + if (log) + log->Printf("SBThread(%p)::GetInfoItemByPathAsString() => error: " + "process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - strm.GetData()); + if (log) + log->Printf("SBThread(%p)::GetInfoItemByPathAsString () => %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), strm.GetData()); - return success; + return success; } +SBError SBThread::ResumeNewPlan(ExecutionContext &exe_ctx, + ThreadPlan *new_plan) { + SBError sb_error; -SBError -SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan) -{ - SBError sb_error; - - Process *process = exe_ctx.GetProcessPtr(); - if (!process) - { - sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); - return sb_error; - } + Process *process = exe_ctx.GetProcessPtr(); + if (!process) { + sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); + return sb_error; + } - Thread *thread = exe_ctx.GetThreadPtr(); - if (!thread) - { - sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); - return sb_error; - } - - // User level plans should be Master Plans so they can be interrupted, other plans executed, and - // then a "continue" will resume the plan. - if (new_plan != NULL) - { - new_plan->SetIsMasterPlan(true); - new_plan->SetOkayToDiscard(false); - } - - // Why do we need to set the current thread by ID here??? - process->GetThreadList().SetSelectedThreadByID (thread->GetID()); - - if (process->GetTarget().GetDebugger().GetAsyncExecution ()) - sb_error.ref() = process->Resume (); - else - sb_error.ref() = process->ResumeSynchronous (NULL); - + Thread *thread = exe_ctx.GetThreadPtr(); + if (!thread) { + sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); return sb_error; + } + + // User level plans should be Master Plans so they can be interrupted, other + // plans executed, and + // then a "continue" will resume the plan. + if (new_plan != NULL) { + new_plan->SetIsMasterPlan(true); + new_plan->SetOkayToDiscard(false); + } + + // Why do we need to set the current thread by ID here??? + process->GetThreadList().SetSelectedThreadByID(thread->GetID()); + + if (process->GetTarget().GetDebugger().GetAsyncExecution()) + sb_error.ref() = process->Resume(); + else + sb_error.ref() = process->ResumeSynchronous(NULL); + + return sb_error; } -void -SBThread::StepOver (lldb::RunMode stop_other_threads) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +void SBThread::StepOver(lldb::RunMode stop_other_threads) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", - static_cast<void*>(exe_ctx.GetThreadPtr()), - Thread::RunModeAsCString (stop_other_threads)); - - if (exe_ctx.HasThreadScope()) - { - Thread *thread = exe_ctx.GetThreadPtr(); - bool abort_other_plans = false; - StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); - - ThreadPlanSP new_plan_sp; - if (frame_sp) - { - if (frame_sp->HasDebugInformation ()) - { - const LazyBool avoid_no_debug = eLazyBoolCalculate; - SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); - new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans, - sc.line_entry, - sc, - stop_other_threads, - avoid_no_debug); - } - else - { - new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true, - abort_other_plans, - stop_other_threads); - } - } + if (log) + log->Printf("SBThread(%p)::StepOver (stop_other_threads='%s')", + static_cast<void *>(exe_ctx.GetThreadPtr()), + Thread::RunModeAsCString(stop_other_threads)); - // This returns an error, we should use it! - ResumeNewPlan (exe_ctx, new_plan_sp.get()); + if (exe_ctx.HasThreadScope()) { + Thread *thread = exe_ctx.GetThreadPtr(); + bool abort_other_plans = false; + StackFrameSP frame_sp(thread->GetStackFrameAtIndex(0)); + + ThreadPlanSP new_plan_sp; + if (frame_sp) { + if (frame_sp->HasDebugInformation()) { + const LazyBool avoid_no_debug = eLazyBoolCalculate; + SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); + new_plan_sp = thread->QueueThreadPlanForStepOverRange( + abort_other_plans, sc.line_entry, sc, stop_other_threads, + avoid_no_debug); + } else { + new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction( + true, abort_other_plans, stop_other_threads); + } } + + // This returns an error, we should use it! + ResumeNewPlan(exe_ctx, new_plan_sp.get()); + } } -void -SBThread::StepInto (lldb::RunMode stop_other_threads) -{ - StepInto (NULL, stop_other_threads); +void SBThread::StepInto(lldb::RunMode stop_other_threads) { + StepInto(NULL, stop_other_threads); } -void -SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads) -{ - SBError error; - StepInto(target_name, LLDB_INVALID_LINE_NUMBER, error, stop_other_threads); +void SBThread::StepInto(const char *target_name, + lldb::RunMode stop_other_threads) { + SBError error; + StepInto(target_name, LLDB_INVALID_LINE_NUMBER, error, stop_other_threads); } -void -SBThread::StepInto (const char *target_name, uint32_t end_line, SBError &error, lldb::RunMode stop_other_threads) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +void SBThread::StepInto(const char *target_name, uint32_t end_line, + SBError &error, lldb::RunMode stop_other_threads) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')", - static_cast<void*>(exe_ctx.GetThreadPtr()), - target_name? target_name: "<NULL>", - Thread::RunModeAsCString (stop_other_threads)); - - if (exe_ctx.HasThreadScope()) - { - bool abort_other_plans = false; - - Thread *thread = exe_ctx.GetThreadPtr(); - StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); - ThreadPlanSP new_plan_sp; - - if (frame_sp && frame_sp->HasDebugInformation ()) - { - SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); - AddressRange range; - if (end_line == LLDB_INVALID_LINE_NUMBER) - range = sc.line_entry.range; - else - { - if (!sc.GetAddressRangeFromHereToEndLine(end_line, range, error.ref())) - return; - } - - const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate; - const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate; - new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans, - range, - sc, - target_name, - stop_other_threads, - step_in_avoids_code_without_debug_info, - step_out_avoids_code_without_debug_info); - } - else - { - new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false, - abort_other_plans, - stop_other_threads); - } + if (log) + log->Printf( + "SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')", + static_cast<void *>(exe_ctx.GetThreadPtr()), + target_name ? target_name : "<NULL>", + Thread::RunModeAsCString(stop_other_threads)); + + if (exe_ctx.HasThreadScope()) { + bool abort_other_plans = false; - error = ResumeNewPlan (exe_ctx, new_plan_sp.get()); + Thread *thread = exe_ctx.GetThreadPtr(); + StackFrameSP frame_sp(thread->GetStackFrameAtIndex(0)); + ThreadPlanSP new_plan_sp; + + if (frame_sp && frame_sp->HasDebugInformation()) { + SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); + AddressRange range; + if (end_line == LLDB_INVALID_LINE_NUMBER) + range = sc.line_entry.range; + else { + if (!sc.GetAddressRangeFromHereToEndLine(end_line, range, error.ref())) + return; + } + + const LazyBool step_out_avoids_code_without_debug_info = + eLazyBoolCalculate; + const LazyBool step_in_avoids_code_without_debug_info = + eLazyBoolCalculate; + new_plan_sp = thread->QueueThreadPlanForStepInRange( + abort_other_plans, range, sc, target_name, stop_other_threads, + step_in_avoids_code_without_debug_info, + step_out_avoids_code_without_debug_info); + } else { + new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction( + false, abort_other_plans, stop_other_threads); } + + error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); + } } -void -SBThread::StepOut () -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +void SBThread::StepOut() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::StepOut ()", - static_cast<void*>(exe_ctx.GetThreadPtr())); + if (log) + log->Printf("SBThread(%p)::StepOut ()", + static_cast<void *>(exe_ctx.GetThreadPtr())); - if (exe_ctx.HasThreadScope()) - { - bool abort_other_plans = false; - bool stop_other_threads = false; + if (exe_ctx.HasThreadScope()) { + bool abort_other_plans = false; + bool stop_other_threads = false; - Thread *thread = exe_ctx.GetThreadPtr(); + Thread *thread = exe_ctx.GetThreadPtr(); - const LazyBool avoid_no_debug = eLazyBoolCalculate; - ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans, - NULL, - false, - stop_other_threads, - eVoteYes, - eVoteNoOpinion, - 0, - avoid_no_debug)); - - // This returns an error, we should use it! - ResumeNewPlan (exe_ctx, new_plan_sp.get()); - } + const LazyBool avoid_no_debug = eLazyBoolCalculate; + ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut( + abort_other_plans, NULL, false, stop_other_threads, eVoteYes, + eVoteNoOpinion, 0, avoid_no_debug)); + + // This returns an error, we should use it! + ResumeNewPlan(exe_ctx, new_plan_sp.get()); + } } -void -SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +void SBThread::StepOutOfFrame(lldb::SBFrame &sb_frame) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (!sb_frame.IsValid()) - { - if (log) - log->Printf("SBThread(%p)::StepOutOfFrame passed an invalid frame, returning.", - static_cast<void*>(exe_ctx.GetThreadPtr())); - return; - } - - StackFrameSP frame_sp (sb_frame.GetFrameSP()); + if (!sb_frame.IsValid()) { if (log) - { - SBStream frame_desc_strm; - sb_frame.GetDescription (frame_desc_strm); - log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", - static_cast<void*>(exe_ctx.GetThreadPtr()), - static_cast<void*>(frame_sp.get()), - frame_desc_strm.GetData()); + log->Printf( + "SBThread(%p)::StepOutOfFrame passed an invalid frame, returning.", + static_cast<void *>(exe_ctx.GetThreadPtr())); + return; + } + + StackFrameSP frame_sp(sb_frame.GetFrameSP()); + if (log) { + SBStream frame_desc_strm; + sb_frame.GetDescription(frame_desc_strm); + log->Printf("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", + static_cast<void *>(exe_ctx.GetThreadPtr()), + static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); + } + + if (exe_ctx.HasThreadScope()) { + bool abort_other_plans = false; + bool stop_other_threads = false; + Thread *thread = exe_ctx.GetThreadPtr(); + if (sb_frame.GetThread().GetThreadID() != thread->GetID()) { + log->Printf("SBThread(%p)::StepOutOfFrame passed a frame from another " + "thread (0x%" PRIx64 " vrs. 0x%" PRIx64 ", returning.", + static_cast<void *>(exe_ctx.GetThreadPtr()), + sb_frame.GetThread().GetThreadID(), thread->GetID()); } - if (exe_ctx.HasThreadScope()) - { - bool abort_other_plans = false; - bool stop_other_threads = false; - Thread *thread = exe_ctx.GetThreadPtr(); - if (sb_frame.GetThread().GetThreadID() != thread->GetID()) - { - log->Printf("SBThread(%p)::StepOutOfFrame passed a frame from another thread (0x%" PRIx64 " vrs. 0x%" PRIx64 ", returning.", - static_cast<void*>(exe_ctx.GetThreadPtr()), - sb_frame.GetThread().GetThreadID(), - thread->GetID()); - } - - ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans, - NULL, - false, - stop_other_threads, - eVoteYes, - eVoteNoOpinion, - frame_sp->GetFrameIndex())); + ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut( + abort_other_plans, NULL, false, stop_other_threads, eVoteYes, + eVoteNoOpinion, frame_sp->GetFrameIndex())); - // This returns an error, we should use it! - ResumeNewPlan (exe_ctx, new_plan_sp.get()); - } + // This returns an error, we should use it! + ResumeNewPlan(exe_ctx, new_plan_sp.get()); + } } -void -SBThread::StepInstruction (bool step_over) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +void SBThread::StepInstruction(bool step_over) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", - static_cast<void*>(exe_ctx.GetThreadPtr()), step_over); + if (log) + log->Printf("SBThread(%p)::StepInstruction (step_over=%i)", + static_cast<void *>(exe_ctx.GetThreadPtr()), step_over); - if (exe_ctx.HasThreadScope()) - { - Thread *thread = exe_ctx.GetThreadPtr(); - ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true)); + if (exe_ctx.HasThreadScope()) { + Thread *thread = exe_ctx.GetThreadPtr(); + ThreadPlanSP new_plan_sp( + thread->QueueThreadPlanForStepSingleInstruction(step_over, true, true)); - // This returns an error, we should use it! - ResumeNewPlan (exe_ctx, new_plan_sp.get()); - } + // This returns an error, we should use it! + ResumeNewPlan(exe_ctx, new_plan_sp.get()); + } } -void -SBThread::RunToAddress (lldb::addr_t addr) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +void SBThread::RunToAddress(lldb::addr_t addr) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", - static_cast<void*>(exe_ctx.GetThreadPtr()), addr); + if (log) + log->Printf("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", + static_cast<void *>(exe_ctx.GetThreadPtr()), addr); - if (exe_ctx.HasThreadScope()) - { - bool abort_other_plans = false; - bool stop_other_threads = true; + if (exe_ctx.HasThreadScope()) { + bool abort_other_plans = false; + bool stop_other_threads = true; - Address target_addr (addr); + Address target_addr(addr); - Thread *thread = exe_ctx.GetThreadPtr(); + Thread *thread = exe_ctx.GetThreadPtr(); - ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, - target_addr, - stop_other_threads)); + ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress( + abort_other_plans, target_addr, stop_other_threads)); - // This returns an error, we should use it! - ResumeNewPlan (exe_ctx, new_plan_sp.get()); - } + // This returns an error, we should use it! + ResumeNewPlan(exe_ctx, new_plan_sp.get()); + } } -SBError -SBThread::StepOverUntil (lldb::SBFrame &sb_frame, - lldb::SBFileSpec &sb_file_spec, - uint32_t line) -{ - SBError sb_error; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - char path[PATH_MAX]; - - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - StackFrameSP frame_sp (sb_frame.GetFrameSP()); +SBError SBThread::StepOverUntil(lldb::SBFrame &sb_frame, + lldb::SBFileSpec &sb_file_spec, uint32_t line) { + SBError sb_error; + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + char path[PATH_MAX]; + + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + StackFrameSP frame_sp(sb_frame.GetFrameSP()); + + if (log) { + SBStream frame_desc_strm; + sb_frame.GetDescription(frame_desc_strm); + sb_file_spec->GetPath(path, sizeof(path)); + log->Printf("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, " + "file+line = %s:%u)", + static_cast<void *>(exe_ctx.GetThreadPtr()), + static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData(), + path, line); + } + + if (exe_ctx.HasThreadScope()) { + Target *target = exe_ctx.GetTargetPtr(); + Thread *thread = exe_ctx.GetThreadPtr(); - if (log) - { - SBStream frame_desc_strm; - sb_frame.GetDescription (frame_desc_strm); - sb_file_spec->GetPath (path, sizeof(path)); - log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)", - static_cast<void*>(exe_ctx.GetThreadPtr()), - static_cast<void*>(frame_sp.get()), - frame_desc_strm.GetData(), path, line); + if (line == 0) { + sb_error.SetErrorString("invalid line argument"); + return sb_error; } - if (exe_ctx.HasThreadScope()) - { - Target *target = exe_ctx.GetTargetPtr(); - Thread *thread = exe_ctx.GetThreadPtr(); - - if (line == 0) - { - sb_error.SetErrorString("invalid line argument"); - return sb_error; - } - - if (!frame_sp) - { - frame_sp = thread->GetSelectedFrame (); - if (!frame_sp) - frame_sp = thread->GetStackFrameAtIndex (0); - } - - SymbolContext frame_sc; - if (!frame_sp) - { - sb_error.SetErrorString("no valid frames in thread to step"); - return sb_error; - } + if (!frame_sp) { + frame_sp = thread->GetSelectedFrame(); + if (!frame_sp) + frame_sp = thread->GetStackFrameAtIndex(0); + } - // If we have a frame, get its line - frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit | - eSymbolContextFunction | - eSymbolContextLineEntry | - eSymbolContextSymbol ); + SymbolContext frame_sc; + if (!frame_sp) { + sb_error.SetErrorString("no valid frames in thread to step"); + return sb_error; + } - if (frame_sc.comp_unit == NULL) - { - sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex()); - return sb_error; - } + // If we have a frame, get its line + frame_sc = frame_sp->GetSymbolContext( + eSymbolContextCompUnit | eSymbolContextFunction | + eSymbolContextLineEntry | eSymbolContextSymbol); - FileSpec step_file_spec; - if (sb_file_spec.IsValid()) - { - // The file spec passed in was valid, so use it - step_file_spec = sb_file_spec.ref(); - } - else - { - if (frame_sc.line_entry.IsValid()) - step_file_spec = frame_sc.line_entry.file; - else - { - sb_error.SetErrorString("invalid file argument or no file for frame"); - return sb_error; - } - } + if (frame_sc.comp_unit == NULL) { + sb_error.SetErrorStringWithFormat( + "frame %u doesn't have debug information", frame_sp->GetFrameIndex()); + return sb_error; + } - // Grab the current function, then we will make sure the "until" address is - // within the function. We discard addresses that are out of the current - // function, and then if there are no addresses remaining, give an appropriate - // error message. - - bool all_in_function = true; - AddressRange fun_range = frame_sc.function->GetAddressRange(); - - std::vector<addr_t> step_over_until_addrs; - const bool abort_other_plans = false; - const bool stop_other_threads = false; - const bool check_inlines = true; - const bool exact = false; - - SymbolContextList sc_list; - const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec, - line, - check_inlines, - exact, - eSymbolContextLineEntry, - sc_list); - if (num_matches > 0) - { - SymbolContext sc; - for (uint32_t i=0; i<num_matches; ++i) - { - if (sc_list.GetContextAtIndex(i, sc)) - { - addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); - if (step_addr != LLDB_INVALID_ADDRESS) - { - if (fun_range.ContainsLoadAddress(step_addr, target)) - step_over_until_addrs.push_back(step_addr); - else - all_in_function = false; - } - } - } - } + FileSpec step_file_spec; + if (sb_file_spec.IsValid()) { + // The file spec passed in was valid, so use it + step_file_spec = sb_file_spec.ref(); + } else { + if (frame_sc.line_entry.IsValid()) + step_file_spec = frame_sc.line_entry.file; + else { + sb_error.SetErrorString("invalid file argument or no file for frame"); + return sb_error; + } + } - if (step_over_until_addrs.empty()) - { - if (all_in_function) - { - step_file_spec.GetPath (path, sizeof(path)); - sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line); - } + // Grab the current function, then we will make sure the "until" address is + // within the function. We discard addresses that are out of the current + // function, and then if there are no addresses remaining, give an + // appropriate + // error message. + + bool all_in_function = true; + AddressRange fun_range = frame_sc.function->GetAddressRange(); + + std::vector<addr_t> step_over_until_addrs; + const bool abort_other_plans = false; + const bool stop_other_threads = false; + const bool check_inlines = true; + const bool exact = false; + + SymbolContextList sc_list; + const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext( + step_file_spec, line, check_inlines, exact, eSymbolContextLineEntry, + sc_list); + if (num_matches > 0) { + SymbolContext sc; + for (uint32_t i = 0; i < num_matches; ++i) { + if (sc_list.GetContextAtIndex(i, sc)) { + addr_t step_addr = + sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); + if (step_addr != LLDB_INVALID_ADDRESS) { + if (fun_range.ContainsLoadAddress(step_addr, target)) + step_over_until_addrs.push_back(step_addr); else - sb_error.SetErrorString ("step until target not in current function"); - } - else - { - ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans, - &step_over_until_addrs[0], - step_over_until_addrs.size(), - stop_other_threads, - frame_sp->GetFrameIndex())); - - sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get()); + all_in_function = false; + } } + } } - else - { - sb_error.SetErrorString("this SBThread object is invalid"); + + if (step_over_until_addrs.empty()) { + if (all_in_function) { + step_file_spec.GetPath(path, sizeof(path)); + sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, + line); + } else + sb_error.SetErrorString("step until target not in current function"); + } else { + ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil( + abort_other_plans, &step_over_until_addrs[0], + step_over_until_addrs.size(), stop_other_threads, + frame_sp->GetFrameIndex())); + + sb_error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); } - return sb_error; + } else { + sb_error.SetErrorString("this SBThread object is invalid"); + } + return sb_error; } -SBError -SBThread::StepUsingScriptedThreadPlan (const char *script_class_name) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - SBError sb_error; +SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name) { + return StepUsingScriptedThreadPlan(script_class_name, true); +} - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); +SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name, + bool resume_immediately) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + SBError sb_error; - if (log) - { - log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - script_class_name); - } + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + if (log) { + log->Printf("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), script_class_name); + } - if (!exe_ctx.HasThreadScope()) - { - sb_error.SetErrorString("this SBThread object is invalid"); - return sb_error; - } + if (!exe_ctx.HasThreadScope()) { + sb_error.SetErrorString("this SBThread object is invalid"); + return sb_error; + } - Thread *thread = exe_ctx.GetThreadPtr(); - ThreadPlanSP thread_plan_sp = thread->QueueThreadPlanForStepScripted(false, script_class_name, false); - - if (thread_plan_sp) - sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get()); - else - { - sb_error.SetErrorStringWithFormat("Error queuing thread plan for class: %s.", script_class_name); - if (log) - log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing thread plan for class: %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - script_class_name); - } + Thread *thread = exe_ctx.GetThreadPtr(); + ThreadPlanSP thread_plan_sp = + thread->QueueThreadPlanForStepScripted(false, script_class_name, false); + if (!thread_plan_sp) { + sb_error.SetErrorStringWithFormat( + "Error queueing thread plan for class: %s", script_class_name); return sb_error; -} - -SBError -SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - SBError sb_error; + } - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + if (!resume_immediately) { + return sb_error; + } + if (thread_plan_sp) + sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get()); + else { + sb_error.SetErrorStringWithFormat( + "Error resuming thread plan for class: %s.", script_class_name); if (log) - log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)", - static_cast<void*>(exe_ctx.GetThreadPtr()), - file_spec->GetPath().c_str(), line); + log->Printf("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing " + "thread plan for class: %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + script_class_name); + } - if (!exe_ctx.HasThreadScope()) - { - sb_error.SetErrorString("this SBThread object is invalid"); - return sb_error; - } + return sb_error; +} - Thread *thread = exe_ctx.GetThreadPtr(); +SBError SBThread::JumpToLine(lldb::SBFileSpec &file_spec, uint32_t line) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + SBError sb_error; - Error err = thread->JumpToLine (file_spec.get(), line, true); - sb_error.SetError (err); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (log) + log->Printf("SBThread(%p)::JumpToLine (file+line = %s:%u)", + static_cast<void *>(exe_ctx.GetThreadPtr()), + file_spec->GetPath().c_str(), line); + + if (!exe_ctx.HasThreadScope()) { + sb_error.SetErrorString("this SBThread object is invalid"); return sb_error; + } + + Thread *thread = exe_ctx.GetThreadPtr(); + + Error err = thread->JumpToLine(file_spec.get(), line, true); + sb_error.SetError(err); + return sb_error; } -SBError -SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value) -{ - SBError sb_error; +SBError SBThread::ReturnFromFrame(SBFrame &frame, SBValue &return_value) { + SBError sb_error; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", - static_cast<void*>(exe_ctx.GetThreadPtr()), - frame.GetFrameID()); - - if (exe_ctx.HasThreadScope()) - { - Thread *thread = exe_ctx.GetThreadPtr(); - sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); - } + if (log) + log->Printf("SBThread(%p)::ReturnFromFrame (frame=%d)", + static_cast<void *>(exe_ctx.GetThreadPtr()), + frame.GetFrameID()); - return sb_error; + if (exe_ctx.HasThreadScope()) { + Thread *thread = exe_ctx.GetThreadPtr(); + sb_error.SetError( + thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); + } + + return sb_error; } -SBError -SBThread::UnwindInnermostExpression() -{ - SBError sb_error; +SBError SBThread::UnwindInnermostExpression() { + SBError sb_error; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (log) - log->Printf ("SBThread(%p)::UnwindExpressionEvaluation", - static_cast<void*>(exe_ctx.GetThreadPtr())); - - if (exe_ctx.HasThreadScope()) - { - Thread *thread = exe_ctx.GetThreadPtr(); - sb_error.SetError (thread->UnwindInnermostExpression()); - if (sb_error.Success()) - thread->SetSelectedFrameByIndex(0, false); - } + if (log) + log->Printf("SBThread(%p)::UnwindExpressionEvaluation", + static_cast<void *>(exe_ctx.GetThreadPtr())); - return sb_error; + if (exe_ctx.HasThreadScope()) { + Thread *thread = exe_ctx.GetThreadPtr(); + sb_error.SetError(thread->UnwindInnermostExpression()); + if (sb_error.Success()) + thread->SetSelectedFrameByIndex(0, false); + } + return sb_error; } -bool -SBThread::Suspend() -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - bool result = false; - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended); - result = true; - } - else - { - if (log) - log->Printf ("SBThread(%p)::Suspend() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +bool SBThread::Suspend() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + bool result = false; + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + exe_ctx.GetThreadPtr()->SetResumeState(eStateSuspended); + result = true; + } else { + if (log) + log->Printf("SBThread(%p)::Suspend() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } - if (log) - log->Printf ("SBThread(%p)::Suspend() => %i", - static_cast<void*>(exe_ctx.GetThreadPtr()), result); - return result; + } + if (log) + log->Printf("SBThread(%p)::Suspend() => %i", + static_cast<void *>(exe_ctx.GetThreadPtr()), result); + return result; } -bool -SBThread::Resume () -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - bool result = false; - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - const bool override_suspend = true; - exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend); - result = true; - } - else - { - if (log) - log->Printf ("SBThread(%p)::Resume() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +bool SBThread::Resume() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + bool result = false; + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + const bool override_suspend = true; + exe_ctx.GetThreadPtr()->SetResumeState(eStateRunning, override_suspend); + result = true; + } else { + if (log) + log->Printf("SBThread(%p)::Resume() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } - if (log) - log->Printf ("SBThread(%p)::Resume() => %i", - static_cast<void*>(exe_ctx.GetThreadPtr()), result); - return result; + } + if (log) + log->Printf("SBThread(%p)::Resume() => %i", + static_cast<void *>(exe_ctx.GetThreadPtr()), result); + return result; } -bool -SBThread::IsSuspended() -{ - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); +bool SBThread::IsSuspended() { + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (exe_ctx.HasThreadScope()) - return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended; - return false; + if (exe_ctx.HasThreadScope()) + return exe_ctx.GetThreadPtr()->GetResumeState() == eStateSuspended; + return false; } -bool -SBThread::IsStopped() -{ - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); +bool SBThread::IsStopped() { + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (exe_ctx.HasThreadScope()) - return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true); - return false; + if (exe_ctx.HasThreadScope()) + return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true); + return false; } -SBProcess -SBThread::GetProcess () -{ - SBProcess sb_process; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - // Have to go up to the target so we can get a shared pointer to our process... - sb_process.SetSP (exe_ctx.GetProcessSP()); - } - - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - if (log) - { - SBStream frame_desc_strm; - sb_process.GetDescription (frame_desc_strm); - log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - static_cast<void*>(sb_process.GetSP().get()), - frame_desc_strm.GetData()); - } - - return sb_process; +SBProcess SBThread::GetProcess() { + SBProcess sb_process; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + // Have to go up to the target so we can get a shared pointer to our + // process... + sb_process.SetSP(exe_ctx.GetProcessSP()); + } + + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + if (log) { + SBStream frame_desc_strm; + sb_process.GetDescription(frame_desc_strm); + log->Printf("SBThread(%p)::GetProcess () => SBProcess(%p): %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + static_cast<void *>(sb_process.GetSP().get()), + frame_desc_strm.GetData()); + } + + return sb_process; } -uint32_t -SBThread::GetNumFrames () -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - - uint32_t num_frames = 0; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +uint32_t SBThread::GetNumFrames() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + + uint32_t num_frames = 0; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); + } else { + if (log) + log->Printf("SBThread(%p)::GetNumFrames() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - log->Printf ("SBThread(%p)::GetNumFrames () => %u", - static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames); + if (log) + log->Printf("SBThread(%p)::GetNumFrames () => %u", + static_cast<void *>(exe_ctx.GetThreadPtr()), num_frames); - return num_frames; + return num_frames; } -SBFrame -SBThread::GetFrameAtIndex (uint32_t idx) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - - SBFrame sb_frame; - StackFrameSP frame_sp; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx); - sb_frame.SetFrameSP (frame_sp); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +SBFrame SBThread::GetFrameAtIndex(uint32_t idx) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + + SBFrame sb_frame; + StackFrameSP frame_sp; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(idx); + sb_frame.SetFrameSP(frame_sp); + } else { + if (log) + log->Printf( + "SBThread(%p)::GetFrameAtIndex() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - { - SBStream frame_desc_strm; - sb_frame.GetDescription (frame_desc_strm); - log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), idx, - static_cast<void*>(frame_sp.get()), - frame_desc_strm.GetData()); - } + if (log) { + SBStream frame_desc_strm; + sb_frame.GetDescription(frame_desc_strm); + log->Printf("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), idx, + static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); + } - return sb_frame; + return sb_frame; } -lldb::SBFrame -SBThread::GetSelectedFrame () -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - - SBFrame sb_frame; - StackFrameSP frame_sp; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame (); - sb_frame.SetFrameSP (frame_sp); - } - else - { - if (log) - log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } +lldb::SBFrame SBThread::GetSelectedFrame() { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + + SBFrame sb_frame; + StackFrameSP frame_sp; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame(); + sb_frame.SetFrameSP(frame_sp); + } else { + if (log) + log->Printf( + "SBThread(%p)::GetSelectedFrame() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log) - { - SBStream frame_desc_strm; - sb_frame.GetDescription (frame_desc_strm); - log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), - static_cast<void*>(frame_sp.get()), - frame_desc_strm.GetData()); - } + if (log) { + SBStream frame_desc_strm; + sb_frame.GetDescription(frame_desc_strm); + log->Printf("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), + static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); + } - return sb_frame; + return sb_frame; } -lldb::SBFrame -SBThread::SetSelectedFrame (uint32_t idx) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - - SBFrame sb_frame; - StackFrameSP frame_sp; - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - Thread *thread = exe_ctx.GetThreadPtr(); - frame_sp = thread->GetStackFrameAtIndex (idx); - if (frame_sp) - { - thread->SetSelectedFrame (frame_sp.get()); - sb_frame.SetFrameSP (frame_sp); - } - } - else - { - if (log) - log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } - } - - if (log) - { - SBStream frame_desc_strm; - sb_frame.GetDescription (frame_desc_strm); - log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s", - static_cast<void*>(exe_ctx.GetThreadPtr()), idx, - static_cast<void*>(frame_sp.get()), - frame_desc_strm.GetData()); +lldb::SBFrame SBThread::SetSelectedFrame(uint32_t idx) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + + SBFrame sb_frame; + StackFrameSP frame_sp; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + Thread *thread = exe_ctx.GetThreadPtr(); + frame_sp = thread->GetStackFrameAtIndex(idx); + if (frame_sp) { + thread->SetSelectedFrame(frame_sp.get()); + sb_frame.SetFrameSP(frame_sp); + } + } else { + if (log) + log->Printf( + "SBThread(%p)::SetSelectedFrame() => error: process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } - return sb_frame; + } + + if (log) { + SBStream frame_desc_strm; + sb_frame.GetDescription(frame_desc_strm); + log->Printf("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s", + static_cast<void *>(exe_ctx.GetThreadPtr()), idx, + static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); + } + return sb_frame; } -bool -SBThread::EventIsThreadEvent (const SBEvent &event) -{ - return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL; +bool SBThread::EventIsThreadEvent(const SBEvent &event) { + return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL; } -SBFrame -SBThread::GetStackFrameFromEvent (const SBEvent &event) -{ - return Thread::ThreadEventData::GetStackFrameFromEvent (event.get()); - +SBFrame SBThread::GetStackFrameFromEvent(const SBEvent &event) { + return Thread::ThreadEventData::GetStackFrameFromEvent(event.get()); } -SBThread -SBThread::GetThreadFromEvent (const SBEvent &event) -{ - return Thread::ThreadEventData::GetThreadFromEvent (event.get()); +SBThread SBThread::GetThreadFromEvent(const SBEvent &event) { + return Thread::ThreadEventData::GetThreadFromEvent(event.get()); } -bool -SBThread::operator == (const SBThread &rhs) const -{ - return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get(); +bool SBThread::operator==(const SBThread &rhs) const { + return m_opaque_sp->GetThreadSP().get() == + rhs.m_opaque_sp->GetThreadSP().get(); } -bool -SBThread::operator != (const SBThread &rhs) const -{ - return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get(); +bool SBThread::operator!=(const SBThread &rhs) const { + return m_opaque_sp->GetThreadSP().get() != + rhs.m_opaque_sp->GetThreadSP().get(); } -bool -SBThread::GetStatus (SBStream &status) const -{ - Stream &strm = status.ref(); +bool SBThread::GetStatus(SBStream &status) const { + Stream &strm = status.ref(); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - if (exe_ctx.HasThreadScope()) - { - exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1); - } - else - strm.PutCString ("No status"); - - return true; + if (exe_ctx.HasThreadScope()) { + exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1, true); + } else + strm.PutCString("No status"); + + return true; } -bool -SBThread::GetDescription (SBStream &description) const -{ - Stream &strm = description.ref(); +bool SBThread::GetDescription(SBStream &description) const { + return GetDescription(description, false); +} - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); +bool SBThread::GetDescription(SBStream &description, bool stop_format) const { + Stream &strm = description.ref(); - if (exe_ctx.HasThreadScope()) - { - exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, LLDB_INVALID_THREAD_ID); - //strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID()); - } - else - strm.PutCString ("No value"); - - return true; + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + + if (exe_ctx.HasThreadScope()) { + exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, + LLDB_INVALID_THREAD_ID, + stop_format); + // strm.Printf("SBThread: tid = 0x%4.4" PRIx64, + // exe_ctx.GetThreadPtr()->GetID()); + } else + strm.PutCString("No value"); + + return true; } -SBThread -SBThread::GetExtendedBacktraceThread (const char *type) -{ - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - std::unique_lock<std::recursive_mutex> lock; - ExecutionContext exe_ctx(m_opaque_sp.get(), lock); - SBThread sb_origin_thread; - - if (exe_ctx.HasThreadScope()) - { - Process::StopLocker stop_locker; - if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) - { - ThreadSP real_thread(exe_ctx.GetThreadSP()); - if (real_thread) - { - ConstString type_const (type); - Process *process = exe_ctx.GetProcessPtr(); - if (process) - { - SystemRuntime *runtime = process->GetSystemRuntime(); - if (runtime) - { - ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const)); - if (new_thread_sp) - { - // Save this in the Process' ExtendedThreadList so a strong pointer retains the - // object. - process->GetExtendedThreadList().AddThread (new_thread_sp); - sb_origin_thread.SetThread (new_thread_sp); - if (log) - { - const char *queue_name = new_thread_sp->GetQueueName(); - if (queue_name == NULL) - queue_name = ""; - log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread " - "created (%p) with queue_id 0x%" PRIx64 " queue name '%s'", - static_cast<void*>(exe_ctx.GetThreadPtr()), - static_cast<void*>(new_thread_sp.get()), - new_thread_sp->GetQueueID(), - queue_name); - } - } - } - } +SBThread SBThread::GetExtendedBacktraceThread(const char *type) { + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + std::unique_lock<std::recursive_mutex> lock; + ExecutionContext exe_ctx(m_opaque_sp.get(), lock); + SBThread sb_origin_thread; + + if (exe_ctx.HasThreadScope()) { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { + ThreadSP real_thread(exe_ctx.GetThreadSP()); + if (real_thread) { + ConstString type_const(type); + Process *process = exe_ctx.GetProcessPtr(); + if (process) { + SystemRuntime *runtime = process->GetSystemRuntime(); + if (runtime) { + ThreadSP new_thread_sp( + runtime->GetExtendedBacktraceThread(real_thread, type_const)); + if (new_thread_sp) { + // Save this in the Process' ExtendedThreadList so a strong + // pointer retains the + // object. + process->GetExtendedThreadList().AddThread(new_thread_sp); + sb_origin_thread.SetThread(new_thread_sp); + if (log) { + const char *queue_name = new_thread_sp->GetQueueName(); + if (queue_name == NULL) + queue_name = ""; + log->Printf("SBThread(%p)::GetExtendedBacktraceThread() => new " + "extended Thread " + "created (%p) with queue_id 0x%" PRIx64 + " queue name '%s'", + static_cast<void *>(exe_ctx.GetThreadPtr()), + static_cast<void *>(new_thread_sp.get()), + new_thread_sp->GetQueueID(), queue_name); + } } + } } - else - { - if (log) - log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running", - static_cast<void*>(exe_ctx.GetThreadPtr())); - } + } + } else { + if (log) + log->Printf("SBThread(%p)::GetExtendedBacktraceThread() => error: " + "process is running", + static_cast<void *>(exe_ctx.GetThreadPtr())); } + } - if (log && sb_origin_thread.IsValid() == false) - log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread", - static_cast<void*>(exe_ctx.GetThreadPtr())); - return sb_origin_thread; + if (log && sb_origin_thread.IsValid() == false) + log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a " + "Valid thread", + static_cast<void *>(exe_ctx.GetThreadPtr())); + return sb_origin_thread; } -uint32_t -SBThread::GetExtendedBacktraceOriginatingIndexID () -{ - ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); - if (thread_sp) - return thread_sp->GetExtendedBacktraceOriginatingIndexID(); - return LLDB_INVALID_INDEX32; +uint32_t SBThread::GetExtendedBacktraceOriginatingIndexID() { + ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); + if (thread_sp) + return thread_sp->GetExtendedBacktraceOriginatingIndexID(); + return LLDB_INVALID_INDEX32; } -bool -SBThread::SafeToCallFunctions () -{ - ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); - if (thread_sp) - return thread_sp->SafeToCallFunctions(); - return true; +bool SBThread::SafeToCallFunctions() { + ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); + if (thread_sp) + return thread_sp->SafeToCallFunctions(); + return true; } -lldb_private::Thread * -SBThread::operator->() -{ - ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); - if (thread_sp) - return thread_sp.get(); - else - return NULL; +lldb_private::Thread *SBThread::operator->() { + ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); + if (thread_sp) + return thread_sp.get(); + else + return NULL; } -lldb_private::Thread * -SBThread::get() -{ - ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); - if (thread_sp) - return thread_sp.get(); - else - return NULL; +lldb_private::Thread *SBThread::get() { + ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); + if (thread_sp) + return thread_sp.get(); + else + return NULL; } - |