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"
306f9e6901SZachary 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"
47d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h"
48d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h"
49802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h"
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner using namespace lldb;
5230fdc8d8SChris Lattner using namespace lldb_private;
5330fdc8d8SChris Lattner 
54b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {}
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner //----------------------------------------------------------------------
5730fdc8d8SChris Lattner // SBProcess constructor
5830fdc8d8SChris Lattner //----------------------------------------------------------------------
5930fdc8d8SChris Lattner 
60b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {}
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp)
63b9c1b51eSKate Stone     : m_opaque_wp(process_sp) {}
6430fdc8d8SChris Lattner 
65b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) {
66efabb123SGreg Clayton   if (this != &rhs)
674e0fe8abSGreg Clayton     m_opaque_wp = rhs.m_opaque_wp;
68efabb123SGreg Clayton   return *this;
69efabb123SGreg Clayton }
70efabb123SGreg Clayton 
7130fdc8d8SChris Lattner //----------------------------------------------------------------------
7230fdc8d8SChris Lattner // Destructor
7330fdc8d8SChris Lattner //----------------------------------------------------------------------
74b9c1b51eSKate Stone SBProcess::~SBProcess() {}
7530fdc8d8SChris Lattner 
76b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() {
774bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
784bddaeb5SJim Ingham }
794bddaeb5SJim Ingham 
80b9c1b51eSKate Stone const char *SBProcess::GetPluginName() {
81d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
82b9c1b51eSKate Stone   if (process_sp) {
8357abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
84d7b30ef9SJim Ingham   }
85d7b30ef9SJim Ingham   return "<Unknown>";
86d7b30ef9SJim Ingham }
87d7b30ef9SJim Ingham 
88b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() {
89d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
90b9c1b51eSKate Stone   if (process_sp) {
9157abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
92d7b30ef9SJim Ingham   }
93d7b30ef9SJim Ingham   return "<Unknown>";
94d7b30ef9SJim Ingham }
95d7b30ef9SJim Ingham 
96b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); }
97d7b30ef9SJim Ingham 
98b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; }
99b9556accSGreg Clayton 
100b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); }
10130fdc8d8SChris Lattner 
102b9c1b51eSKate Stone bool SBProcess::IsValid() const {
1034fc6cb9cSJim Ingham   ProcessSP process_sp(m_opaque_wp.lock());
1044fc6cb9cSJim Ingham   return ((bool)process_sp && process_sp->IsValid());
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner 
107b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp,
108b9c1b51eSKate Stone                              const char *stdin_path, const char *stdout_path,
1099631aae2SJames McIlree                              const char *stderr_path,
1109631aae2SJames McIlree                              const char *working_directory,
111b9c1b51eSKate Stone                              uint32_t launch_flags, bool stop_at_entry,
112b9c1b51eSKate Stone                              lldb::SBError &error) {
1135160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
114324a1036SSaleem Abdulrasool   if (log)
115b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, "
116b9c1b51eSKate Stone                 "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, "
117b9c1b51eSKate Stone                 "stop_at_entry=%i, &error (%p))...",
118324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_wp.lock().get()),
119324a1036SSaleem Abdulrasool                 static_cast<void *>(argv), static_cast<void *>(envp),
1209631aae2SJames McIlree                 stdin_path ? stdin_path : "NULL",
1219631aae2SJames McIlree                 stdout_path ? stdout_path : "NULL",
1229631aae2SJames McIlree                 stderr_path ? stderr_path : "NULL",
123b9c1b51eSKate Stone                 working_directory ? working_directory : "NULL", launch_flags,
124b9c1b51eSKate Stone                 stop_at_entry, static_cast<void *>(error.get()));
1259631aae2SJames McIlree 
126acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
127b9c1b51eSKate Stone   if (process_sp) {
128b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
129b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
130b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
131982c9762SGreg Clayton       if (stop_at_entry)
132982c9762SGreg Clayton         launch_flags |= eLaunchFlagStopAtEntry;
133b9c1b51eSKate Stone       ProcessLaunchInfo launch_info(
134b9c1b51eSKate Stone           FileSpec{stdin_path, false}, FileSpec{stdout_path, false},
135b9c1b51eSKate Stone           FileSpec{stderr_path, false}, FileSpec{working_directory, false},
136982c9762SGreg Clayton           launch_flags);
137acdbe816SGreg Clayton       Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
138982c9762SGreg Clayton       if (exe_module)
13914715c68SGreg Clayton         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
140982c9762SGreg Clayton       if (argv)
141982c9762SGreg Clayton         launch_info.GetArguments().AppendArguments(argv);
142982c9762SGreg Clayton       if (envp)
143982c9762SGreg Clayton         launch_info.GetEnvironmentEntries().SetArguments(envp);
144acdbe816SGreg Clayton       error.SetError(process_sp->Launch(launch_info));
145b9c1b51eSKate Stone     } else {
1469631aae2SJames McIlree       error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
1479631aae2SJames McIlree     }
148b9c1b51eSKate Stone   } else {
1499631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1509631aae2SJames McIlree   }
1519631aae2SJames McIlree 
1529631aae2SJames McIlree   if (log) {
1539631aae2SJames McIlree     SBStream sstr;
1549631aae2SJames McIlree     error.GetDescription(sstr);
155324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
156324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
157324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1589631aae2SJames McIlree   }
1599631aae2SJames McIlree 
1609631aae2SJames McIlree   return error.Success();
1619631aae2SJames McIlree }
1629631aae2SJames McIlree 
163b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
164b9c1b51eSKate Stone                                             lldb::SBError &error) {
165acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
166b9c1b51eSKate Stone   if (process_sp) {
167b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
168b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
169b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
170144f3a9cSGreg Clayton       ProcessAttachInfo attach_info;
171144f3a9cSGreg Clayton       attach_info.SetProcessID(pid);
172acdbe816SGreg Clayton       error.SetError(process_sp->Attach(attach_info));
173b9c1b51eSKate Stone     } else {
174b9c1b51eSKate Stone       error.SetErrorString(
175b9c1b51eSKate Stone           "must be in eStateConnected to call RemoteAttachToProcessWithID");
1769631aae2SJames McIlree     }
177b9c1b51eSKate Stone   } else {
1789631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1799631aae2SJames McIlree   }
1809631aae2SJames McIlree 
1815160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1829631aae2SJames McIlree   if (log) {
1839631aae2SJames McIlree     SBStream sstr;
1849631aae2SJames McIlree     error.GetDescription(sstr);
185b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64
186b9c1b51eSKate Stone                 ") => SBError (%p): %s",
187324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), pid,
188324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1899631aae2SJames McIlree   }
1909631aae2SJames McIlree 
1919631aae2SJames McIlree   return error.Success();
1929631aae2SJames McIlree }
1939631aae2SJames McIlree 
194b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() {
1955160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
196ceb6b139SCaroline Tice 
197ceb6b139SCaroline Tice   uint32_t num_threads = 0;
198acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
199b9c1b51eSKate Stone   if (process_sp) {
2007fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
2017fdf9ef1SGreg Clayton 
2027fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
203b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
204b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
205acdbe816SGreg Clayton     num_threads = process_sp->GetThreadList().GetSize(can_update);
20630fdc8d8SChris Lattner   }
207ceb6b139SCaroline Tice 
208ceb6b139SCaroline Tice   if (log)
209324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumThreads () => %d",
210324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_threads);
211ceb6b139SCaroline Tice 
212ceb6b139SCaroline Tice   return num_threads;
21330fdc8d8SChris Lattner }
21430fdc8d8SChris Lattner 
215b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const {
2165160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
217ceb6b139SCaroline Tice 
21830fdc8d8SChris Lattner   SBThread sb_thread;
21917a6ad05SGreg Clayton   ThreadSP thread_sp;
220acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
221b9c1b51eSKate Stone   if (process_sp) {
222b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
223b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
224acdbe816SGreg Clayton     thread_sp = process_sp->GetThreadList().GetSelectedThread();
22517a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
226af67cecdSGreg Clayton   }
227ceb6b139SCaroline Tice 
228ceb6b139SCaroline Tice   if (log)
229324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
230324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
231324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
232ceb6b139SCaroline Tice 
23330fdc8d8SChris Lattner   return sb_thread;
23430fdc8d8SChris Lattner }
23530fdc8d8SChris Lattner 
236b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
237b9c1b51eSKate Stone                                          lldb::addr_t context) {
2385160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
239a4d8747dSGreg Clayton 
240a4d8747dSGreg Clayton   SBThread sb_thread;
241a4d8747dSGreg Clayton   ThreadSP thread_sp;
242a4d8747dSGreg Clayton   ProcessSP process_sp(GetSP());
243b9c1b51eSKate Stone   if (process_sp) {
244b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
245b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
246a4d8747dSGreg Clayton     thread_sp = process_sp->CreateOSPluginThread(tid, context);
247a4d8747dSGreg Clayton     sb_thread.SetThread(thread_sp);
248a4d8747dSGreg Clayton   }
249a4d8747dSGreg Clayton 
250a4d8747dSGreg Clayton   if (log)
251b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64
252b9c1b51eSKate Stone                 ", context=0x%" PRIx64 ") => SBThread(%p)",
253324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid, context,
254324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
255a4d8747dSGreg Clayton 
256a4d8747dSGreg Clayton   return sb_thread;
257a4d8747dSGreg Clayton }
258a4d8747dSGreg Clayton 
259b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const {
2605160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
261ceb6b139SCaroline Tice 
26230fdc8d8SChris Lattner   SBTarget sb_target;
263b9556accSGreg Clayton   TargetSP target_sp;
264acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
265b9c1b51eSKate Stone   if (process_sp) {
266acdbe816SGreg Clayton     target_sp = process_sp->GetTarget().shared_from_this();
267b9556accSGreg Clayton     sb_target.SetSP(target_sp);
268b9556accSGreg Clayton   }
269ceb6b139SCaroline Tice 
270ceb6b139SCaroline Tice   if (log)
271324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)",
272324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
273324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
274ceb6b139SCaroline Tice 
27530fdc8d8SChris Lattner   return sb_target;
27630fdc8d8SChris Lattner }
27730fdc8d8SChris Lattner 
278b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
2795160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
280ceb6b139SCaroline Tice 
281ceb6b139SCaroline Tice   size_t ret_val = 0;
282acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
283b9c1b51eSKate Stone   if (process_sp) {
28497206d57SZachary Turner     Status error;
285acdbe816SGreg Clayton     ret_val = process_sp->PutSTDIN(src, src_len, error);
28630fdc8d8SChris Lattner   }
287ceb6b139SCaroline Tice 
288ceb6b139SCaroline Tice   if (log)
289b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64
290b9c1b51eSKate Stone                 ") => %" PRIu64,
291324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), src,
292b9c1b51eSKate Stone                 static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val));
293ceb6b139SCaroline Tice 
294ceb6b139SCaroline Tice   return ret_val;
29530fdc8d8SChris Lattner }
29630fdc8d8SChris Lattner 
297b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
298cfd1acedSGreg Clayton   size_t bytes_read = 0;
299acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
300b9c1b51eSKate Stone   if (process_sp) {
30197206d57SZachary Turner     Status error;
302acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
30330fdc8d8SChris Lattner   }
304ceb6b139SCaroline Tice 
3055160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
306ceb6b139SCaroline Tice   if (log)
307b9c1b51eSKate Stone     log->Printf(
308b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64
309b9c1b51eSKate Stone         ") => %" PRIu64,
310b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
311b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
312ceb6b139SCaroline Tice 
313cfd1acedSGreg Clayton   return bytes_read;
31430fdc8d8SChris Lattner }
31530fdc8d8SChris Lattner 
316b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
317cfd1acedSGreg Clayton   size_t bytes_read = 0;
318acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
319b9c1b51eSKate Stone   if (process_sp) {
32097206d57SZachary Turner     Status error;
321acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
32230fdc8d8SChris Lattner   }
323ceb6b139SCaroline Tice 
3245160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
325ceb6b139SCaroline Tice   if (log)
326b9c1b51eSKate Stone     log->Printf(
327b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64
328b9c1b51eSKate Stone         ") => %" PRIu64,
329b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
330b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
331ceb6b139SCaroline Tice 
332cfd1acedSGreg Clayton   return bytes_read;
33330fdc8d8SChris Lattner }
33430fdc8d8SChris Lattner 
335b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
336ab3b8b22SHan Ming Ong   size_t bytes_read = 0;
337ab3b8b22SHan Ming Ong   ProcessSP process_sp(GetSP());
338b9c1b51eSKate Stone   if (process_sp) {
33997206d57SZachary Turner     Status error;
340ab3b8b22SHan Ming Ong     bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
341ab3b8b22SHan Ming Ong   }
342ab3b8b22SHan Ming Ong 
3435160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
344ab3b8b22SHan Ming Ong   if (log)
345b9c1b51eSKate Stone     log->Printf(
346b9c1b51eSKate Stone         "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64
347b9c1b51eSKate Stone         ") => %" PRIu64,
348b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
349b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
350ab3b8b22SHan Ming Ong 
351ab3b8b22SHan Ming Ong   return bytes_read;
352ab3b8b22SHan Ming Ong }
353ab3b8b22SHan Ming Ong 
354d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options,
355d5d8d91cSRavitheja Addepally                                     lldb::SBError &error) {
356d5d8d91cSRavitheja Addepally   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
357d5d8d91cSRavitheja Addepally   ProcessSP process_sp(GetSP());
358d5d8d91cSRavitheja Addepally   error.Clear();
359d5d8d91cSRavitheja Addepally   SBTrace trace_instance;
360d5d8d91cSRavitheja Addepally   trace_instance.SetSP(process_sp);
361d5d8d91cSRavitheja Addepally   lldb::user_id_t uid = LLDB_INVALID_UID;
362d5d8d91cSRavitheja Addepally 
363d5d8d91cSRavitheja Addepally   if (!process_sp) {
364d5d8d91cSRavitheja Addepally     error.SetErrorString("invalid process");
365d5d8d91cSRavitheja Addepally   } else {
366*e714c4f5SRavitheja Addepally     uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref());
367d5d8d91cSRavitheja Addepally     trace_instance.SetTraceUID(uid);
368*e714c4f5SRavitheja Addepally     LLDB_LOG(log, "SBProcess::returned uid - {0}", uid);
369d5d8d91cSRavitheja Addepally   }
370d5d8d91cSRavitheja Addepally   return trace_instance;
371d5d8d91cSRavitheja Addepally }
372d5d8d91cSRavitheja Addepally 
373b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
37430fdc8d8SChris Lattner   if (out == NULL)
37530fdc8d8SChris Lattner     return;
37630fdc8d8SChris Lattner 
377acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
378b9c1b51eSKate Stone   if (process_sp) {
37930fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
38030fdc8d8SChris Lattner     char message[1024];
381b9c1b51eSKate Stone     int message_len = ::snprintf(
382b9c1b51eSKate Stone         message, sizeof(message), "Process %" PRIu64 " %s\n",
383b9c1b51eSKate Stone         process_sp->GetID(), SBDebugger::StateAsCString(event_state));
38430fdc8d8SChris Lattner 
38530fdc8d8SChris Lattner     if (message_len > 0)
38630fdc8d8SChris Lattner       ::fwrite(message, 1, message_len, out);
38730fdc8d8SChris Lattner   }
38830fdc8d8SChris Lattner }
38930fdc8d8SChris Lattner 
390b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event,
391b9c1b51eSKate Stone                                        SBCommandReturnObject &result) {
392acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
393b9c1b51eSKate Stone   if (process_sp) {
39430fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
39530fdc8d8SChris Lattner     char message[1024];
396b9c1b51eSKate Stone     ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
397b9c1b51eSKate Stone                process_sp->GetID(), SBDebugger::StateAsCString(event_state));
39830fdc8d8SChris Lattner 
39930fdc8d8SChris Lattner     result.AppendMessage(message);
40030fdc8d8SChris Lattner   }
40130fdc8d8SChris Lattner }
40230fdc8d8SChris Lattner 
403b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) {
404acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
405b9c1b51eSKate Stone   if (process_sp) {
406b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
407b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
408b9c1b51eSKate Stone     return process_sp->GetThreadList().SetSelectedThreadByID(
409b9c1b51eSKate Stone         thread.GetThreadID());
410af67cecdSGreg Clayton   }
41130fdc8d8SChris Lattner   return false;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
414b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
4155160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
416ceb6b139SCaroline Tice 
417ceb6b139SCaroline Tice   bool ret_val = false;
418acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
419b9c1b51eSKate Stone   if (process_sp) {
420b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
421b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
422acdbe816SGreg Clayton     ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
423af67cecdSGreg Clayton   }
424ceb6b139SCaroline Tice 
425ceb6b139SCaroline Tice   if (log)
426b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64
427b9c1b51eSKate Stone                 ") => %s",
428324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
429324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
430ceb6b139SCaroline Tice 
431ceb6b139SCaroline Tice   return ret_val;
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
434b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
4355160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
43618b46896SJim Ingham 
43718b46896SJim Ingham   bool ret_val = false;
43818b46896SJim Ingham   ProcessSP process_sp(GetSP());
439b9c1b51eSKate Stone   if (process_sp) {
440b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
441b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
44218b46896SJim Ingham     ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
44318b46896SJim Ingham   }
44418b46896SJim Ingham 
44518b46896SJim Ingham   if (log)
44618b46896SJim Ingham     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
447324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
448324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
44918b46896SJim Ingham 
45018b46896SJim Ingham   return ret_val;
45118b46896SJim Ingham }
45218b46896SJim Ingham 
453b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) {
4545160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
455ceb6b139SCaroline Tice 
45617a6ad05SGreg Clayton   SBThread sb_thread;
45717a6ad05SGreg Clayton   ThreadSP thread_sp;
458acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
459b9c1b51eSKate Stone   if (process_sp) {
4607fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
4617fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
462b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
463b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
4647fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
46517a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
466af67cecdSGreg Clayton   }
467ceb6b139SCaroline Tice 
468ceb6b139SCaroline Tice   if (log)
46993aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
470324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
471324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
472324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
473ceb6b139SCaroline Tice 
47417a6ad05SGreg Clayton   return sb_thread;
47530fdc8d8SChris Lattner }
47630fdc8d8SChris Lattner 
477b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() {
4785e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4795e8dce4dSJason Molenda 
4805e8dce4dSJason Molenda   uint32_t num_queues = 0;
4815e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
482b9c1b51eSKate Stone   if (process_sp) {
4835e8dce4dSJason Molenda     Process::StopLocker stop_locker;
484b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
485b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
486b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
4875e8dce4dSJason Molenda       num_queues = process_sp->GetQueueList().GetSize();
4885e8dce4dSJason Molenda     }
489a61d0a5bSGreg Clayton   }
4905e8dce4dSJason Molenda 
4915e8dce4dSJason Molenda   if (log)
492324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumQueues () => %d",
493324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_queues);
4945e8dce4dSJason Molenda 
4955e8dce4dSJason Molenda   return num_queues;
4965e8dce4dSJason Molenda }
4975e8dce4dSJason Molenda 
498b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) {
4995e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5005e8dce4dSJason Molenda 
5015e8dce4dSJason Molenda   SBQueue sb_queue;
5025e8dce4dSJason Molenda   QueueSP queue_sp;
5035e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
504b9c1b51eSKate Stone   if (process_sp) {
5055e8dce4dSJason Molenda     Process::StopLocker stop_locker;
506b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
507b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
508b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
5095e8dce4dSJason Molenda       queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5105e8dce4dSJason Molenda       sb_queue.SetQueue(queue_sp);
5115e8dce4dSJason Molenda     }
512a61d0a5bSGreg Clayton   }
5135e8dce4dSJason Molenda 
5145e8dce4dSJason Molenda   if (log)
5155e8dce4dSJason Molenda     log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
516324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
517324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
518324a1036SSaleem Abdulrasool                 static_cast<void *>(queue_sp.get()));
5195e8dce4dSJason Molenda 
5205e8dce4dSJason Molenda   return sb_queue;
5215e8dce4dSJason Molenda }
5225e8dce4dSJason Molenda 
523b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) {
524bf2956a2SJim Ingham   ProcessSP process_sp(GetSP());
525b9c1b51eSKate Stone   if (process_sp) {
526b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
527b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
528bf2956a2SJim Ingham     if (include_expression_stops)
529bf2956a2SJim Ingham       return process_sp->GetStopID();
530bf2956a2SJim Ingham     else
531bf2956a2SJim Ingham       return process_sp->GetLastNaturalStopID();
532bf2956a2SJim Ingham   }
533bf2956a2SJim Ingham   return 0;
534bf2956a2SJim Ingham }
535bf2956a2SJim Ingham 
536b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
53738810f43SIlia K   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53838810f43SIlia K 
53938810f43SIlia K   SBEvent sb_event;
54038810f43SIlia K   EventSP event_sp;
54138810f43SIlia K   ProcessSP process_sp(GetSP());
542b9c1b51eSKate Stone   if (process_sp) {
543b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
544b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
54538810f43SIlia K     event_sp = process_sp->GetStopEventForStopID(stop_id);
54638810f43SIlia K     sb_event.reset(event_sp);
54738810f43SIlia K   }
54838810f43SIlia K 
54938810f43SIlia K   if (log)
550b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32
551b9c1b51eSKate Stone                 ") => SBEvent(%p)",
552b9c1b51eSKate Stone                 static_cast<void *>(process_sp.get()), stop_id,
55338810f43SIlia K                 static_cast<void *>(event_sp.get()));
55438810f43SIlia K 
55538810f43SIlia K   return sb_event;
55638810f43SIlia K }
55738810f43SIlia K 
558b9c1b51eSKate Stone StateType SBProcess::GetState() {
559ceb6b139SCaroline Tice 
560ceb6b139SCaroline Tice   StateType ret_val = eStateInvalid;
561acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
562b9c1b51eSKate Stone   if (process_sp) {
563b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
564b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
565acdbe816SGreg Clayton     ret_val = process_sp->GetState();
566af67cecdSGreg Clayton   }
567ceb6b139SCaroline Tice 
5685160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
569ceb6b139SCaroline Tice   if (log)
570cfd1acedSGreg Clayton     log->Printf("SBProcess(%p)::GetState () => %s",
571324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
572750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
573ceb6b139SCaroline Tice 
574ceb6b139SCaroline Tice   return ret_val;
57530fdc8d8SChris Lattner }
57630fdc8d8SChris Lattner 
577b9c1b51eSKate Stone int SBProcess::GetExitStatus() {
5784838131bSGreg Clayton   int exit_status = 0;
579acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
580b9c1b51eSKate Stone   if (process_sp) {
581b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
582b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
583acdbe816SGreg Clayton     exit_status = process_sp->GetExitStatus();
584af67cecdSGreg Clayton   }
5855160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5864838131bSGreg Clayton   if (log)
5874838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
588324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_status,
589324a1036SSaleem Abdulrasool                 exit_status);
5904838131bSGreg Clayton 
5914838131bSGreg Clayton   return exit_status;
59230fdc8d8SChris Lattner }
59330fdc8d8SChris Lattner 
594b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() {
5954838131bSGreg Clayton   const char *exit_desc = NULL;
596acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
597b9c1b51eSKate Stone   if (process_sp) {
598b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
599b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
600acdbe816SGreg Clayton     exit_desc = process_sp->GetExitDescription();
601af67cecdSGreg Clayton   }
6025160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6034838131bSGreg Clayton   if (log)
6044838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitDescription () => %s",
605324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_desc);
6064838131bSGreg Clayton   return exit_desc;
60730fdc8d8SChris Lattner }
60830fdc8d8SChris Lattner 
609b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() {
610ceb6b139SCaroline Tice   lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
611acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
612acdbe816SGreg Clayton   if (process_sp)
613acdbe816SGreg Clayton     ret_val = process_sp->GetID();
614ceb6b139SCaroline Tice 
6155160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
616ceb6b139SCaroline Tice   if (log)
617324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64,
618324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
619ceb6b139SCaroline Tice 
620ceb6b139SCaroline Tice   return ret_val;
62130fdc8d8SChris Lattner }
62230fdc8d8SChris Lattner 
623b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() {
624949e8221SGreg Clayton   uint32_t ret_val = 0;
625949e8221SGreg Clayton   ProcessSP process_sp(GetSP());
626949e8221SGreg Clayton   if (process_sp)
627949e8221SGreg Clayton     ret_val = process_sp->GetUniqueID();
6285160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
629949e8221SGreg Clayton   if (log)
630324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32,
631324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
632949e8221SGreg Clayton   return ret_val;
633949e8221SGreg Clayton }
634949e8221SGreg Clayton 
635b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const {
636cf386e24SJohnny Chen   ByteOrder byteOrder = eByteOrderInvalid;
637acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
638acdbe816SGreg Clayton   if (process_sp)
639acdbe816SGreg Clayton     byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
640cf386e24SJohnny Chen 
6415160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
642cf386e24SJohnny Chen   if (log)
643324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetByteOrder () => %d",
644324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), byteOrder);
645cf386e24SJohnny Chen 
646cf386e24SJohnny Chen   return byteOrder;
647cf386e24SJohnny Chen }
648cf386e24SJohnny Chen 
649b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const {
650ceb6b139SCaroline Tice   uint32_t size = 0;
651acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
652acdbe816SGreg Clayton   if (process_sp)
653acdbe816SGreg Clayton     size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
654ceb6b139SCaroline Tice 
6555160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
656ceb6b139SCaroline Tice   if (log)
657324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetAddressByteSize () => %d",
658324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), size);
659ceb6b139SCaroline Tice 
660ceb6b139SCaroline Tice   return size;
66130fdc8d8SChris Lattner }
66230fdc8d8SChris Lattner 
663b9c1b51eSKate Stone SBError SBProcess::Continue() {
6645160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
665ceb6b139SCaroline Tice 
66630fdc8d8SChris Lattner   SBError sb_error;
667acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
6680c74e78dSGreg Clayton 
669acdbe816SGreg Clayton   if (log)
670324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue ()...",
671324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()));
672acdbe816SGreg Clayton 
673b9c1b51eSKate Stone   if (process_sp) {
674b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
675b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
676acdbe816SGreg Clayton 
677dc6224e0SGreg Clayton     if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
678dc6224e0SGreg Clayton       sb_error.ref() = process_sp->Resume();
679dc6224e0SGreg Clayton     else
680dc6224e0SGreg Clayton       sb_error.ref() = process_sp->ResumeSynchronous(NULL);
681b9c1b51eSKate Stone   } else
68230fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
68330fdc8d8SChris Lattner 
684b9c1b51eSKate Stone   if (log) {
685ceb6b139SCaroline Tice     SBStream sstr;
686ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
687324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s",
688324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
689324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
690ceb6b139SCaroline Tice   }
691ceb6b139SCaroline Tice 
69230fdc8d8SChris Lattner   return sb_error;
69330fdc8d8SChris Lattner }
69430fdc8d8SChris Lattner 
695b9c1b51eSKate Stone SBError SBProcess::Destroy() {
69630fdc8d8SChris Lattner   SBError sb_error;
697acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
698b9c1b51eSKate Stone   if (process_sp) {
699b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
700b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
701ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(false));
702b9c1b51eSKate Stone   } else
70330fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
70430fdc8d8SChris Lattner 
7055160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
706b9c1b51eSKate Stone   if (log) {
7074838131bSGreg Clayton     SBStream sstr;
7084838131bSGreg Clayton     sb_error.GetDescription(sstr);
7096779606aSGreg Clayton     log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s",
710324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
711324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7124838131bSGreg Clayton   }
7134838131bSGreg Clayton 
71430fdc8d8SChris Lattner   return sb_error;
71530fdc8d8SChris Lattner }
71630fdc8d8SChris Lattner 
717b9c1b51eSKate Stone SBError SBProcess::Stop() {
71830fdc8d8SChris Lattner   SBError sb_error;
719acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
720b9c1b51eSKate Stone   if (process_sp) {
721b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
722b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
723acdbe816SGreg Clayton     sb_error.SetError(process_sp->Halt());
724b9c1b51eSKate Stone   } else
72530fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
726ceb6b139SCaroline Tice 
7275160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
728b9c1b51eSKate Stone   if (log) {
729ceb6b139SCaroline Tice     SBStream sstr;
730ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
73193aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s",
732324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
733324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
734ceb6b139SCaroline Tice   }
735ceb6b139SCaroline Tice 
73630fdc8d8SChris Lattner   return sb_error;
73730fdc8d8SChris Lattner }
73830fdc8d8SChris Lattner 
739b9c1b51eSKate Stone SBError SBProcess::Kill() {
74030fdc8d8SChris Lattner   SBError sb_error;
741acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
742b9c1b51eSKate Stone   if (process_sp) {
743b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
744b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
745ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(true));
746b9c1b51eSKate Stone   } else
74730fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
748ceb6b139SCaroline Tice 
7495160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
750b9c1b51eSKate Stone   if (log) {
751ceb6b139SCaroline Tice     SBStream sstr;
752ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
75393aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s",
754324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
755324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
756ceb6b139SCaroline Tice   }
757ceb6b139SCaroline Tice 
75830fdc8d8SChris Lattner   return sb_error;
75930fdc8d8SChris Lattner }
76030fdc8d8SChris Lattner 
761b9c1b51eSKate Stone SBError SBProcess::Detach() {
762acff8950SJim Ingham   // FIXME: This should come from a process default.
763acff8950SJim Ingham   bool keep_stopped = false;
764acff8950SJim Ingham   return Detach(keep_stopped);
765acff8950SJim Ingham }
766acff8950SJim Ingham 
767b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) {
76830fdc8d8SChris Lattner   SBError sb_error;
769acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
770b9c1b51eSKate Stone   if (process_sp) {
771b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
772b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
773acff8950SJim Ingham     sb_error.SetError(process_sp->Detach(keep_stopped));
774b9c1b51eSKate Stone   } else
77530fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
77630fdc8d8SChris Lattner 
77730fdc8d8SChris Lattner   return sb_error;
77830fdc8d8SChris Lattner }
77930fdc8d8SChris Lattner 
780b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) {
78130fdc8d8SChris Lattner   SBError sb_error;
782acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
783b9c1b51eSKate Stone   if (process_sp) {
784b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
785b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
786acdbe816SGreg Clayton     sb_error.SetError(process_sp->Signal(signo));
787b9c1b51eSKate Stone   } else
78830fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
7895160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
790b9c1b51eSKate Stone   if (log) {
7914838131bSGreg Clayton     SBStream sstr;
7924838131bSGreg Clayton     sb_error.GetDescription(sstr);
7934838131bSGreg Clayton     log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
794324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), signo,
795324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7964838131bSGreg Clayton   }
79730fdc8d8SChris Lattner   return sb_error;
79830fdc8d8SChris Lattner }
79930fdc8d8SChris Lattner 
800b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() {
80198d0a4b3SChaoren Lin   if (auto process_sp = GetSP())
80298d0a4b3SChaoren Lin     return SBUnixSignals{process_sp};
803802dc402STodd Fiala 
80498d0a4b3SChaoren Lin   return {};
805802dc402STodd Fiala }
806802dc402STodd Fiala 
807b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() {
808cfc0935eSJim Ingham   ProcessSP process_sp(GetSP());
809b9c1b51eSKate Stone   if (process_sp) {
810cfc0935eSJim Ingham     process_sp->SendAsyncInterrupt();
811cfc0935eSJim Ingham   }
812cfc0935eSJim Ingham }
813cfc0935eSJim Ingham 
814b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) {
8154838131bSGreg Clayton   SBThread sb_thread;
81617a6ad05SGreg Clayton   ThreadSP thread_sp;
817acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
818b9c1b51eSKate Stone   if (process_sp) {
8197fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
8207fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
821b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
822b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
8237fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
82417a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
825af67cecdSGreg Clayton   }
8264838131bSGreg Clayton 
8275160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
8284838131bSGreg Clayton   if (log)
829b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64
830b9c1b51eSKate Stone                 ") => SBThread (%p)",
831324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
832324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
8334838131bSGreg Clayton 
8344838131bSGreg Clayton   return sb_thread;
83530fdc8d8SChris Lattner }
83630fdc8d8SChris Lattner 
837b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
83818b46896SJim Ingham   SBThread sb_thread;
83918b46896SJim Ingham   ThreadSP thread_sp;
84018b46896SJim Ingham   ProcessSP process_sp(GetSP());
841b9c1b51eSKate Stone   if (process_sp) {
84218b46896SJim Ingham     Process::StopLocker stop_locker;
84318b46896SJim Ingham     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
844b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
845b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
846b9c1b51eSKate Stone     thread_sp =
847b9c1b51eSKate Stone         process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
84818b46896SJim Ingham     sb_thread.SetThread(thread_sp);
84918b46896SJim Ingham   }
85018b46896SJim Ingham 
8515160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
85218b46896SJim Ingham   if (log)
85318b46896SJim Ingham     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
854324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
855324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
85618b46896SJim Ingham 
85718b46896SJim Ingham   return sb_thread;
85818b46896SJim Ingham }
85918b46896SJim Ingham 
860b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
8615160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
862ceb6b139SCaroline Tice 
863ceb6b139SCaroline Tice   StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
864ceb6b139SCaroline Tice 
865ceb6b139SCaroline Tice   if (log)
866324a1036SSaleem Abdulrasool     log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
867324a1036SSaleem Abdulrasool                 static_cast<void *>(event.get()),
868750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
869ceb6b139SCaroline Tice 
870ceb6b139SCaroline Tice   return ret_val;
87130fdc8d8SChris Lattner }
87230fdc8d8SChris Lattner 
873b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
874ea2cc5e0SPavel Labath   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
875ea2cc5e0SPavel Labath 
876ea2cc5e0SPavel Labath   bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
877ea2cc5e0SPavel Labath 
878ea2cc5e0SPavel Labath   if (log)
879400e1809SHans Wennborg     log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
880400e1809SHans Wennborg                 static_cast<void *>(event.get()), ret_val);
881ea2cc5e0SPavel Labath 
882ea2cc5e0SPavel Labath   return ret_val;
88330fdc8d8SChris Lattner }
88430fdc8d8SChris Lattner 
885b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
8860161b49cSJim Ingham   return Process::ProcessEventData::GetNumRestartedReasons(event.get());
8870161b49cSJim Ingham }
8880161b49cSJim Ingham 
8890161b49cSJim Ingham const char *
890b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
891b9c1b51eSKate Stone                                               size_t idx) {
8920161b49cSJim Ingham   return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
8930161b49cSJim Ingham }
8940161b49cSJim Ingham 
895b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
89675930019STodd Fiala   ProcessSP process_sp =
89775930019STodd Fiala       Process::ProcessEventData::GetProcessFromEvent(event.get());
898b9c1b51eSKate Stone   if (!process_sp) {
89975930019STodd Fiala     // StructuredData events also know the process they come from.
90075930019STodd Fiala     // Try that.
90175930019STodd Fiala     process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
90275930019STodd Fiala   }
90375930019STodd Fiala 
90475930019STodd Fiala   return SBProcess(process_sp);
90530fdc8d8SChris Lattner }
90630fdc8d8SChris Lattner 
907b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
90806d2855fSIlia K   return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
90906d2855fSIlia K }
91006d2855fSIlia K 
91175930019STodd Fiala lldb::SBStructuredData
912b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
91375930019STodd Fiala   return SBStructuredData(event.GetSP());
91475930019STodd Fiala }
91575930019STodd Fiala 
916b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
91775930019STodd Fiala   return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
91875930019STodd Fiala          !EventIsStructuredDataEvent(event);
91975930019STodd Fiala }
92075930019STodd Fiala 
921b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
92275930019STodd Fiala   EventSP event_sp = event.GetSP();
92375930019STodd Fiala   EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
924b9c1b51eSKate Stone   return event_data && (event_data->GetFlavor() ==
925b9c1b51eSKate Stone                         EventDataStructuredData::GetFlavorString());
926e6bc6cb9SJim Ingham }
92730fdc8d8SChris Lattner 
928b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const {
9295160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
930ceb6b139SCaroline Tice 
931acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
932acdbe816SGreg Clayton 
933acdbe816SGreg Clayton   SBBroadcaster broadcaster(process_sp.get(), false);
934ceb6b139SCaroline Tice 
935ceb6b139SCaroline Tice   if (log)
936324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
937324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
938324a1036SSaleem Abdulrasool                 static_cast<void *>(broadcaster.get()));
939ceb6b139SCaroline Tice 
94030fdc8d8SChris Lattner   return broadcaster;
94130fdc8d8SChris Lattner }
94230fdc8d8SChris Lattner 
943b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() {
9444bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
9454bddaeb5SJim Ingham }
9464bddaeb5SJim Ingham 
947b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
948b9c1b51eSKate Stone                              SBError &sb_error) {
9495160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
950ceb6b139SCaroline Tice 
95130fdc8d8SChris Lattner   size_t bytes_read = 0;
95230fdc8d8SChris Lattner 
953acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
954acdbe816SGreg Clayton 
9554838131bSGreg Clayton   if (log)
956b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
957b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
958324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
959324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
960324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
9614838131bSGreg Clayton 
962b9c1b51eSKate Stone   if (process_sp) {
9637fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
964b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
965b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
966b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
9677fdf9ef1SGreg Clayton       bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
968b9c1b51eSKate Stone     } else {
969c9858e4dSGreg Clayton       if (log)
970324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::ReadMemory() => error: process is running",
971324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
9727fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
9737fdf9ef1SGreg Clayton     }
974b9c1b51eSKate Stone   } else {
97530fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
97630fdc8d8SChris Lattner   }
97730fdc8d8SChris Lattner 
978b9c1b51eSKate Stone   if (log) {
97993aa84e8SGreg Clayton     SBStream sstr;
98093aa84e8SGreg Clayton     sb_error.GetDescription(sstr);
981b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
982b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
983324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
984324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
985324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
986324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_read));
98793aa84e8SGreg Clayton   }
988ceb6b139SCaroline Tice 
98930fdc8d8SChris Lattner   return bytes_read;
99030fdc8d8SChris Lattner }
99130fdc8d8SChris Lattner 
992b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
993b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
994e91b7957SGreg Clayton   size_t bytes_read = 0;
995acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
996b9c1b51eSKate Stone   if (process_sp) {
9977fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
998b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
999b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1000b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1001b9c1b51eSKate Stone       bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
1002b9c1b51eSKate Stone                                                      sb_error.ref());
1003b9c1b51eSKate Stone     } else {
10045160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1005c9858e4dSGreg Clayton       if (log)
1006b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process "
1007b9c1b51eSKate Stone                     "is running",
1008324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10097fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10107fdf9ef1SGreg Clayton     }
1011b9c1b51eSKate Stone   } else {
1012e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1013e91b7957SGreg Clayton   }
1014e91b7957SGreg Clayton   return bytes_read;
1015e91b7957SGreg Clayton }
1016e91b7957SGreg Clayton 
1017b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
1018b9c1b51eSKate Stone                                            lldb::SBError &sb_error) {
10197fdf9ef1SGreg Clayton   uint64_t value = 0;
1020acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1021b9c1b51eSKate Stone   if (process_sp) {
10227fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1023b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1024b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1025b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1026b9c1b51eSKate Stone       value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
1027b9c1b51eSKate Stone                                                         sb_error.ref());
1028b9c1b51eSKate Stone     } else {
10295160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1030c9858e4dSGreg Clayton       if (log)
1031b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process "
1032b9c1b51eSKate Stone                     "is running",
1033324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10347fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10357fdf9ef1SGreg Clayton     }
1036b9c1b51eSKate Stone   } else {
1037e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1038e91b7957SGreg Clayton   }
10397fdf9ef1SGreg Clayton   return value;
1040e91b7957SGreg Clayton }
1041e91b7957SGreg Clayton 
1042b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
1043b9c1b51eSKate Stone                                               lldb::SBError &sb_error) {
1044e91b7957SGreg Clayton   lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1045acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1046b9c1b51eSKate Stone   if (process_sp) {
10477fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1048b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1049b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1050b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
10517fdf9ef1SGreg Clayton       ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
1052b9c1b51eSKate Stone     } else {
10535160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1054c9858e4dSGreg Clayton       if (log)
1055b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process "
1056b9c1b51eSKate Stone                     "is running",
1057324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10587fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10597fdf9ef1SGreg Clayton     }
1060b9c1b51eSKate Stone   } else {
1061e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1062e91b7957SGreg Clayton   }
1063e91b7957SGreg Clayton   return ptr;
1064e91b7957SGreg Clayton }
1065e91b7957SGreg Clayton 
1066b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
1067b9c1b51eSKate Stone                               SBError &sb_error) {
106830fdc8d8SChris Lattner   size_t bytes_written = 0;
106930fdc8d8SChris Lattner 
10705160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1071acdbe816SGreg Clayton 
1072acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1073acdbe816SGreg Clayton 
10744838131bSGreg Clayton   if (log)
1075b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1076b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1077324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1078b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1079324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
10804838131bSGreg Clayton 
1081b9c1b51eSKate Stone   if (process_sp) {
10827fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1083b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1084b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1085b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1086b9c1b51eSKate Stone       bytes_written =
1087b9c1b51eSKate Stone           process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
1088b9c1b51eSKate Stone     } else {
1089c9858e4dSGreg Clayton       if (log)
1090324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::WriteMemory() => error: process is running",
1091324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10927fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10937fdf9ef1SGreg Clayton     }
109430fdc8d8SChris Lattner   }
109530fdc8d8SChris Lattner 
1096b9c1b51eSKate Stone   if (log) {
10974838131bSGreg Clayton     SBStream sstr;
10984838131bSGreg Clayton     sb_error.GetDescription(sstr);
1099b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1100b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1101324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1102b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1103324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1104324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_written));
11054838131bSGreg Clayton   }
11064838131bSGreg Clayton 
110730fdc8d8SChris Lattner   return bytes_written;
110830fdc8d8SChris Lattner }
110930fdc8d8SChris Lattner 
1110b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) {
1111da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1112da7bc7d0SGreg Clayton 
1113acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1114b9c1b51eSKate Stone   if (process_sp) {
1115dde9cff3SCaroline Tice     char path[PATH_MAX];
1116dde9cff3SCaroline Tice     GetTarget().GetExecutable().GetPath(path, sizeof(path));
1117acdbe816SGreg Clayton     Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
11181d273166SGreg Clayton     const char *exe_name = NULL;
11191d273166SGreg Clayton     if (exe_module)
11201d273166SGreg Clayton       exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
11211d273166SGreg Clayton 
1122d01b2953SDaniel Malea     strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1123b9c1b51eSKate Stone                 process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1124b9c1b51eSKate Stone                 GetNumThreads(), exe_name ? ", executable = " : "",
11251d273166SGreg Clayton                 exe_name ? exe_name : "");
1126b9c1b51eSKate Stone   } else
1127da7bc7d0SGreg Clayton     strm.PutCString("No value");
1128dde9cff3SCaroline Tice 
1129dde9cff3SCaroline Tice   return true;
1130dde9cff3SCaroline Tice }
11318f343b09SGreg Clayton 
11328f343b09SGreg Clayton uint32_t
1133b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
11345160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1135f9ef60d2SJohnny Chen 
1136f9ef60d2SJohnny Chen   uint32_t num = 0;
1137f9ef60d2SJohnny Chen   ProcessSP process_sp(GetSP());
1138b9c1b51eSKate Stone   if (process_sp) {
1139b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1140b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1141f9ef60d2SJohnny Chen     sb_error.SetError(process_sp->GetWatchpointSupportInfo(num));
1142f9ef60d2SJohnny Chen     if (log)
1143f9ef60d2SJohnny Chen       log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1144324a1036SSaleem Abdulrasool                   static_cast<void *>(process_sp.get()), num);
1145b9c1b51eSKate Stone   } else {
1146f9ef60d2SJohnny Chen     sb_error.SetErrorString("SBProcess is invalid");
1147f9ef60d2SJohnny Chen   }
1148f9ef60d2SJohnny Chen   return num;
1149f9ef60d2SJohnny Chen }
1150f9ef60d2SJohnny Chen 
1151b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1152b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
11534fbd67acSTamas Berghammer   return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
11544fbd67acSTamas Berghammer }
11554fbd67acSTamas Berghammer 
1156b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
11574fbd67acSTamas Berghammer                               const lldb::SBFileSpec &sb_remote_image_spec,
1158b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1159abc5d72fSJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
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())) {
1164abc5d72fSJim Ingham       if (log)
1165abc5d72fSJim Ingham         log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage"
1166abc5d72fSJim Ingham                     "for: %s",
1167abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()),
1168abc5d72fSJim Ingham                     sb_local_image_spec.GetFilename());
1169abc5d72fSJim Ingham 
1170b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1171b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
11723cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1173b9c1b51eSKate Stone       return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1174b9c1b51eSKate Stone                                     *sb_remote_image_spec, sb_error.ref());
1175b9c1b51eSKate Stone     } else {
1176c9858e4dSGreg Clayton       if (log)
1177324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::LoadImage() => error: process is running",
1178324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11797fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11807fdf9ef1SGreg Clayton     }
1181abc5d72fSJim Ingham   } else {
1182abc5d72fSJim Ingham     if (log)
1183abc5d72fSJim Ingham       log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid"
1184abc5d72fSJim Ingham                     " process",
1185abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()));
1186abc5d72fSJim Ingham     sb_error.SetErrorString("process is invalid");
11877fdf9ef1SGreg Clayton   }
11888f343b09SGreg Clayton   return LLDB_INVALID_IMAGE_TOKEN;
11898f343b09SGreg Clayton }
11908f343b09SGreg Clayton 
1191b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
11928f343b09SGreg Clayton   lldb::SBError sb_error;
1193acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1194b9c1b51eSKate Stone   if (process_sp) {
11957fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1196b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1197b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1198b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
11993cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1200b9c1b51eSKate Stone       sb_error.SetError(
1201b9c1b51eSKate Stone           platform_sp->UnloadImage(process_sp.get(), image_token));
1202b9c1b51eSKate Stone     } else {
12035160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1204c9858e4dSGreg Clayton       if (log)
1205324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::UnloadImage() => error: process is running",
1206324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12077fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
12087fdf9ef1SGreg Clayton     }
1209b9c1b51eSKate Stone   } else
12108f343b09SGreg Clayton     sb_error.SetErrorString("invalid process");
12118f343b09SGreg Clayton   return sb_error;
12128f343b09SGreg Clayton }
12138c71337aSJason Molenda 
1214b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) {
1215a332978bSJason Molenda   lldb::SBError sb_error;
1216a332978bSJason Molenda   ProcessSP process_sp(GetSP());
1217b9c1b51eSKate Stone   if (process_sp) {
1218a332978bSJason Molenda     Process::StopLocker stop_locker;
1219b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1220b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1221b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1222a332978bSJason Molenda       sb_error.SetError(process_sp->SendEventData(event_data));
1223b9c1b51eSKate Stone     } else {
1224a332978bSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1225a332978bSJason Molenda       if (log)
1226b9c1b51eSKate Stone         log->Printf(
1227b9c1b51eSKate Stone             "SBProcess(%p)::SendEventData() => error: process is running",
1228324a1036SSaleem Abdulrasool             static_cast<void *>(process_sp.get()));
1229a332978bSJason Molenda       sb_error.SetErrorString("process is running");
1230a332978bSJason Molenda     }
1231b9c1b51eSKate Stone   } else
1232a332978bSJason Molenda     sb_error.SetErrorString("invalid process");
1233a332978bSJason Molenda   return sb_error;
1234a332978bSJason Molenda }
1235a332978bSJason Molenda 
1236b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
12378c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1238b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12398c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
124095d005c7SJason Molenda     return runtime->GetExtendedBacktraceTypes().size();
12418c71337aSJason Molenda   }
12428c71337aSJason Molenda   return 0;
12438c71337aSJason Molenda }
12448c71337aSJason Molenda 
1245b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
12468c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1247b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12488c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
1249b9c1b51eSKate Stone     const std::vector<ConstString> &names =
1250b9c1b51eSKate Stone         runtime->GetExtendedBacktraceTypes();
1251b9c1b51eSKate Stone     if (idx < names.size()) {
12528c71337aSJason Molenda       return names[idx].AsCString();
1253b9c1b51eSKate Stone     } else {
12548c71337aSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12558c71337aSJason Molenda       if (log)
1256b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => "
1257b9c1b51eSKate Stone                     "error: requested extended backtrace name out of bounds",
1258324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12598c71337aSJason Molenda     }
12608c71337aSJason Molenda   }
12618c71337aSJason Molenda   return NULL;
12628c71337aSJason Molenda }
1263a51ea382SKuba Brecka 
1264b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1265a51ea382SKuba Brecka   ProcessSP process_sp(GetSP());
1266a51ea382SKuba Brecka   SBThreadCollection threads;
1267b9c1b51eSKate Stone   if (process_sp) {
1268a51ea382SKuba Brecka     threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1269a51ea382SKuba Brecka   }
1270a51ea382SKuba Brecka   return threads;
1271a51ea382SKuba Brecka }
127263927548SKuba Brecka 
1273b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent(
1274b9c1b51eSKate Stone     InstrumentationRuntimeType type) {
127563927548SKuba Brecka   ProcessSP process_sp(GetSP());
127663927548SKuba Brecka   if (!process_sp)
127763927548SKuba Brecka     return false;
127863927548SKuba Brecka 
1279b9c1b51eSKate Stone   InstrumentationRuntimeSP runtime_sp =
1280b9c1b51eSKate Stone       process_sp->GetInstrumentationRuntime(type);
128163927548SKuba Brecka 
128263927548SKuba Brecka   if (!runtime_sp.get())
128363927548SKuba Brecka     return false;
128463927548SKuba Brecka 
128563927548SKuba Brecka   return runtime_sp->IsActive();
128663927548SKuba Brecka }
1287f7d1893fSAdrian McCarthy 
1288b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) {
1289f7d1893fSAdrian McCarthy   lldb::SBError error;
1290f7d1893fSAdrian McCarthy   ProcessSP process_sp(GetSP());
1291b9c1b51eSKate Stone   if (!process_sp) {
1292f7d1893fSAdrian McCarthy     error.SetErrorString("SBProcess is invalid");
1293f7d1893fSAdrian McCarthy     return error;
1294f7d1893fSAdrian McCarthy   }
1295f7d1893fSAdrian McCarthy 
1296b9c1b51eSKate Stone   std::lock_guard<std::recursive_mutex> guard(
1297b9c1b51eSKate Stone       process_sp->GetTarget().GetAPIMutex());
1298f7d1893fSAdrian McCarthy 
1299b9c1b51eSKate Stone   if (process_sp->GetState() != eStateStopped) {
1300f7d1893fSAdrian McCarthy     error.SetErrorString("the process is not stopped");
1301f7d1893fSAdrian McCarthy     return error;
1302f7d1893fSAdrian McCarthy   }
1303f7d1893fSAdrian McCarthy 
1304f7d1893fSAdrian McCarthy   FileSpec core_file(file_name, false);
1305f7d1893fSAdrian McCarthy   error.ref() = PluginManager::SaveCore(process_sp, core_file);
1306f7d1893fSAdrian McCarthy   return error;
1307f7d1893fSAdrian McCarthy }
130826036843SHoward Hellyer 
130926036843SHoward Hellyer lldb::SBError
1310b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1311b9c1b51eSKate Stone                                SBMemoryRegionInfo &sb_region_info) {
131226036843SHoward Hellyer   lldb::SBError sb_error;
131326036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1314b9c1b51eSKate Stone   MemoryRegionInfoSP region_info_sp =
1315b9c1b51eSKate Stone       std::make_shared<lldb_private::MemoryRegionInfo>();
1316b9c1b51eSKate Stone   if (process_sp) {
131726036843SHoward Hellyer     Process::StopLocker stop_locker;
1318b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1319b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1320b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1321b9c1b51eSKate Stone       sb_error.ref() =
1322b9c1b51eSKate Stone           process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp);
132326036843SHoward Hellyer       if (sb_error.Success()) {
132426036843SHoward Hellyer         sb_region_info.ref() = *region_info_sp;
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_error;
133826036843SHoward Hellyer }
133926036843SHoward Hellyer 
1340b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
134126036843SHoward Hellyer   lldb::SBError sb_error;
134226036843SHoward Hellyer   lldb::SBMemoryRegionInfoList sb_region_list;
134326036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1344b9c1b51eSKate Stone   if (process_sp) {
134526036843SHoward Hellyer     Process::StopLocker stop_locker;
1346b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1347b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1348b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
134926036843SHoward Hellyer       std::vector<MemoryRegionInfoSP> region_list;
135026036843SHoward Hellyer       sb_error.ref() = process_sp->GetMemoryRegions(region_list);
135126036843SHoward Hellyer       if (sb_error.Success()) {
135226036843SHoward Hellyer         std::vector<MemoryRegionInfoSP>::iterator end = region_list.end();
1353b9c1b51eSKate Stone         for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin();
1354b9c1b51eSKate Stone              it != end; it++) {
135526036843SHoward Hellyer           SBMemoryRegionInfo sb_region_info(it->get());
135626036843SHoward Hellyer           sb_region_list.Append(sb_region_info);
135726036843SHoward Hellyer         }
135826036843SHoward Hellyer       }
1359b9c1b51eSKate Stone     } else {
136026036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
136126036843SHoward Hellyer       if (log)
1362b9c1b51eSKate Stone         log->Printf(
1363b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
136426036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
136526036843SHoward Hellyer       sb_error.SetErrorString("process is running");
136626036843SHoward Hellyer     }
1367b9c1b51eSKate Stone   } else {
136826036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
136926036843SHoward Hellyer   }
137026036843SHoward Hellyer   return sb_region_list;
137126036843SHoward Hellyer }
1372