130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
104c5de699SEli Friedman #include "lldb/API/SBProcess.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1330fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1430fdc8d8SChris Lattner 
15*40af72e1SJim Ingham #include "lldb/Interpreter/Args.h"
1630fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h"
1730fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h"
1830fdc8d8SChris Lattner #include "lldb/Core/State.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2130fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2230fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner // Project includes
2630fdc8d8SChris Lattner 
274c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
284c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
294c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
304c5de699SEli Friedman #include "lldb/API/SBEvent.h"
314c5de699SEli Friedman #include "lldb/API/SBThread.h"
324c5de699SEli Friedman #include "lldb/API/SBStringList.h"
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner using namespace lldb;
3530fdc8d8SChris Lattner using namespace lldb_private;
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner SBProcess::SBProcess () :
4030fdc8d8SChris Lattner     m_lldb_object_sp()
4130fdc8d8SChris Lattner {
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner //----------------------------------------------------------------------
4630fdc8d8SChris Lattner // SBProcess constructor
4730fdc8d8SChris Lattner //----------------------------------------------------------------------
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
5030fdc8d8SChris Lattner     m_lldb_object_sp (rhs.m_lldb_object_sp)
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
5630fdc8d8SChris Lattner     m_lldb_object_sp (process_sp)
5730fdc8d8SChris Lattner {
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner //----------------------------------------------------------------------
6130fdc8d8SChris Lattner // Destructor
6230fdc8d8SChris Lattner //----------------------------------------------------------------------
6330fdc8d8SChris Lattner SBProcess::~SBProcess()
6430fdc8d8SChris Lattner {
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner void
6830fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner     m_lldb_object_sp = process_sp;
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner void
7430fdc8d8SChris Lattner SBProcess::Clear ()
7530fdc8d8SChris Lattner {
7630fdc8d8SChris Lattner     m_lldb_object_sp.reset();
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner 
8030fdc8d8SChris Lattner bool
8130fdc8d8SChris Lattner SBProcess::IsValid() const
8230fdc8d8SChris Lattner {
8330fdc8d8SChris Lattner     return m_lldb_object_sp.get() != NULL;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner uint32_t
8830fdc8d8SChris Lattner SBProcess::GetNumThreads ()
8930fdc8d8SChris Lattner {
9030fdc8d8SChris Lattner     if (m_lldb_object_sp)
9130fdc8d8SChris Lattner     {
9230fdc8d8SChris Lattner         const bool can_update = true;
9330fdc8d8SChris Lattner         return m_lldb_object_sp->GetThreadList().GetSize(can_update);
9430fdc8d8SChris Lattner     }
9530fdc8d8SChris Lattner     return 0;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner SBThread
9930fdc8d8SChris Lattner SBProcess::GetCurrentThread () const
10030fdc8d8SChris Lattner {
10130fdc8d8SChris Lattner     SBThread sb_thread;
10230fdc8d8SChris Lattner     if (m_lldb_object_sp)
10330fdc8d8SChris Lattner         sb_thread.SetThread (m_lldb_object_sp->GetThreadList().GetCurrentThread());
10430fdc8d8SChris Lattner     return sb_thread;
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner 
10730fdc8d8SChris Lattner SBTarget
10830fdc8d8SChris Lattner SBProcess::GetTarget() const
10930fdc8d8SChris Lattner {
11030fdc8d8SChris Lattner     SBTarget sb_target;
11130fdc8d8SChris Lattner     if (m_lldb_object_sp)
11230fdc8d8SChris Lattner         sb_target = SBDebugger::FindTargetWithLLDBProcess (m_lldb_object_sp);
11330fdc8d8SChris Lattner     return sb_target;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner 
11730fdc8d8SChris Lattner size_t
11830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
11930fdc8d8SChris Lattner {
12030fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
12130fdc8d8SChris Lattner     {
12230fdc8d8SChris Lattner         Error error;
12330fdc8d8SChris Lattner         return m_lldb_object_sp->PutSTDIN (src, src_len, error);
12430fdc8d8SChris Lattner     }
12530fdc8d8SChris Lattner     else
12630fdc8d8SChris Lattner         return 0;
12730fdc8d8SChris Lattner }
12830fdc8d8SChris Lattner 
12930fdc8d8SChris Lattner size_t
13030fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
13130fdc8d8SChris Lattner {
13230fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
13330fdc8d8SChris Lattner     {
13430fdc8d8SChris Lattner         Error error;
13530fdc8d8SChris Lattner         return m_lldb_object_sp->GetSTDOUT (dst, dst_len, error);
13630fdc8d8SChris Lattner     }
13730fdc8d8SChris Lattner     else
13830fdc8d8SChris Lattner         return 0;
13930fdc8d8SChris Lattner }
14030fdc8d8SChris Lattner 
14130fdc8d8SChris Lattner size_t
14230fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
14330fdc8d8SChris Lattner {
14430fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
14530fdc8d8SChris Lattner     {
14630fdc8d8SChris Lattner         Error error;
14730fdc8d8SChris Lattner         return m_lldb_object_sp->GetSTDERR (dst, dst_len, error);
14830fdc8d8SChris Lattner     }
14930fdc8d8SChris Lattner     else
15030fdc8d8SChris Lattner         return 0;
15130fdc8d8SChris Lattner }
15230fdc8d8SChris Lattner 
15330fdc8d8SChris Lattner void
15430fdc8d8SChris Lattner SBProcess::ReportCurrentState (const SBEvent &event, FILE *out) const
15530fdc8d8SChris Lattner {
15630fdc8d8SChris Lattner     if (out == NULL)
15730fdc8d8SChris Lattner         return;
15830fdc8d8SChris Lattner 
15930fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
16030fdc8d8SChris Lattner     {
16130fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
16230fdc8d8SChris Lattner         char message[1024];
16330fdc8d8SChris Lattner         int message_len = ::snprintf (message,
16430fdc8d8SChris Lattner                                       sizeof (message),
16530fdc8d8SChris Lattner                                       "Process %d %s\n",
16630fdc8d8SChris Lattner                                       m_lldb_object_sp->GetID(),
16730fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner         if (message_len > 0)
17030fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
17130fdc8d8SChris Lattner     }
17230fdc8d8SChris Lattner }
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner void
17530fdc8d8SChris Lattner SBProcess::AppendCurrentStateReport (const SBEvent &event, SBCommandReturnObject &result)
17630fdc8d8SChris Lattner {
17730fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
17830fdc8d8SChris Lattner     {
17930fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
18030fdc8d8SChris Lattner         char message[1024];
18130fdc8d8SChris Lattner         ::snprintf (message,
18230fdc8d8SChris Lattner                     sizeof (message),
18330fdc8d8SChris Lattner                     "Process %d %s\n",
18430fdc8d8SChris Lattner                     m_lldb_object_sp->GetID(),
18530fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
18630fdc8d8SChris Lattner 
18730fdc8d8SChris Lattner         result.AppendMessage (message);
18830fdc8d8SChris Lattner     }
18930fdc8d8SChris Lattner }
19030fdc8d8SChris Lattner 
19130fdc8d8SChris Lattner bool
19230fdc8d8SChris Lattner SBProcess::SetCurrentThread (const SBThread &thread)
19330fdc8d8SChris Lattner {
19430fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
19530fdc8d8SChris Lattner         return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (thread.GetThreadID());
19630fdc8d8SChris Lattner     return false;
19730fdc8d8SChris Lattner }
19830fdc8d8SChris Lattner 
19930fdc8d8SChris Lattner bool
20030fdc8d8SChris Lattner SBProcess::SetCurrentThreadByID (uint32_t tid)
20130fdc8d8SChris Lattner {
20230fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
20330fdc8d8SChris Lattner         return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (tid);
20430fdc8d8SChris Lattner     return false;
20530fdc8d8SChris Lattner }
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner SBThread
20830fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
20930fdc8d8SChris Lattner {
21030fdc8d8SChris Lattner     SBThread thread;
21130fdc8d8SChris Lattner     if (m_lldb_object_sp)
21230fdc8d8SChris Lattner         thread.SetThread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(index));
21330fdc8d8SChris Lattner     return thread;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner StateType
21730fdc8d8SChris Lattner SBProcess::GetState ()
21830fdc8d8SChris Lattner {
21930fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
22030fdc8d8SChris Lattner         return m_lldb_object_sp->GetState();
22130fdc8d8SChris Lattner     else
22230fdc8d8SChris Lattner         return eStateInvalid;
22330fdc8d8SChris Lattner }
22430fdc8d8SChris Lattner 
22530fdc8d8SChris Lattner 
22630fdc8d8SChris Lattner int
22730fdc8d8SChris Lattner SBProcess::GetExitStatus ()
22830fdc8d8SChris Lattner {
22930fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
23030fdc8d8SChris Lattner         return m_lldb_object_sp->GetExitStatus ();
23130fdc8d8SChris Lattner     else
23230fdc8d8SChris Lattner         return 0;
23330fdc8d8SChris Lattner }
23430fdc8d8SChris Lattner 
23530fdc8d8SChris Lattner const char *
23630fdc8d8SChris Lattner SBProcess::GetExitDescription ()
23730fdc8d8SChris Lattner {
23830fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
23930fdc8d8SChris Lattner         return m_lldb_object_sp->GetExitDescription ();
24030fdc8d8SChris Lattner     else
24130fdc8d8SChris Lattner         return NULL;
24230fdc8d8SChris Lattner }
24330fdc8d8SChris Lattner 
24430fdc8d8SChris Lattner lldb::pid_t
24530fdc8d8SChris Lattner SBProcess::GetProcessID ()
24630fdc8d8SChris Lattner {
24730fdc8d8SChris Lattner     if (m_lldb_object_sp)
24830fdc8d8SChris Lattner         return m_lldb_object_sp->GetID();
24930fdc8d8SChris Lattner     else
25030fdc8d8SChris Lattner         return LLDB_INVALID_PROCESS_ID;
25130fdc8d8SChris Lattner }
25230fdc8d8SChris Lattner 
25330fdc8d8SChris Lattner uint32_t
25430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
25530fdc8d8SChris Lattner {
25630fdc8d8SChris Lattner     if (m_lldb_object_sp)
25730fdc8d8SChris Lattner         return m_lldb_object_sp->GetAddressByteSize();
25830fdc8d8SChris Lattner     else
25930fdc8d8SChris Lattner         return 0;
26030fdc8d8SChris Lattner }
26130fdc8d8SChris Lattner 
26230fdc8d8SChris Lattner 
26330fdc8d8SChris Lattner void
26430fdc8d8SChris Lattner SBProcess::DisplayThreadsInfo (FILE *out, FILE *err, bool only_threads_with_stop_reason)
26530fdc8d8SChris Lattner {
26630fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
26730fdc8d8SChris Lattner     {
26830fdc8d8SChris Lattner         size_t num_thread_infos_dumped = 0;
26930fdc8d8SChris Lattner         size_t num_threads = GetNumThreads();
27030fdc8d8SChris Lattner 
27130fdc8d8SChris Lattner         if (out == NULL)
27230fdc8d8SChris Lattner             out = SBDebugger::GetOutputFileHandle();
27330fdc8d8SChris Lattner 
27430fdc8d8SChris Lattner         if (err == NULL)
27530fdc8d8SChris Lattner             err = SBDebugger::GetErrorFileHandle();
27630fdc8d8SChris Lattner 
27730fdc8d8SChris Lattner         if ((out == NULL) ||(err == NULL))
27830fdc8d8SChris Lattner             return;
27930fdc8d8SChris Lattner 
28030fdc8d8SChris Lattner         if (num_threads > 0)
28130fdc8d8SChris Lattner         {
28230fdc8d8SChris Lattner             Thread::StopInfo thread_stop_info;
28330fdc8d8SChris Lattner             SBThread curr_thread (m_lldb_object_sp->GetThreadList().GetCurrentThread());
28430fdc8d8SChris Lattner             for (int i = 0; i < num_threads; ++i)
28530fdc8d8SChris Lattner             {
28630fdc8d8SChris Lattner                 SBThread thread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i));
28730fdc8d8SChris Lattner                 if (thread.IsValid())
28830fdc8d8SChris Lattner                 {
28930fdc8d8SChris Lattner                     bool is_current_thread = false;
29030fdc8d8SChris Lattner                     StreamFile str (out);
29130fdc8d8SChris Lattner                     if (thread == curr_thread)
29230fdc8d8SChris Lattner                         is_current_thread = true;
29330fdc8d8SChris Lattner                     StopReason thread_stop_reason = eStopReasonNone;
29430fdc8d8SChris Lattner                     if (thread->GetStopInfo (&thread_stop_info))
29530fdc8d8SChris Lattner                     {
29630fdc8d8SChris Lattner                         thread_stop_reason = thread_stop_info.GetStopReason();
29730fdc8d8SChris Lattner                         if (thread_stop_reason == eStopReasonNone)
29830fdc8d8SChris Lattner                         {
29930fdc8d8SChris Lattner                             if (only_threads_with_stop_reason && !is_current_thread)
30030fdc8d8SChris Lattner                                 continue;
30130fdc8d8SChris Lattner                         }
30230fdc8d8SChris Lattner                     }
30330fdc8d8SChris Lattner                     ++num_thread_infos_dumped;
30430fdc8d8SChris Lattner                     fprintf (out, "  %c thread #%u: tid = 0x%4.4x, pc = 0x%16.16llx",
30530fdc8d8SChris Lattner                              (is_current_thread ? '*' : ' '),
30630fdc8d8SChris Lattner                              thread->GetIndexID(), thread->GetID(), thread->GetRegisterContext()->GetPC());
30730fdc8d8SChris Lattner 
30830fdc8d8SChris Lattner                     StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
30930fdc8d8SChris Lattner                     if (frame_sp)
31030fdc8d8SChris Lattner                     {
31130fdc8d8SChris Lattner                         SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextEverything));
31230fdc8d8SChris Lattner                         fprintf (out, ", where = ");
31330fdc8d8SChris Lattner                         sc.DumpStopContext (&str, m_lldb_object_sp.get(), frame_sp->GetPC ());
31430fdc8d8SChris Lattner                     }
31530fdc8d8SChris Lattner 
31630fdc8d8SChris Lattner                     if (thread_stop_reason != eStopReasonNone)
31730fdc8d8SChris Lattner                     {
31830fdc8d8SChris Lattner                         fprintf (out, ", stop reason = ");
31930fdc8d8SChris Lattner                         thread_stop_info.Dump (&str);
32030fdc8d8SChris Lattner                     }
32130fdc8d8SChris Lattner 
32230fdc8d8SChris Lattner                     const char *thread_name = thread->GetName();
32330fdc8d8SChris Lattner                     if (thread_name && thread_name[0])
32430fdc8d8SChris Lattner                         fprintf (out, ", thread_name = '%s'", thread_name);
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner                     fprintf (out, "\n");
32730fdc8d8SChris Lattner 
32830fdc8d8SChris Lattner                     SBThread sb_thread (thread);
32930fdc8d8SChris Lattner                     sb_thread.DisplayFramesForCurrentContext (out, err, 0, 1, false, 1);
33030fdc8d8SChris Lattner                 }
33130fdc8d8SChris Lattner             }
33230fdc8d8SChris Lattner         }
33330fdc8d8SChris Lattner     }
33430fdc8d8SChris Lattner }
33530fdc8d8SChris Lattner bool
33630fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
33730fdc8d8SChris Lattner {
33830fdc8d8SChris Lattner     bool state_changed = false;
33930fdc8d8SChris Lattner 
34030fdc8d8SChris Lattner     if (IsValid())
34130fdc8d8SChris Lattner     {
34230fdc8d8SChris Lattner         EventSP event_sp;
34330fdc8d8SChris Lattner         StateType state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp);
34430fdc8d8SChris Lattner 
34530fdc8d8SChris Lattner         while (StateIsStoppedState (state))
34630fdc8d8SChris Lattner         {
34730fdc8d8SChris Lattner             state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp);
34830fdc8d8SChris Lattner             SBEvent event (event_sp);
34930fdc8d8SChris Lattner             AppendCurrentStateReport (event, result);
35030fdc8d8SChris Lattner             state_changed = true;
35130fdc8d8SChris Lattner         }
35230fdc8d8SChris Lattner     }
35330fdc8d8SChris Lattner     return state_changed;
35430fdc8d8SChris Lattner }
35530fdc8d8SChris Lattner 
35630fdc8d8SChris Lattner SBError
35730fdc8d8SChris Lattner SBProcess::Continue ()
35830fdc8d8SChris Lattner {
35930fdc8d8SChris Lattner     SBError sb_error;
36030fdc8d8SChris Lattner     if (IsValid())
36130fdc8d8SChris Lattner         sb_error.SetError(m_lldb_object_sp->Resume());
36230fdc8d8SChris Lattner     else
36330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
36430fdc8d8SChris Lattner 
36530fdc8d8SChris Lattner     return sb_error;
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
36830fdc8d8SChris Lattner 
36930fdc8d8SChris Lattner SBError
37030fdc8d8SChris Lattner SBProcess::Destroy ()
37130fdc8d8SChris Lattner {
37230fdc8d8SChris Lattner     SBError sb_error;
37330fdc8d8SChris Lattner     if (m_lldb_object_sp)
37430fdc8d8SChris Lattner         sb_error.SetError(m_lldb_object_sp->Destroy());
37530fdc8d8SChris Lattner     else
37630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner     return sb_error;
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner SBError
38330fdc8d8SChris Lattner SBProcess::Stop ()
38430fdc8d8SChris Lattner {
38530fdc8d8SChris Lattner     SBError sb_error;
38630fdc8d8SChris Lattner     if (IsValid())
38730fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Halt());
38830fdc8d8SChris Lattner     else
38930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
39030fdc8d8SChris Lattner     return sb_error;
39130fdc8d8SChris Lattner }
39230fdc8d8SChris Lattner 
39330fdc8d8SChris Lattner SBError
39430fdc8d8SChris Lattner SBProcess::Kill ()
39530fdc8d8SChris Lattner {
39630fdc8d8SChris Lattner     SBError sb_error;
39730fdc8d8SChris Lattner     if (m_lldb_object_sp)
39830fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Destroy());
39930fdc8d8SChris Lattner     else
40030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
40130fdc8d8SChris Lattner     return sb_error;
40230fdc8d8SChris Lattner }
40330fdc8d8SChris Lattner 
40430fdc8d8SChris Lattner 
40530fdc8d8SChris Lattner SBError
40630fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
40730fdc8d8SChris Lattner {
40830fdc8d8SChris Lattner     SBError sb_error;
40930fdc8d8SChris Lattner     if (m_lldb_object_sp)
41030fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Attach (name, wait_for_launch));
41130fdc8d8SChris Lattner     else
41230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
41330fdc8d8SChris Lattner     return sb_error;
41430fdc8d8SChris Lattner }
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner lldb::pid_t
41730fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid)  // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
41830fdc8d8SChris Lattner {
41930fdc8d8SChris Lattner     Attach (attach_pid);
42030fdc8d8SChris Lattner     return GetProcessID();
42130fdc8d8SChris Lattner }
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner 
42430fdc8d8SChris Lattner SBError
42530fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
42630fdc8d8SChris Lattner {
42730fdc8d8SChris Lattner     SBError sb_error;
42830fdc8d8SChris Lattner     if (m_lldb_object_sp)
42930fdc8d8SChris Lattner         sb_error.SetError  (m_lldb_object_sp->Attach (attach_pid));
43030fdc8d8SChris Lattner     else
43130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
43230fdc8d8SChris Lattner     return sb_error;
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
43530fdc8d8SChris Lattner SBError
43630fdc8d8SChris Lattner SBProcess::Detach ()
43730fdc8d8SChris Lattner {
43830fdc8d8SChris Lattner     SBError sb_error;
43930fdc8d8SChris Lattner     if (m_lldb_object_sp)
44030fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Detach());
44130fdc8d8SChris Lattner     else
44230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner     return sb_error;
44530fdc8d8SChris Lattner }
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner SBError
44830fdc8d8SChris Lattner SBProcess::Signal (int signal)
44930fdc8d8SChris Lattner {
45030fdc8d8SChris Lattner     SBError sb_error;
45130fdc8d8SChris Lattner     if (m_lldb_object_sp)
45230fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Signal (signal));
45330fdc8d8SChris Lattner     else
45430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
45530fdc8d8SChris Lattner     return sb_error;
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner void
45930fdc8d8SChris Lattner SBProcess::ListThreads ()
46030fdc8d8SChris Lattner {
46130fdc8d8SChris Lattner     FILE *out = SBDebugger::GetOutputFileHandle();
46230fdc8d8SChris Lattner     if (out == NULL)
46330fdc8d8SChris Lattner         return;
46430fdc8d8SChris Lattner 
46530fdc8d8SChris Lattner     if (m_lldb_object_sp)
46630fdc8d8SChris Lattner     {
46730fdc8d8SChris Lattner         size_t num_threads = GetNumThreads ();
46830fdc8d8SChris Lattner         if (num_threads > 0)
46930fdc8d8SChris Lattner         {
47030fdc8d8SChris Lattner             Thread *cur_thread = m_lldb_object_sp->GetThreadList().GetCurrentThread().get();
47130fdc8d8SChris Lattner             for (int i = 0; i < num_threads; ++i)
47230fdc8d8SChris Lattner             {
47330fdc8d8SChris Lattner                 Thread *thread = m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i).get();
47430fdc8d8SChris Lattner                 if (thread)
47530fdc8d8SChris Lattner                 {
47630fdc8d8SChris Lattner                     bool is_current_thread = false;
47730fdc8d8SChris Lattner                     if (thread == cur_thread)
47830fdc8d8SChris Lattner                         is_current_thread = true;
47930fdc8d8SChris Lattner                     fprintf (out, "  [%u] %c tid = 0x%4.4x, pc = 0x%16.16llx",
48030fdc8d8SChris Lattner                              i,
48130fdc8d8SChris Lattner                              (is_current_thread ? '*' : ' '),
48230fdc8d8SChris Lattner                              thread->GetID(),
48330fdc8d8SChris Lattner                              thread->GetRegisterContext()->GetPC());
48430fdc8d8SChris Lattner                     const char *thread_name = thread->GetName();
48530fdc8d8SChris Lattner                     if (thread_name && thread_name[0])
48630fdc8d8SChris Lattner                         fprintf (out, ", name = %s", thread_name);
48730fdc8d8SChris Lattner                     const char *queue_name = thread->GetQueueName();
48830fdc8d8SChris Lattner                     if (queue_name && queue_name[0])
48930fdc8d8SChris Lattner                         fprintf (out, ", queue = %s", queue_name);
49030fdc8d8SChris Lattner                     fprintf (out, "\n");
49130fdc8d8SChris Lattner                 }
49230fdc8d8SChris Lattner             }
49330fdc8d8SChris Lattner         }
49430fdc8d8SChris Lattner     }
49530fdc8d8SChris Lattner }
49630fdc8d8SChris Lattner 
49730fdc8d8SChris Lattner SBThread
49830fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
49930fdc8d8SChris Lattner {
50030fdc8d8SChris Lattner     SBThread thread;
50130fdc8d8SChris Lattner     if (m_lldb_object_sp)
50230fdc8d8SChris Lattner         thread.SetThread (m_lldb_object_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
50330fdc8d8SChris Lattner     return thread;
50430fdc8d8SChris Lattner }
50530fdc8d8SChris Lattner 
50630fdc8d8SChris Lattner void
50730fdc8d8SChris Lattner SBProcess::Backtrace (bool all_threads, uint32_t num_frames)
50830fdc8d8SChris Lattner {
50930fdc8d8SChris Lattner     if (m_lldb_object_sp)
51030fdc8d8SChris Lattner     {
51130fdc8d8SChris Lattner         if (!all_threads)
51230fdc8d8SChris Lattner         {
51330fdc8d8SChris Lattner             SBDebugger::UpdateCurrentThread (*this);
51430fdc8d8SChris Lattner             SBThread cur_thread = GetCurrentThread();
51530fdc8d8SChris Lattner             if (cur_thread.IsValid())
51630fdc8d8SChris Lattner               cur_thread.Backtrace (num_frames);
51730fdc8d8SChris Lattner         }
51830fdc8d8SChris Lattner         else
51930fdc8d8SChris Lattner         {
52030fdc8d8SChris Lattner             int num_threads = GetNumThreads ();
52130fdc8d8SChris Lattner             for (int i = 0; i < num_threads; ++i)
52230fdc8d8SChris Lattner             {
52330fdc8d8SChris Lattner                 SBThread sb_thread = GetThreadAtIndex (i);
52430fdc8d8SChris Lattner                 sb_thread.Backtrace (num_frames);
52530fdc8d8SChris Lattner             }
52630fdc8d8SChris Lattner         }
52730fdc8d8SChris Lattner     }
52830fdc8d8SChris Lattner }
52930fdc8d8SChris Lattner 
53030fdc8d8SChris Lattner StateType
53130fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
53230fdc8d8SChris Lattner {
53330fdc8d8SChris Lattner     return Process::ProcessEventData::GetStateFromEvent (event.GetLLDBObjectPtr());
53430fdc8d8SChris Lattner }
53530fdc8d8SChris Lattner 
53630fdc8d8SChris Lattner 
53730fdc8d8SChris Lattner bool
53830fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
53930fdc8d8SChris Lattner {
54030fdc8d8SChris Lattner     return Process::ProcessEventData::GetRestartedFromEvent (event.GetLLDBObjectPtr());
54130fdc8d8SChris Lattner }
54230fdc8d8SChris Lattner 
54330fdc8d8SChris Lattner SBProcess
54430fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
54530fdc8d8SChris Lattner {
54630fdc8d8SChris Lattner     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.GetLLDBObjectPtr()));
54730fdc8d8SChris Lattner     return process;
54830fdc8d8SChris Lattner }
54930fdc8d8SChris Lattner 
55030fdc8d8SChris Lattner 
55130fdc8d8SChris Lattner SBBroadcaster
55230fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
55330fdc8d8SChris Lattner {
55430fdc8d8SChris Lattner     SBBroadcaster broadcaster(m_lldb_object_sp.get(), false);
55530fdc8d8SChris Lattner     return broadcaster;
55630fdc8d8SChris Lattner }
55730fdc8d8SChris Lattner 
55830fdc8d8SChris Lattner lldb_private::Process *
55930fdc8d8SChris Lattner SBProcess::operator->() const
56030fdc8d8SChris Lattner {
56130fdc8d8SChris Lattner     return m_lldb_object_sp.get();
56230fdc8d8SChris Lattner }
56330fdc8d8SChris Lattner 
56430fdc8d8SChris Lattner size_t
56530fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
56630fdc8d8SChris Lattner {
56730fdc8d8SChris Lattner     size_t bytes_read = 0;
56830fdc8d8SChris Lattner 
56930fdc8d8SChris Lattner     if (IsValid())
57030fdc8d8SChris Lattner     {
57130fdc8d8SChris Lattner         Error error;
57230fdc8d8SChris Lattner         bytes_read = m_lldb_object_sp->ReadMemory (addr, dst, dst_len, error);
57330fdc8d8SChris Lattner         sb_error.SetError (error);
57430fdc8d8SChris Lattner     }
57530fdc8d8SChris Lattner     else
57630fdc8d8SChris Lattner     {
57730fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
57830fdc8d8SChris Lattner     }
57930fdc8d8SChris Lattner 
58030fdc8d8SChris Lattner     return bytes_read;
58130fdc8d8SChris Lattner }
58230fdc8d8SChris Lattner 
58330fdc8d8SChris Lattner size_t
58430fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
58530fdc8d8SChris Lattner {
58630fdc8d8SChris Lattner     size_t bytes_written = 0;
58730fdc8d8SChris Lattner 
58830fdc8d8SChris Lattner     if (IsValid())
58930fdc8d8SChris Lattner     {
59030fdc8d8SChris Lattner         Error error;
59130fdc8d8SChris Lattner         bytes_written = m_lldb_object_sp->WriteMemory (addr, src, src_len, error);
59230fdc8d8SChris Lattner         sb_error.SetError (error);
59330fdc8d8SChris Lattner     }
59430fdc8d8SChris Lattner 
59530fdc8d8SChris Lattner     return bytes_written;
59630fdc8d8SChris Lattner }
59730fdc8d8SChris Lattner 
59830fdc8d8SChris Lattner // Mimic shared pointer...
59930fdc8d8SChris Lattner lldb_private::Process *
60030fdc8d8SChris Lattner SBProcess::get() const
60130fdc8d8SChris Lattner {
60230fdc8d8SChris Lattner     return m_lldb_object_sp.get();
60330fdc8d8SChris Lattner }
60430fdc8d8SChris Lattner 
605