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 
12bdae3787SVirgile Bello // C Includes
13bdae3787SVirgile Bello #include <inttypes.h>
14bdae3787SVirgile Bello 
1530fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1630fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1730fdc8d8SChris Lattner 
185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
191f746071SGreg Clayton #include "lldb/Core/Module.h"
20f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h"
2130fdc8d8SChris Lattner #include "lldb/Core/State.h"
2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
23b9c1b51eSKate Stone #include "lldb/Interpreter/Args.h"
2426036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2630fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
278c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
286611103cSGreg Clayton #include "lldb/Target/Target.h"
296611103cSGreg Clayton #include "lldb/Target/Thread.h"
30*6f9e6901SZachary Turner #include "lldb/Utility/Log.h"
31bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner // Project includes
3430fdc8d8SChris Lattner 
354c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
364c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
370e615684SGreg Clayton #include "lldb/API/SBDebugger.h"
384c5de699SEli Friedman #include "lldb/API/SBEvent.h"
390e615684SGreg Clayton #include "lldb/API/SBFileSpec.h"
4026036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h"
4126036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h"
42b9c1b51eSKate Stone #include "lldb/API/SBStream.h"
43b9c1b51eSKate Stone #include "lldb/API/SBStringList.h"
4475930019STodd Fiala #include "lldb/API/SBStructuredData.h"
454c5de699SEli Friedman #include "lldb/API/SBThread.h"
46a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h"
47802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h"
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner using namespace lldb;
5030fdc8d8SChris Lattner using namespace lldb_private;
5130fdc8d8SChris Lattner 
52b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {}
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner //----------------------------------------------------------------------
5530fdc8d8SChris Lattner // SBProcess constructor
5630fdc8d8SChris Lattner //----------------------------------------------------------------------
5730fdc8d8SChris Lattner 
58b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {}
5930fdc8d8SChris Lattner 
60b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp)
61b9c1b51eSKate Stone     : m_opaque_wp(process_sp) {}
6230fdc8d8SChris Lattner 
63b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) {
64efabb123SGreg Clayton   if (this != &rhs)
654e0fe8abSGreg Clayton     m_opaque_wp = rhs.m_opaque_wp;
66efabb123SGreg Clayton   return *this;
67efabb123SGreg Clayton }
68efabb123SGreg Clayton 
6930fdc8d8SChris Lattner //----------------------------------------------------------------------
7030fdc8d8SChris Lattner // Destructor
7130fdc8d8SChris Lattner //----------------------------------------------------------------------
72b9c1b51eSKate Stone SBProcess::~SBProcess() {}
7330fdc8d8SChris Lattner 
74b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() {
754bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
764bddaeb5SJim Ingham }
774bddaeb5SJim Ingham 
78b9c1b51eSKate Stone const char *SBProcess::GetPluginName() {
79d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
80b9c1b51eSKate Stone   if (process_sp) {
8157abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
82d7b30ef9SJim Ingham   }
83d7b30ef9SJim Ingham   return "<Unknown>";
84d7b30ef9SJim Ingham }
85d7b30ef9SJim Ingham 
86b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() {
87d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
88b9c1b51eSKate Stone   if (process_sp) {
8957abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
90d7b30ef9SJim Ingham   }
91d7b30ef9SJim Ingham   return "<Unknown>";
92d7b30ef9SJim Ingham }
93d7b30ef9SJim Ingham 
94b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); }
95d7b30ef9SJim Ingham 
96b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; }
97b9556accSGreg Clayton 
98b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); }
9930fdc8d8SChris Lattner 
100b9c1b51eSKate Stone bool SBProcess::IsValid() const {
1014fc6cb9cSJim Ingham   ProcessSP process_sp(m_opaque_wp.lock());
1024fc6cb9cSJim Ingham   return ((bool)process_sp && process_sp->IsValid());
10330fdc8d8SChris Lattner }
10430fdc8d8SChris Lattner 
105b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp,
106b9c1b51eSKate Stone                              const char *stdin_path, const char *stdout_path,
1079631aae2SJames McIlree                              const char *stderr_path,
1089631aae2SJames McIlree                              const char *working_directory,
109b9c1b51eSKate Stone                              uint32_t launch_flags, bool stop_at_entry,
110b9c1b51eSKate Stone                              lldb::SBError &error) {
1115160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
112324a1036SSaleem Abdulrasool   if (log)
113b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, "
114b9c1b51eSKate Stone                 "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, "
115b9c1b51eSKate Stone                 "stop_at_entry=%i, &error (%p))...",
116324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_wp.lock().get()),
117324a1036SSaleem Abdulrasool                 static_cast<void *>(argv), static_cast<void *>(envp),
1189631aae2SJames McIlree                 stdin_path ? stdin_path : "NULL",
1199631aae2SJames McIlree                 stdout_path ? stdout_path : "NULL",
1209631aae2SJames McIlree                 stderr_path ? stderr_path : "NULL",
121b9c1b51eSKate Stone                 working_directory ? working_directory : "NULL", launch_flags,
122b9c1b51eSKate Stone                 stop_at_entry, static_cast<void *>(error.get()));
1239631aae2SJames McIlree 
124acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
125b9c1b51eSKate Stone   if (process_sp) {
126b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
127b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
128b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
129982c9762SGreg Clayton       if (stop_at_entry)
130982c9762SGreg Clayton         launch_flags |= eLaunchFlagStopAtEntry;
131b9c1b51eSKate Stone       ProcessLaunchInfo launch_info(
132b9c1b51eSKate Stone           FileSpec{stdin_path, false}, FileSpec{stdout_path, false},
133b9c1b51eSKate Stone           FileSpec{stderr_path, false}, FileSpec{working_directory, false},
134982c9762SGreg Clayton           launch_flags);
135acdbe816SGreg Clayton       Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
136982c9762SGreg Clayton       if (exe_module)
13714715c68SGreg Clayton         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
138982c9762SGreg Clayton       if (argv)
139982c9762SGreg Clayton         launch_info.GetArguments().AppendArguments(argv);
140982c9762SGreg Clayton       if (envp)
141982c9762SGreg Clayton         launch_info.GetEnvironmentEntries().SetArguments(envp);
142acdbe816SGreg Clayton       error.SetError(process_sp->Launch(launch_info));
143b9c1b51eSKate Stone     } else {
1449631aae2SJames McIlree       error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
1459631aae2SJames McIlree     }
146b9c1b51eSKate Stone   } else {
1479631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1489631aae2SJames McIlree   }
1499631aae2SJames McIlree 
1509631aae2SJames McIlree   if (log) {
1519631aae2SJames McIlree     SBStream sstr;
1529631aae2SJames McIlree     error.GetDescription(sstr);
153324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
154324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
155324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1569631aae2SJames McIlree   }
1579631aae2SJames McIlree 
1589631aae2SJames McIlree   return error.Success();
1599631aae2SJames McIlree }
1609631aae2SJames McIlree 
161b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
162b9c1b51eSKate Stone                                             lldb::SBError &error) {
163acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
164b9c1b51eSKate Stone   if (process_sp) {
165b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
166b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
167b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
168144f3a9cSGreg Clayton       ProcessAttachInfo attach_info;
169144f3a9cSGreg Clayton       attach_info.SetProcessID(pid);
170acdbe816SGreg Clayton       error.SetError(process_sp->Attach(attach_info));
171b9c1b51eSKate Stone     } else {
172b9c1b51eSKate Stone       error.SetErrorString(
173b9c1b51eSKate Stone           "must be in eStateConnected to call RemoteAttachToProcessWithID");
1749631aae2SJames McIlree     }
175b9c1b51eSKate Stone   } else {
1769631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1779631aae2SJames McIlree   }
1789631aae2SJames McIlree 
1795160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1809631aae2SJames McIlree   if (log) {
1819631aae2SJames McIlree     SBStream sstr;
1829631aae2SJames McIlree     error.GetDescription(sstr);
183b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64
184b9c1b51eSKate Stone                 ") => SBError (%p): %s",
185324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), pid,
186324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1879631aae2SJames McIlree   }
1889631aae2SJames McIlree 
1899631aae2SJames McIlree   return error.Success();
1909631aae2SJames McIlree }
1919631aae2SJames McIlree 
192b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() {
1935160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
194ceb6b139SCaroline Tice 
195ceb6b139SCaroline Tice   uint32_t num_threads = 0;
196acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
197b9c1b51eSKate Stone   if (process_sp) {
1987fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1997fdf9ef1SGreg Clayton 
2007fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
201b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
202b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
203acdbe816SGreg Clayton     num_threads = process_sp->GetThreadList().GetSize(can_update);
20430fdc8d8SChris Lattner   }
205ceb6b139SCaroline Tice 
206ceb6b139SCaroline Tice   if (log)
207324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumThreads () => %d",
208324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_threads);
209ceb6b139SCaroline Tice 
210ceb6b139SCaroline Tice   return num_threads;
21130fdc8d8SChris Lattner }
21230fdc8d8SChris Lattner 
213b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const {
2145160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
215ceb6b139SCaroline Tice 
21630fdc8d8SChris Lattner   SBThread sb_thread;
21717a6ad05SGreg Clayton   ThreadSP thread_sp;
218acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
219b9c1b51eSKate Stone   if (process_sp) {
220b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
221b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
222acdbe816SGreg Clayton     thread_sp = process_sp->GetThreadList().GetSelectedThread();
22317a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
224af67cecdSGreg Clayton   }
225ceb6b139SCaroline Tice 
226ceb6b139SCaroline Tice   if (log)
227324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
228324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
229324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
230ceb6b139SCaroline Tice 
23130fdc8d8SChris Lattner   return sb_thread;
23230fdc8d8SChris Lattner }
23330fdc8d8SChris Lattner 
234b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
235b9c1b51eSKate Stone                                          lldb::addr_t context) {
2365160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
237a4d8747dSGreg Clayton 
238a4d8747dSGreg Clayton   SBThread sb_thread;
239a4d8747dSGreg Clayton   ThreadSP thread_sp;
240a4d8747dSGreg Clayton   ProcessSP process_sp(GetSP());
241b9c1b51eSKate Stone   if (process_sp) {
242b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
243b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
244a4d8747dSGreg Clayton     thread_sp = process_sp->CreateOSPluginThread(tid, context);
245a4d8747dSGreg Clayton     sb_thread.SetThread(thread_sp);
246a4d8747dSGreg Clayton   }
247a4d8747dSGreg Clayton 
248a4d8747dSGreg Clayton   if (log)
249b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64
250b9c1b51eSKate Stone                 ", context=0x%" PRIx64 ") => SBThread(%p)",
251324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid, context,
252324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
253a4d8747dSGreg Clayton 
254a4d8747dSGreg Clayton   return sb_thread;
255a4d8747dSGreg Clayton }
256a4d8747dSGreg Clayton 
257b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const {
2585160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
259ceb6b139SCaroline Tice 
26030fdc8d8SChris Lattner   SBTarget sb_target;
261b9556accSGreg Clayton   TargetSP target_sp;
262acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
263b9c1b51eSKate Stone   if (process_sp) {
264acdbe816SGreg Clayton     target_sp = process_sp->GetTarget().shared_from_this();
265b9556accSGreg Clayton     sb_target.SetSP(target_sp);
266b9556accSGreg Clayton   }
267ceb6b139SCaroline Tice 
268ceb6b139SCaroline Tice   if (log)
269324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)",
270324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
271324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
272ceb6b139SCaroline Tice 
27330fdc8d8SChris Lattner   return sb_target;
27430fdc8d8SChris Lattner }
27530fdc8d8SChris Lattner 
276b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
2775160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
278ceb6b139SCaroline Tice 
279ceb6b139SCaroline Tice   size_t ret_val = 0;
280acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
281b9c1b51eSKate Stone   if (process_sp) {
28230fdc8d8SChris Lattner     Error error;
283acdbe816SGreg Clayton     ret_val = process_sp->PutSTDIN(src, src_len, error);
28430fdc8d8SChris Lattner   }
285ceb6b139SCaroline Tice 
286ceb6b139SCaroline Tice   if (log)
287b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64
288b9c1b51eSKate Stone                 ") => %" PRIu64,
289324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), src,
290b9c1b51eSKate Stone                 static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val));
291ceb6b139SCaroline Tice 
292ceb6b139SCaroline Tice   return ret_val;
29330fdc8d8SChris Lattner }
29430fdc8d8SChris Lattner 
295b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
296cfd1acedSGreg Clayton   size_t bytes_read = 0;
297acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
298b9c1b51eSKate Stone   if (process_sp) {
29930fdc8d8SChris Lattner     Error error;
300acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
30130fdc8d8SChris Lattner   }
302ceb6b139SCaroline Tice 
3035160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
304ceb6b139SCaroline Tice   if (log)
305b9c1b51eSKate Stone     log->Printf(
306b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64
307b9c1b51eSKate Stone         ") => %" PRIu64,
308b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
309b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
310ceb6b139SCaroline Tice 
311cfd1acedSGreg Clayton   return bytes_read;
31230fdc8d8SChris Lattner }
31330fdc8d8SChris Lattner 
314b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
315cfd1acedSGreg Clayton   size_t bytes_read = 0;
316acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
317b9c1b51eSKate Stone   if (process_sp) {
31830fdc8d8SChris Lattner     Error error;
319acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
32030fdc8d8SChris Lattner   }
321ceb6b139SCaroline Tice 
3225160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
323ceb6b139SCaroline Tice   if (log)
324b9c1b51eSKate Stone     log->Printf(
325b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64
326b9c1b51eSKate Stone         ") => %" PRIu64,
327b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
328b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
329ceb6b139SCaroline Tice 
330cfd1acedSGreg Clayton   return bytes_read;
33130fdc8d8SChris Lattner }
33230fdc8d8SChris Lattner 
333b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
334ab3b8b22SHan Ming Ong   size_t bytes_read = 0;
335ab3b8b22SHan Ming Ong   ProcessSP process_sp(GetSP());
336b9c1b51eSKate Stone   if (process_sp) {
337ab3b8b22SHan Ming Ong     Error error;
338ab3b8b22SHan Ming Ong     bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
339ab3b8b22SHan Ming Ong   }
340ab3b8b22SHan Ming Ong 
3415160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
342ab3b8b22SHan Ming Ong   if (log)
343b9c1b51eSKate Stone     log->Printf(
344b9c1b51eSKate Stone         "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64
345b9c1b51eSKate Stone         ") => %" PRIu64,
346b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
347b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
348ab3b8b22SHan Ming Ong 
349ab3b8b22SHan Ming Ong   return bytes_read;
350ab3b8b22SHan Ming Ong }
351ab3b8b22SHan Ming Ong 
352b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
35330fdc8d8SChris Lattner   if (out == NULL)
35430fdc8d8SChris Lattner     return;
35530fdc8d8SChris Lattner 
356acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
357b9c1b51eSKate Stone   if (process_sp) {
35830fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
35930fdc8d8SChris Lattner     char message[1024];
360b9c1b51eSKate Stone     int message_len = ::snprintf(
361b9c1b51eSKate Stone         message, sizeof(message), "Process %" PRIu64 " %s\n",
362b9c1b51eSKate Stone         process_sp->GetID(), SBDebugger::StateAsCString(event_state));
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner     if (message_len > 0)
36530fdc8d8SChris Lattner       ::fwrite(message, 1, message_len, out);
36630fdc8d8SChris Lattner   }
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
369b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event,
370b9c1b51eSKate Stone                                        SBCommandReturnObject &result) {
371acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
372b9c1b51eSKate Stone   if (process_sp) {
37330fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
37430fdc8d8SChris Lattner     char message[1024];
375b9c1b51eSKate Stone     ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
376b9c1b51eSKate Stone                process_sp->GetID(), SBDebugger::StateAsCString(event_state));
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner     result.AppendMessage(message);
37930fdc8d8SChris Lattner   }
38030fdc8d8SChris Lattner }
38130fdc8d8SChris Lattner 
382b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) {
383acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
384b9c1b51eSKate Stone   if (process_sp) {
385b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
386b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
387b9c1b51eSKate Stone     return process_sp->GetThreadList().SetSelectedThreadByID(
388b9c1b51eSKate Stone         thread.GetThreadID());
389af67cecdSGreg Clayton   }
39030fdc8d8SChris Lattner   return false;
39130fdc8d8SChris Lattner }
39230fdc8d8SChris Lattner 
393b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
3945160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
395ceb6b139SCaroline Tice 
396ceb6b139SCaroline Tice   bool ret_val = false;
397acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
398b9c1b51eSKate Stone   if (process_sp) {
399b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
400b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
401acdbe816SGreg Clayton     ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
402af67cecdSGreg Clayton   }
403ceb6b139SCaroline Tice 
404ceb6b139SCaroline Tice   if (log)
405b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64
406b9c1b51eSKate Stone                 ") => %s",
407324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
408324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
409ceb6b139SCaroline Tice 
410ceb6b139SCaroline Tice   return ret_val;
41130fdc8d8SChris Lattner }
41230fdc8d8SChris Lattner 
413b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
4145160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
41518b46896SJim Ingham 
41618b46896SJim Ingham   bool ret_val = false;
41718b46896SJim Ingham   ProcessSP process_sp(GetSP());
418b9c1b51eSKate Stone   if (process_sp) {
419b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
420b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
42118b46896SJim Ingham     ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
42218b46896SJim Ingham   }
42318b46896SJim Ingham 
42418b46896SJim Ingham   if (log)
42518b46896SJim Ingham     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
426324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
427324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
42818b46896SJim Ingham 
42918b46896SJim Ingham   return ret_val;
43018b46896SJim Ingham }
43118b46896SJim Ingham 
432b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) {
4335160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
434ceb6b139SCaroline Tice 
43517a6ad05SGreg Clayton   SBThread sb_thread;
43617a6ad05SGreg Clayton   ThreadSP thread_sp;
437acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
438b9c1b51eSKate Stone   if (process_sp) {
4397fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
4407fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
441b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
442b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
4437fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
44417a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
445af67cecdSGreg Clayton   }
446ceb6b139SCaroline Tice 
447ceb6b139SCaroline Tice   if (log)
44893aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
449324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
450324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
451324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
452ceb6b139SCaroline Tice 
45317a6ad05SGreg Clayton   return sb_thread;
45430fdc8d8SChris Lattner }
45530fdc8d8SChris Lattner 
456b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() {
4575e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4585e8dce4dSJason Molenda 
4595e8dce4dSJason Molenda   uint32_t num_queues = 0;
4605e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
461b9c1b51eSKate Stone   if (process_sp) {
4625e8dce4dSJason Molenda     Process::StopLocker stop_locker;
463b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
464b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
465b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
4665e8dce4dSJason Molenda       num_queues = process_sp->GetQueueList().GetSize();
4675e8dce4dSJason Molenda     }
468a61d0a5bSGreg Clayton   }
4695e8dce4dSJason Molenda 
4705e8dce4dSJason Molenda   if (log)
471324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumQueues () => %d",
472324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_queues);
4735e8dce4dSJason Molenda 
4745e8dce4dSJason Molenda   return num_queues;
4755e8dce4dSJason Molenda }
4765e8dce4dSJason Molenda 
477b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) {
4785e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4795e8dce4dSJason Molenda 
4805e8dce4dSJason Molenda   SBQueue sb_queue;
4815e8dce4dSJason Molenda   QueueSP queue_sp;
4825e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
483b9c1b51eSKate Stone   if (process_sp) {
4845e8dce4dSJason Molenda     Process::StopLocker stop_locker;
485b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
486b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
487b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
4885e8dce4dSJason Molenda       queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
4895e8dce4dSJason Molenda       sb_queue.SetQueue(queue_sp);
4905e8dce4dSJason Molenda     }
491a61d0a5bSGreg Clayton   }
4925e8dce4dSJason Molenda 
4935e8dce4dSJason Molenda   if (log)
4945e8dce4dSJason Molenda     log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
495324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
496324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
497324a1036SSaleem Abdulrasool                 static_cast<void *>(queue_sp.get()));
4985e8dce4dSJason Molenda 
4995e8dce4dSJason Molenda   return sb_queue;
5005e8dce4dSJason Molenda }
5015e8dce4dSJason Molenda 
502b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) {
503bf2956a2SJim Ingham   ProcessSP process_sp(GetSP());
504b9c1b51eSKate Stone   if (process_sp) {
505b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
506b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
507bf2956a2SJim Ingham     if (include_expression_stops)
508bf2956a2SJim Ingham       return process_sp->GetStopID();
509bf2956a2SJim Ingham     else
510bf2956a2SJim Ingham       return process_sp->GetLastNaturalStopID();
511bf2956a2SJim Ingham   }
512bf2956a2SJim Ingham   return 0;
513bf2956a2SJim Ingham }
514bf2956a2SJim Ingham 
515b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
51638810f43SIlia K   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
51738810f43SIlia K 
51838810f43SIlia K   SBEvent sb_event;
51938810f43SIlia K   EventSP event_sp;
52038810f43SIlia K   ProcessSP process_sp(GetSP());
521b9c1b51eSKate Stone   if (process_sp) {
522b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
523b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
52438810f43SIlia K     event_sp = process_sp->GetStopEventForStopID(stop_id);
52538810f43SIlia K     sb_event.reset(event_sp);
52638810f43SIlia K   }
52738810f43SIlia K 
52838810f43SIlia K   if (log)
529b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32
530b9c1b51eSKate Stone                 ") => SBEvent(%p)",
531b9c1b51eSKate Stone                 static_cast<void *>(process_sp.get()), stop_id,
53238810f43SIlia K                 static_cast<void *>(event_sp.get()));
53338810f43SIlia K 
53438810f43SIlia K   return sb_event;
53538810f43SIlia K }
53638810f43SIlia K 
537b9c1b51eSKate Stone StateType SBProcess::GetState() {
538ceb6b139SCaroline Tice 
539ceb6b139SCaroline Tice   StateType ret_val = eStateInvalid;
540acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
541b9c1b51eSKate Stone   if (process_sp) {
542b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
543b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
544acdbe816SGreg Clayton     ret_val = process_sp->GetState();
545af67cecdSGreg Clayton   }
546ceb6b139SCaroline Tice 
5475160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
548ceb6b139SCaroline Tice   if (log)
549cfd1acedSGreg Clayton     log->Printf("SBProcess(%p)::GetState () => %s",
550324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
551750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
552ceb6b139SCaroline Tice 
553ceb6b139SCaroline Tice   return ret_val;
55430fdc8d8SChris Lattner }
55530fdc8d8SChris Lattner 
556b9c1b51eSKate Stone int SBProcess::GetExitStatus() {
5574838131bSGreg Clayton   int exit_status = 0;
558acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
559b9c1b51eSKate Stone   if (process_sp) {
560b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
561b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
562acdbe816SGreg Clayton     exit_status = process_sp->GetExitStatus();
563af67cecdSGreg Clayton   }
5645160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5654838131bSGreg Clayton   if (log)
5664838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
567324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_status,
568324a1036SSaleem Abdulrasool                 exit_status);
5694838131bSGreg Clayton 
5704838131bSGreg Clayton   return exit_status;
57130fdc8d8SChris Lattner }
57230fdc8d8SChris Lattner 
573b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() {
5744838131bSGreg Clayton   const char *exit_desc = NULL;
575acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
576b9c1b51eSKate Stone   if (process_sp) {
577b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
578b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
579acdbe816SGreg Clayton     exit_desc = process_sp->GetExitDescription();
580af67cecdSGreg Clayton   }
5815160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5824838131bSGreg Clayton   if (log)
5834838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitDescription () => %s",
584324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_desc);
5854838131bSGreg Clayton   return exit_desc;
58630fdc8d8SChris Lattner }
58730fdc8d8SChris Lattner 
588b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() {
589ceb6b139SCaroline Tice   lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
590acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
591acdbe816SGreg Clayton   if (process_sp)
592acdbe816SGreg Clayton     ret_val = process_sp->GetID();
593ceb6b139SCaroline Tice 
5945160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
595ceb6b139SCaroline Tice   if (log)
596324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64,
597324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
598ceb6b139SCaroline Tice 
599ceb6b139SCaroline Tice   return ret_val;
60030fdc8d8SChris Lattner }
60130fdc8d8SChris Lattner 
602b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() {
603949e8221SGreg Clayton   uint32_t ret_val = 0;
604949e8221SGreg Clayton   ProcessSP process_sp(GetSP());
605949e8221SGreg Clayton   if (process_sp)
606949e8221SGreg Clayton     ret_val = process_sp->GetUniqueID();
6075160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
608949e8221SGreg Clayton   if (log)
609324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32,
610324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
611949e8221SGreg Clayton   return ret_val;
612949e8221SGreg Clayton }
613949e8221SGreg Clayton 
614b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const {
615cf386e24SJohnny Chen   ByteOrder byteOrder = eByteOrderInvalid;
616acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
617acdbe816SGreg Clayton   if (process_sp)
618acdbe816SGreg Clayton     byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
619cf386e24SJohnny Chen 
6205160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
621cf386e24SJohnny Chen   if (log)
622324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetByteOrder () => %d",
623324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), byteOrder);
624cf386e24SJohnny Chen 
625cf386e24SJohnny Chen   return byteOrder;
626cf386e24SJohnny Chen }
627cf386e24SJohnny Chen 
628b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const {
629ceb6b139SCaroline Tice   uint32_t size = 0;
630acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
631acdbe816SGreg Clayton   if (process_sp)
632acdbe816SGreg Clayton     size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
633ceb6b139SCaroline Tice 
6345160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
635ceb6b139SCaroline Tice   if (log)
636324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetAddressByteSize () => %d",
637324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), size);
638ceb6b139SCaroline Tice 
639ceb6b139SCaroline Tice   return size;
64030fdc8d8SChris Lattner }
64130fdc8d8SChris Lattner 
642b9c1b51eSKate Stone SBError SBProcess::Continue() {
6435160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
644ceb6b139SCaroline Tice 
64530fdc8d8SChris Lattner   SBError sb_error;
646acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
6470c74e78dSGreg Clayton 
648acdbe816SGreg Clayton   if (log)
649324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue ()...",
650324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()));
651acdbe816SGreg Clayton 
652b9c1b51eSKate Stone   if (process_sp) {
653b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
654b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
655acdbe816SGreg Clayton 
656dc6224e0SGreg Clayton     if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
657dc6224e0SGreg Clayton       sb_error.ref() = process_sp->Resume();
658dc6224e0SGreg Clayton     else
659dc6224e0SGreg Clayton       sb_error.ref() = process_sp->ResumeSynchronous(NULL);
660b9c1b51eSKate Stone   } else
66130fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
66230fdc8d8SChris Lattner 
663b9c1b51eSKate Stone   if (log) {
664ceb6b139SCaroline Tice     SBStream sstr;
665ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
666324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s",
667324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
668324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
669ceb6b139SCaroline Tice   }
670ceb6b139SCaroline Tice 
67130fdc8d8SChris Lattner   return sb_error;
67230fdc8d8SChris Lattner }
67330fdc8d8SChris Lattner 
674b9c1b51eSKate Stone SBError SBProcess::Destroy() {
67530fdc8d8SChris Lattner   SBError sb_error;
676acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
677b9c1b51eSKate Stone   if (process_sp) {
678b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
679b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
680ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(false));
681b9c1b51eSKate Stone   } else
68230fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
68330fdc8d8SChris Lattner 
6845160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
685b9c1b51eSKate Stone   if (log) {
6864838131bSGreg Clayton     SBStream sstr;
6874838131bSGreg Clayton     sb_error.GetDescription(sstr);
6886779606aSGreg Clayton     log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s",
689324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
690324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
6914838131bSGreg Clayton   }
6924838131bSGreg Clayton 
69330fdc8d8SChris Lattner   return sb_error;
69430fdc8d8SChris Lattner }
69530fdc8d8SChris Lattner 
696b9c1b51eSKate Stone SBError SBProcess::Stop() {
69730fdc8d8SChris Lattner   SBError sb_error;
698acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
699b9c1b51eSKate Stone   if (process_sp) {
700b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
701b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
702acdbe816SGreg Clayton     sb_error.SetError(process_sp->Halt());
703b9c1b51eSKate Stone   } else
70430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
705ceb6b139SCaroline Tice 
7065160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
707b9c1b51eSKate Stone   if (log) {
708ceb6b139SCaroline Tice     SBStream sstr;
709ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
71093aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s",
711324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
712324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
713ceb6b139SCaroline Tice   }
714ceb6b139SCaroline Tice 
71530fdc8d8SChris Lattner   return sb_error;
71630fdc8d8SChris Lattner }
71730fdc8d8SChris Lattner 
718b9c1b51eSKate Stone SBError SBProcess::Kill() {
71930fdc8d8SChris Lattner   SBError sb_error;
720acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
721b9c1b51eSKate Stone   if (process_sp) {
722b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
723b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
724ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(true));
725b9c1b51eSKate Stone   } else
72630fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
727ceb6b139SCaroline Tice 
7285160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
729b9c1b51eSKate Stone   if (log) {
730ceb6b139SCaroline Tice     SBStream sstr;
731ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
73293aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s",
733324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
734324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
735ceb6b139SCaroline Tice   }
736ceb6b139SCaroline Tice 
73730fdc8d8SChris Lattner   return sb_error;
73830fdc8d8SChris Lattner }
73930fdc8d8SChris Lattner 
740b9c1b51eSKate Stone SBError SBProcess::Detach() {
741acff8950SJim Ingham   // FIXME: This should come from a process default.
742acff8950SJim Ingham   bool keep_stopped = false;
743acff8950SJim Ingham   return Detach(keep_stopped);
744acff8950SJim Ingham }
745acff8950SJim Ingham 
746b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) {
74730fdc8d8SChris Lattner   SBError sb_error;
748acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
749b9c1b51eSKate Stone   if (process_sp) {
750b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
751b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
752acff8950SJim Ingham     sb_error.SetError(process_sp->Detach(keep_stopped));
753b9c1b51eSKate Stone   } else
75430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
75530fdc8d8SChris Lattner 
75630fdc8d8SChris Lattner   return sb_error;
75730fdc8d8SChris Lattner }
75830fdc8d8SChris Lattner 
759b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) {
76030fdc8d8SChris Lattner   SBError sb_error;
761acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
762b9c1b51eSKate Stone   if (process_sp) {
763b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
764b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
765acdbe816SGreg Clayton     sb_error.SetError(process_sp->Signal(signo));
766b9c1b51eSKate Stone   } else
76730fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
7685160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
769b9c1b51eSKate Stone   if (log) {
7704838131bSGreg Clayton     SBStream sstr;
7714838131bSGreg Clayton     sb_error.GetDescription(sstr);
7724838131bSGreg Clayton     log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
773324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), signo,
774324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7754838131bSGreg Clayton   }
77630fdc8d8SChris Lattner   return sb_error;
77730fdc8d8SChris Lattner }
77830fdc8d8SChris Lattner 
779b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() {
78098d0a4b3SChaoren Lin   if (auto process_sp = GetSP())
78198d0a4b3SChaoren Lin     return SBUnixSignals{process_sp};
782802dc402STodd Fiala 
78398d0a4b3SChaoren Lin   return {};
784802dc402STodd Fiala }
785802dc402STodd Fiala 
786b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() {
787cfc0935eSJim Ingham   ProcessSP process_sp(GetSP());
788b9c1b51eSKate Stone   if (process_sp) {
789cfc0935eSJim Ingham     process_sp->SendAsyncInterrupt();
790cfc0935eSJim Ingham   }
791cfc0935eSJim Ingham }
792cfc0935eSJim Ingham 
793b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) {
7944838131bSGreg Clayton   SBThread sb_thread;
79517a6ad05SGreg Clayton   ThreadSP thread_sp;
796acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
797b9c1b51eSKate Stone   if (process_sp) {
7987fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
7997fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
800b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
801b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
8027fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
80317a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
804af67cecdSGreg Clayton   }
8054838131bSGreg Clayton 
8065160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
8074838131bSGreg Clayton   if (log)
808b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64
809b9c1b51eSKate Stone                 ") => SBThread (%p)",
810324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
811324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
8124838131bSGreg Clayton 
8134838131bSGreg Clayton   return sb_thread;
81430fdc8d8SChris Lattner }
81530fdc8d8SChris Lattner 
816b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
81718b46896SJim Ingham   SBThread sb_thread;
81818b46896SJim Ingham   ThreadSP thread_sp;
81918b46896SJim Ingham   ProcessSP process_sp(GetSP());
820b9c1b51eSKate Stone   if (process_sp) {
82118b46896SJim Ingham     Process::StopLocker stop_locker;
82218b46896SJim Ingham     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
823b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
824b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
825b9c1b51eSKate Stone     thread_sp =
826b9c1b51eSKate Stone         process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
82718b46896SJim Ingham     sb_thread.SetThread(thread_sp);
82818b46896SJim Ingham   }
82918b46896SJim Ingham 
8305160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
83118b46896SJim Ingham   if (log)
83218b46896SJim Ingham     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
833324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
834324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
83518b46896SJim Ingham 
83618b46896SJim Ingham   return sb_thread;
83718b46896SJim Ingham }
83818b46896SJim Ingham 
839b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
8405160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
841ceb6b139SCaroline Tice 
842ceb6b139SCaroline Tice   StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
843ceb6b139SCaroline Tice 
844ceb6b139SCaroline Tice   if (log)
845324a1036SSaleem Abdulrasool     log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
846324a1036SSaleem Abdulrasool                 static_cast<void *>(event.get()),
847750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
848ceb6b139SCaroline Tice 
849ceb6b139SCaroline Tice   return ret_val;
85030fdc8d8SChris Lattner }
85130fdc8d8SChris Lattner 
852b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
853ea2cc5e0SPavel Labath   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
854ea2cc5e0SPavel Labath 
855ea2cc5e0SPavel Labath   bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
856ea2cc5e0SPavel Labath 
857ea2cc5e0SPavel Labath   if (log)
858400e1809SHans Wennborg     log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
859400e1809SHans Wennborg                 static_cast<void *>(event.get()), ret_val);
860ea2cc5e0SPavel Labath 
861ea2cc5e0SPavel Labath   return ret_val;
86230fdc8d8SChris Lattner }
86330fdc8d8SChris Lattner 
864b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
8650161b49cSJim Ingham   return Process::ProcessEventData::GetNumRestartedReasons(event.get());
8660161b49cSJim Ingham }
8670161b49cSJim Ingham 
8680161b49cSJim Ingham const char *
869b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
870b9c1b51eSKate Stone                                               size_t idx) {
8710161b49cSJim Ingham   return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
8720161b49cSJim Ingham }
8730161b49cSJim Ingham 
874b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
87575930019STodd Fiala   ProcessSP process_sp =
87675930019STodd Fiala       Process::ProcessEventData::GetProcessFromEvent(event.get());
877b9c1b51eSKate Stone   if (!process_sp) {
87875930019STodd Fiala     // StructuredData events also know the process they come from.
87975930019STodd Fiala     // Try that.
88075930019STodd Fiala     process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
88175930019STodd Fiala   }
88275930019STodd Fiala 
88375930019STodd Fiala   return SBProcess(process_sp);
88430fdc8d8SChris Lattner }
88530fdc8d8SChris Lattner 
886b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
88706d2855fSIlia K   return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
88806d2855fSIlia K }
88906d2855fSIlia K 
89075930019STodd Fiala lldb::SBStructuredData
891b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
89275930019STodd Fiala   return SBStructuredData(event.GetSP());
89375930019STodd Fiala }
89475930019STodd Fiala 
895b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
89675930019STodd Fiala   return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
89775930019STodd Fiala          !EventIsStructuredDataEvent(event);
89875930019STodd Fiala }
89975930019STodd Fiala 
900b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
90175930019STodd Fiala   EventSP event_sp = event.GetSP();
90275930019STodd Fiala   EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
903b9c1b51eSKate Stone   return event_data && (event_data->GetFlavor() ==
904b9c1b51eSKate Stone                         EventDataStructuredData::GetFlavorString());
905e6bc6cb9SJim Ingham }
90630fdc8d8SChris Lattner 
907b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const {
9085160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
909ceb6b139SCaroline Tice 
910acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
911acdbe816SGreg Clayton 
912acdbe816SGreg Clayton   SBBroadcaster broadcaster(process_sp.get(), false);
913ceb6b139SCaroline Tice 
914ceb6b139SCaroline Tice   if (log)
915324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
916324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
917324a1036SSaleem Abdulrasool                 static_cast<void *>(broadcaster.get()));
918ceb6b139SCaroline Tice 
91930fdc8d8SChris Lattner   return broadcaster;
92030fdc8d8SChris Lattner }
92130fdc8d8SChris Lattner 
922b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() {
9234bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
9244bddaeb5SJim Ingham }
9254bddaeb5SJim Ingham 
926b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
927b9c1b51eSKate Stone                              SBError &sb_error) {
9285160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
929ceb6b139SCaroline Tice 
93030fdc8d8SChris Lattner   size_t bytes_read = 0;
93130fdc8d8SChris Lattner 
932acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
933acdbe816SGreg Clayton 
9344838131bSGreg Clayton   if (log)
935b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
936b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
937324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
938324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
939324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
9404838131bSGreg Clayton 
941b9c1b51eSKate Stone   if (process_sp) {
9427fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
943b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
944b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
945b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
9467fdf9ef1SGreg Clayton       bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
947b9c1b51eSKate Stone     } else {
948c9858e4dSGreg Clayton       if (log)
949324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::ReadMemory() => error: process is running",
950324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
9517fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
9527fdf9ef1SGreg Clayton     }
953b9c1b51eSKate Stone   } else {
95430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
95530fdc8d8SChris Lattner   }
95630fdc8d8SChris Lattner 
957b9c1b51eSKate Stone   if (log) {
95893aa84e8SGreg Clayton     SBStream sstr;
95993aa84e8SGreg Clayton     sb_error.GetDescription(sstr);
960b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
961b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
962324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
963324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
964324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
965324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_read));
96693aa84e8SGreg Clayton   }
967ceb6b139SCaroline Tice 
96830fdc8d8SChris Lattner   return bytes_read;
96930fdc8d8SChris Lattner }
97030fdc8d8SChris Lattner 
971b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
972b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
973e91b7957SGreg Clayton   size_t bytes_read = 0;
974acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
975b9c1b51eSKate Stone   if (process_sp) {
9767fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
977b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
978b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
979b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
980b9c1b51eSKate Stone       bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
981b9c1b51eSKate Stone                                                      sb_error.ref());
982b9c1b51eSKate Stone     } else {
9835160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
984c9858e4dSGreg Clayton       if (log)
985b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process "
986b9c1b51eSKate Stone                     "is running",
987324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
9887fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
9897fdf9ef1SGreg Clayton     }
990b9c1b51eSKate Stone   } else {
991e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
992e91b7957SGreg Clayton   }
993e91b7957SGreg Clayton   return bytes_read;
994e91b7957SGreg Clayton }
995e91b7957SGreg Clayton 
996b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
997b9c1b51eSKate Stone                                            lldb::SBError &sb_error) {
9987fdf9ef1SGreg Clayton   uint64_t value = 0;
999acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1000b9c1b51eSKate Stone   if (process_sp) {
10017fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1002b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1003b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1004b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1005b9c1b51eSKate Stone       value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
1006b9c1b51eSKate Stone                                                         sb_error.ref());
1007b9c1b51eSKate Stone     } else {
10085160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1009c9858e4dSGreg Clayton       if (log)
1010b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process "
1011b9c1b51eSKate Stone                     "is running",
1012324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10137fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10147fdf9ef1SGreg Clayton     }
1015b9c1b51eSKate Stone   } else {
1016e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1017e91b7957SGreg Clayton   }
10187fdf9ef1SGreg Clayton   return value;
1019e91b7957SGreg Clayton }
1020e91b7957SGreg Clayton 
1021b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
1022b9c1b51eSKate Stone                                               lldb::SBError &sb_error) {
1023e91b7957SGreg Clayton   lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1024acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1025b9c1b51eSKate Stone   if (process_sp) {
10267fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1027b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1028b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1029b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
10307fdf9ef1SGreg Clayton       ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
1031b9c1b51eSKate Stone     } else {
10325160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1033c9858e4dSGreg Clayton       if (log)
1034b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process "
1035b9c1b51eSKate Stone                     "is running",
1036324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10377fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10387fdf9ef1SGreg Clayton     }
1039b9c1b51eSKate Stone   } else {
1040e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1041e91b7957SGreg Clayton   }
1042e91b7957SGreg Clayton   return ptr;
1043e91b7957SGreg Clayton }
1044e91b7957SGreg Clayton 
1045b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
1046b9c1b51eSKate Stone                               SBError &sb_error) {
104730fdc8d8SChris Lattner   size_t bytes_written = 0;
104830fdc8d8SChris Lattner 
10495160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1050acdbe816SGreg Clayton 
1051acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1052acdbe816SGreg Clayton 
10534838131bSGreg Clayton   if (log)
1054b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1055b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1056324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1057b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1058324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
10594838131bSGreg Clayton 
1060b9c1b51eSKate Stone   if (process_sp) {
10617fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1062b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1063b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1064b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1065b9c1b51eSKate Stone       bytes_written =
1066b9c1b51eSKate Stone           process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
1067b9c1b51eSKate Stone     } else {
1068c9858e4dSGreg Clayton       if (log)
1069324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::WriteMemory() => error: process is running",
1070324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10717fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10727fdf9ef1SGreg Clayton     }
107330fdc8d8SChris Lattner   }
107430fdc8d8SChris Lattner 
1075b9c1b51eSKate Stone   if (log) {
10764838131bSGreg Clayton     SBStream sstr;
10774838131bSGreg Clayton     sb_error.GetDescription(sstr);
1078b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1079b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1080324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1081b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1082324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1083324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_written));
10844838131bSGreg Clayton   }
10854838131bSGreg Clayton 
108630fdc8d8SChris Lattner   return bytes_written;
108730fdc8d8SChris Lattner }
108830fdc8d8SChris Lattner 
1089b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) {
1090da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1091da7bc7d0SGreg Clayton 
1092acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1093b9c1b51eSKate Stone   if (process_sp) {
1094dde9cff3SCaroline Tice     char path[PATH_MAX];
1095dde9cff3SCaroline Tice     GetTarget().GetExecutable().GetPath(path, sizeof(path));
1096acdbe816SGreg Clayton     Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
10971d273166SGreg Clayton     const char *exe_name = NULL;
10981d273166SGreg Clayton     if (exe_module)
10991d273166SGreg Clayton       exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
11001d273166SGreg Clayton 
1101d01b2953SDaniel Malea     strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1102b9c1b51eSKate Stone                 process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1103b9c1b51eSKate Stone                 GetNumThreads(), exe_name ? ", executable = " : "",
11041d273166SGreg Clayton                 exe_name ? exe_name : "");
1105b9c1b51eSKate Stone   } else
1106da7bc7d0SGreg Clayton     strm.PutCString("No value");
1107dde9cff3SCaroline Tice 
1108dde9cff3SCaroline Tice   return true;
1109dde9cff3SCaroline Tice }
11108f343b09SGreg Clayton 
11118f343b09SGreg Clayton uint32_t
1112b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
11135160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1114f9ef60d2SJohnny Chen 
1115f9ef60d2SJohnny Chen   uint32_t num = 0;
1116f9ef60d2SJohnny Chen   ProcessSP process_sp(GetSP());
1117b9c1b51eSKate Stone   if (process_sp) {
1118b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1119b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1120f9ef60d2SJohnny Chen     sb_error.SetError(process_sp->GetWatchpointSupportInfo(num));
1121f9ef60d2SJohnny Chen     if (log)
1122f9ef60d2SJohnny Chen       log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1123324a1036SSaleem Abdulrasool                   static_cast<void *>(process_sp.get()), num);
1124b9c1b51eSKate Stone   } else {
1125f9ef60d2SJohnny Chen     sb_error.SetErrorString("SBProcess is invalid");
1126f9ef60d2SJohnny Chen   }
1127f9ef60d2SJohnny Chen   return num;
1128f9ef60d2SJohnny Chen }
1129f9ef60d2SJohnny Chen 
1130b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1131b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
11324fbd67acSTamas Berghammer   return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
11334fbd67acSTamas Berghammer }
11344fbd67acSTamas Berghammer 
1135b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
11364fbd67acSTamas Berghammer                               const lldb::SBFileSpec &sb_remote_image_spec,
1137b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1138acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1139b9c1b51eSKate Stone   if (process_sp) {
11407fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1141b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1142b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1143b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
11443cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1145b9c1b51eSKate Stone       return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1146b9c1b51eSKate Stone                                     *sb_remote_image_spec, sb_error.ref());
1147b9c1b51eSKate Stone     } else {
11485160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1149c9858e4dSGreg Clayton       if (log)
1150324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::LoadImage() => error: process is running",
1151324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11527fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11537fdf9ef1SGreg Clayton     }
11547fdf9ef1SGreg Clayton   }
11558f343b09SGreg Clayton   return LLDB_INVALID_IMAGE_TOKEN;
11568f343b09SGreg Clayton }
11578f343b09SGreg Clayton 
1158b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
11598f343b09SGreg Clayton   lldb::SBError sb_error;
1160acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1161b9c1b51eSKate Stone   if (process_sp) {
11627fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1163b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1164b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1165b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
11663cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1167b9c1b51eSKate Stone       sb_error.SetError(
1168b9c1b51eSKate Stone           platform_sp->UnloadImage(process_sp.get(), image_token));
1169b9c1b51eSKate Stone     } else {
11705160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1171c9858e4dSGreg Clayton       if (log)
1172324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::UnloadImage() => error: process is running",
1173324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11747fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11757fdf9ef1SGreg Clayton     }
1176b9c1b51eSKate Stone   } else
11778f343b09SGreg Clayton     sb_error.SetErrorString("invalid process");
11788f343b09SGreg Clayton   return sb_error;
11798f343b09SGreg Clayton }
11808c71337aSJason Molenda 
1181b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) {
1182a332978bSJason Molenda   lldb::SBError sb_error;
1183a332978bSJason Molenda   ProcessSP process_sp(GetSP());
1184b9c1b51eSKate Stone   if (process_sp) {
1185a332978bSJason Molenda     Process::StopLocker stop_locker;
1186b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1187b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1188b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1189a332978bSJason Molenda       sb_error.SetError(process_sp->SendEventData(event_data));
1190b9c1b51eSKate Stone     } else {
1191a332978bSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1192a332978bSJason Molenda       if (log)
1193b9c1b51eSKate Stone         log->Printf(
1194b9c1b51eSKate Stone             "SBProcess(%p)::SendEventData() => error: process is running",
1195324a1036SSaleem Abdulrasool             static_cast<void *>(process_sp.get()));
1196a332978bSJason Molenda       sb_error.SetErrorString("process is running");
1197a332978bSJason Molenda     }
1198b9c1b51eSKate Stone   } else
1199a332978bSJason Molenda     sb_error.SetErrorString("invalid process");
1200a332978bSJason Molenda   return sb_error;
1201a332978bSJason Molenda }
1202a332978bSJason Molenda 
1203b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
12048c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1205b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12068c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
120795d005c7SJason Molenda     return runtime->GetExtendedBacktraceTypes().size();
12088c71337aSJason Molenda   }
12098c71337aSJason Molenda   return 0;
12108c71337aSJason Molenda }
12118c71337aSJason Molenda 
1212b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
12138c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1214b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12158c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
1216b9c1b51eSKate Stone     const std::vector<ConstString> &names =
1217b9c1b51eSKate Stone         runtime->GetExtendedBacktraceTypes();
1218b9c1b51eSKate Stone     if (idx < names.size()) {
12198c71337aSJason Molenda       return names[idx].AsCString();
1220b9c1b51eSKate Stone     } else {
12218c71337aSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12228c71337aSJason Molenda       if (log)
1223b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => "
1224b9c1b51eSKate Stone                     "error: requested extended backtrace name out of bounds",
1225324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12268c71337aSJason Molenda     }
12278c71337aSJason Molenda   }
12288c71337aSJason Molenda   return NULL;
12298c71337aSJason Molenda }
1230a51ea382SKuba Brecka 
1231b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1232a51ea382SKuba Brecka   ProcessSP process_sp(GetSP());
1233a51ea382SKuba Brecka   SBThreadCollection threads;
1234b9c1b51eSKate Stone   if (process_sp) {
1235a51ea382SKuba Brecka     threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1236a51ea382SKuba Brecka   }
1237a51ea382SKuba Brecka   return threads;
1238a51ea382SKuba Brecka }
123963927548SKuba Brecka 
1240b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent(
1241b9c1b51eSKate Stone     InstrumentationRuntimeType type) {
124263927548SKuba Brecka   ProcessSP process_sp(GetSP());
124363927548SKuba Brecka   if (!process_sp)
124463927548SKuba Brecka     return false;
124563927548SKuba Brecka 
1246b9c1b51eSKate Stone   InstrumentationRuntimeSP runtime_sp =
1247b9c1b51eSKate Stone       process_sp->GetInstrumentationRuntime(type);
124863927548SKuba Brecka 
124963927548SKuba Brecka   if (!runtime_sp.get())
125063927548SKuba Brecka     return false;
125163927548SKuba Brecka 
125263927548SKuba Brecka   return runtime_sp->IsActive();
125363927548SKuba Brecka }
1254f7d1893fSAdrian McCarthy 
1255b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) {
1256f7d1893fSAdrian McCarthy   lldb::SBError error;
1257f7d1893fSAdrian McCarthy   ProcessSP process_sp(GetSP());
1258b9c1b51eSKate Stone   if (!process_sp) {
1259f7d1893fSAdrian McCarthy     error.SetErrorString("SBProcess is invalid");
1260f7d1893fSAdrian McCarthy     return error;
1261f7d1893fSAdrian McCarthy   }
1262f7d1893fSAdrian McCarthy 
1263b9c1b51eSKate Stone   std::lock_guard<std::recursive_mutex> guard(
1264b9c1b51eSKate Stone       process_sp->GetTarget().GetAPIMutex());
1265f7d1893fSAdrian McCarthy 
1266b9c1b51eSKate Stone   if (process_sp->GetState() != eStateStopped) {
1267f7d1893fSAdrian McCarthy     error.SetErrorString("the process is not stopped");
1268f7d1893fSAdrian McCarthy     return error;
1269f7d1893fSAdrian McCarthy   }
1270f7d1893fSAdrian McCarthy 
1271f7d1893fSAdrian McCarthy   FileSpec core_file(file_name, false);
1272f7d1893fSAdrian McCarthy   error.ref() = PluginManager::SaveCore(process_sp, core_file);
1273f7d1893fSAdrian McCarthy   return error;
1274f7d1893fSAdrian McCarthy }
127526036843SHoward Hellyer 
127626036843SHoward Hellyer lldb::SBError
1277b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1278b9c1b51eSKate Stone                                SBMemoryRegionInfo &sb_region_info) {
127926036843SHoward Hellyer   lldb::SBError sb_error;
128026036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1281b9c1b51eSKate Stone   MemoryRegionInfoSP region_info_sp =
1282b9c1b51eSKate Stone       std::make_shared<lldb_private::MemoryRegionInfo>();
1283b9c1b51eSKate Stone   if (process_sp) {
128426036843SHoward Hellyer     Process::StopLocker stop_locker;
1285b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1286b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1287b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1288b9c1b51eSKate Stone       sb_error.ref() =
1289b9c1b51eSKate Stone           process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp);
129026036843SHoward Hellyer       if (sb_error.Success()) {
129126036843SHoward Hellyer         sb_region_info.ref() = *region_info_sp;
129226036843SHoward Hellyer       }
1293b9c1b51eSKate Stone     } else {
129426036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
129526036843SHoward Hellyer       if (log)
1296b9c1b51eSKate Stone         log->Printf(
1297b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
129826036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
129926036843SHoward Hellyer       sb_error.SetErrorString("process is running");
130026036843SHoward Hellyer     }
1301b9c1b51eSKate Stone   } else {
130226036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
130326036843SHoward Hellyer   }
130426036843SHoward Hellyer   return sb_error;
130526036843SHoward Hellyer }
130626036843SHoward Hellyer 
1307b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
130826036843SHoward Hellyer   lldb::SBError sb_error;
130926036843SHoward Hellyer   lldb::SBMemoryRegionInfoList sb_region_list;
131026036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1311b9c1b51eSKate Stone   if (process_sp) {
131226036843SHoward Hellyer     Process::StopLocker stop_locker;
1313b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1314b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1315b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
131626036843SHoward Hellyer       std::vector<MemoryRegionInfoSP> region_list;
131726036843SHoward Hellyer       sb_error.ref() = process_sp->GetMemoryRegions(region_list);
131826036843SHoward Hellyer       if (sb_error.Success()) {
131926036843SHoward Hellyer         std::vector<MemoryRegionInfoSP>::iterator end = region_list.end();
1320b9c1b51eSKate Stone         for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin();
1321b9c1b51eSKate Stone              it != end; it++) {
132226036843SHoward Hellyer           SBMemoryRegionInfo sb_region_info(it->get());
132326036843SHoward Hellyer           sb_region_list.Append(sb_region_info);
132426036843SHoward Hellyer         }
132526036843SHoward Hellyer       }
1326b9c1b51eSKate Stone     } else {
132726036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
132826036843SHoward Hellyer       if (log)
1329b9c1b51eSKate Stone         log->Printf(
1330b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
133126036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
133226036843SHoward Hellyer       sb_error.SetErrorString("process is running");
133326036843SHoward Hellyer     }
1334b9c1b51eSKate Stone   } else {
133526036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
133626036843SHoward Hellyer   }
133726036843SHoward Hellyer   return sb_region_list;
133826036843SHoward Hellyer }
1339