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 #include <inttypes.h>
13bdae3787SVirgile Bello 
1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
175d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
181f746071SGreg Clayton #include "lldb/Core/Module.h"
19f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2126036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h"
2230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
248c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
256611103cSGreg Clayton #include "lldb/Target/Target.h"
266611103cSGreg Clayton #include "lldb/Target/Thread.h"
27145d95c9SPavel Labath #include "lldb/Utility/Args.h"
286f9e6901SZachary Turner #include "lldb/Utility/Log.h"
29d821c997SPavel Labath #include "lldb/Utility/State.h"
30bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner 
334c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
344c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
350e615684SGreg Clayton #include "lldb/API/SBDebugger.h"
364c5de699SEli Friedman #include "lldb/API/SBEvent.h"
370e615684SGreg Clayton #include "lldb/API/SBFileSpec.h"
3826036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h"
3926036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h"
40b9c1b51eSKate Stone #include "lldb/API/SBStream.h"
41b9c1b51eSKate Stone #include "lldb/API/SBStringList.h"
4275930019STodd Fiala #include "lldb/API/SBStructuredData.h"
434c5de699SEli Friedman #include "lldb/API/SBThread.h"
44a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h"
45d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h"
46d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.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;
1318f3be7a3SJonas Devlieghere       ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path),
1328f3be7a3SJonas Devlieghere                                     FileSpec(stderr_path),
1338f3be7a3SJonas Devlieghere                                     FileSpec(working_directory), launch_flags);
134acdbe816SGreg Clayton       Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
135982c9762SGreg Clayton       if (exe_module)
13614715c68SGreg Clayton         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
137982c9762SGreg Clayton       if (argv)
138982c9762SGreg Clayton         launch_info.GetArguments().AppendArguments(argv);
139982c9762SGreg Clayton       if (envp)
14062930e57SPavel Labath         launch_info.GetEnvironment() = Environment(envp);
141acdbe816SGreg Clayton       error.SetError(process_sp->Launch(launch_info));
142b9c1b51eSKate Stone     } else {
1439631aae2SJames McIlree       error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
1449631aae2SJames McIlree     }
145b9c1b51eSKate Stone   } else {
1469631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1479631aae2SJames McIlree   }
1489631aae2SJames McIlree 
1499631aae2SJames McIlree   if (log) {
1509631aae2SJames McIlree     SBStream sstr;
1519631aae2SJames McIlree     error.GetDescription(sstr);
152324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
153324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
154324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1559631aae2SJames McIlree   }
1569631aae2SJames McIlree 
1579631aae2SJames McIlree   return error.Success();
1589631aae2SJames McIlree }
1599631aae2SJames McIlree 
160b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
161b9c1b51eSKate Stone                                             lldb::SBError &error) {
162acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
163b9c1b51eSKate Stone   if (process_sp) {
164b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
165b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
166b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
167144f3a9cSGreg Clayton       ProcessAttachInfo attach_info;
168144f3a9cSGreg Clayton       attach_info.SetProcessID(pid);
169acdbe816SGreg Clayton       error.SetError(process_sp->Attach(attach_info));
170b9c1b51eSKate Stone     } else {
171b9c1b51eSKate Stone       error.SetErrorString(
172b9c1b51eSKate Stone           "must be in eStateConnected to call RemoteAttachToProcessWithID");
1739631aae2SJames McIlree     }
174b9c1b51eSKate Stone   } else {
1759631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1769631aae2SJames McIlree   }
1779631aae2SJames McIlree 
1785160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1799631aae2SJames McIlree   if (log) {
1809631aae2SJames McIlree     SBStream sstr;
1819631aae2SJames McIlree     error.GetDescription(sstr);
182b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64
183b9c1b51eSKate Stone                 ") => SBError (%p): %s",
184324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), pid,
185324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1869631aae2SJames McIlree   }
1879631aae2SJames McIlree 
1889631aae2SJames McIlree   return error.Success();
1899631aae2SJames McIlree }
1909631aae2SJames McIlree 
191b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() {
1925160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
193ceb6b139SCaroline Tice 
194ceb6b139SCaroline Tice   uint32_t num_threads = 0;
195acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
196b9c1b51eSKate Stone   if (process_sp) {
1977fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1987fdf9ef1SGreg Clayton 
1997fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
200b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
201b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
202acdbe816SGreg Clayton     num_threads = process_sp->GetThreadList().GetSize(can_update);
20330fdc8d8SChris Lattner   }
204ceb6b139SCaroline Tice 
205ceb6b139SCaroline Tice   if (log)
206324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumThreads () => %d",
207324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_threads);
208ceb6b139SCaroline Tice 
209ceb6b139SCaroline Tice   return num_threads;
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
212b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const {
2135160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
214ceb6b139SCaroline Tice 
21530fdc8d8SChris Lattner   SBThread sb_thread;
21617a6ad05SGreg Clayton   ThreadSP thread_sp;
217acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
218b9c1b51eSKate Stone   if (process_sp) {
219b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
220b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
221acdbe816SGreg Clayton     thread_sp = process_sp->GetThreadList().GetSelectedThread();
22217a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
223af67cecdSGreg Clayton   }
224ceb6b139SCaroline Tice 
225ceb6b139SCaroline Tice   if (log)
226324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
227324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
228324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
229ceb6b139SCaroline Tice 
23030fdc8d8SChris Lattner   return sb_thread;
23130fdc8d8SChris Lattner }
23230fdc8d8SChris Lattner 
233b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
234b9c1b51eSKate Stone                                          lldb::addr_t context) {
2355160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
236a4d8747dSGreg Clayton 
237a4d8747dSGreg Clayton   SBThread sb_thread;
238a4d8747dSGreg Clayton   ThreadSP thread_sp;
239a4d8747dSGreg Clayton   ProcessSP process_sp(GetSP());
240b9c1b51eSKate Stone   if (process_sp) {
241b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
242b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
243a4d8747dSGreg Clayton     thread_sp = process_sp->CreateOSPluginThread(tid, context);
244a4d8747dSGreg Clayton     sb_thread.SetThread(thread_sp);
245a4d8747dSGreg Clayton   }
246a4d8747dSGreg Clayton 
247a4d8747dSGreg Clayton   if (log)
248b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64
249b9c1b51eSKate Stone                 ", context=0x%" PRIx64 ") => SBThread(%p)",
250324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid, context,
251324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
252a4d8747dSGreg Clayton 
253a4d8747dSGreg Clayton   return sb_thread;
254a4d8747dSGreg Clayton }
255a4d8747dSGreg Clayton 
256b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const {
2575160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
258ceb6b139SCaroline Tice 
25930fdc8d8SChris Lattner   SBTarget sb_target;
260b9556accSGreg Clayton   TargetSP target_sp;
261acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
262b9c1b51eSKate Stone   if (process_sp) {
263acdbe816SGreg Clayton     target_sp = process_sp->GetTarget().shared_from_this();
264b9556accSGreg Clayton     sb_target.SetSP(target_sp);
265b9556accSGreg Clayton   }
266ceb6b139SCaroline Tice 
267ceb6b139SCaroline Tice   if (log)
268324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)",
269324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
270324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
271ceb6b139SCaroline Tice 
27230fdc8d8SChris Lattner   return sb_target;
27330fdc8d8SChris Lattner }
27430fdc8d8SChris Lattner 
275b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
2765160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
277ceb6b139SCaroline Tice 
278ceb6b139SCaroline Tice   size_t ret_val = 0;
279acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
280b9c1b51eSKate Stone   if (process_sp) {
28197206d57SZachary Turner     Status error;
282acdbe816SGreg Clayton     ret_val = process_sp->PutSTDIN(src, src_len, error);
28330fdc8d8SChris Lattner   }
284ceb6b139SCaroline Tice 
285ceb6b139SCaroline Tice   if (log)
286b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64
287b9c1b51eSKate Stone                 ") => %" PRIu64,
288324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), src,
289b9c1b51eSKate Stone                 static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val));
290ceb6b139SCaroline Tice 
291ceb6b139SCaroline Tice   return ret_val;
29230fdc8d8SChris Lattner }
29330fdc8d8SChris Lattner 
294b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
295cfd1acedSGreg Clayton   size_t bytes_read = 0;
296acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
297b9c1b51eSKate Stone   if (process_sp) {
29897206d57SZachary Turner     Status error;
299acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
30030fdc8d8SChris Lattner   }
301ceb6b139SCaroline Tice 
3025160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
303ceb6b139SCaroline Tice   if (log)
304b9c1b51eSKate Stone     log->Printf(
305b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64
306b9c1b51eSKate Stone         ") => %" PRIu64,
307b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
308b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
309ceb6b139SCaroline Tice 
310cfd1acedSGreg Clayton   return bytes_read;
31130fdc8d8SChris Lattner }
31230fdc8d8SChris Lattner 
313b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
314cfd1acedSGreg Clayton   size_t bytes_read = 0;
315acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
316b9c1b51eSKate Stone   if (process_sp) {
31797206d57SZachary Turner     Status error;
318acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
31930fdc8d8SChris Lattner   }
320ceb6b139SCaroline Tice 
3215160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
322ceb6b139SCaroline Tice   if (log)
323b9c1b51eSKate Stone     log->Printf(
324b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64
325b9c1b51eSKate Stone         ") => %" PRIu64,
326b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
327b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
328ceb6b139SCaroline Tice 
329cfd1acedSGreg Clayton   return bytes_read;
33030fdc8d8SChris Lattner }
33130fdc8d8SChris Lattner 
332b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
333ab3b8b22SHan Ming Ong   size_t bytes_read = 0;
334ab3b8b22SHan Ming Ong   ProcessSP process_sp(GetSP());
335b9c1b51eSKate Stone   if (process_sp) {
33697206d57SZachary Turner     Status error;
337ab3b8b22SHan Ming Ong     bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
338ab3b8b22SHan Ming Ong   }
339ab3b8b22SHan Ming Ong 
3405160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
341ab3b8b22SHan Ming Ong   if (log)
342b9c1b51eSKate Stone     log->Printf(
343b9c1b51eSKate Stone         "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64
344b9c1b51eSKate Stone         ") => %" PRIu64,
345b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
346b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
347ab3b8b22SHan Ming Ong 
348ab3b8b22SHan Ming Ong   return bytes_read;
349ab3b8b22SHan Ming Ong }
350ab3b8b22SHan Ming Ong 
351d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options,
352d5d8d91cSRavitheja Addepally                                     lldb::SBError &error) {
353d5d8d91cSRavitheja Addepally   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
354d5d8d91cSRavitheja Addepally   ProcessSP process_sp(GetSP());
355d5d8d91cSRavitheja Addepally   error.Clear();
356d5d8d91cSRavitheja Addepally   SBTrace trace_instance;
357d5d8d91cSRavitheja Addepally   trace_instance.SetSP(process_sp);
358d5d8d91cSRavitheja Addepally   lldb::user_id_t uid = LLDB_INVALID_UID;
359d5d8d91cSRavitheja Addepally 
360d5d8d91cSRavitheja Addepally   if (!process_sp) {
361d5d8d91cSRavitheja Addepally     error.SetErrorString("invalid process");
362d5d8d91cSRavitheja Addepally   } else {
363e714c4f5SRavitheja Addepally     uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref());
364d5d8d91cSRavitheja Addepally     trace_instance.SetTraceUID(uid);
365e714c4f5SRavitheja Addepally     LLDB_LOG(log, "SBProcess::returned uid - {0}", uid);
366d5d8d91cSRavitheja Addepally   }
367d5d8d91cSRavitheja Addepally   return trace_instance;
368d5d8d91cSRavitheja Addepally }
369d5d8d91cSRavitheja Addepally 
370b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
37130fdc8d8SChris Lattner   if (out == NULL)
37230fdc8d8SChris Lattner     return;
37330fdc8d8SChris Lattner 
374acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
375b9c1b51eSKate Stone   if (process_sp) {
37630fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
37730fdc8d8SChris Lattner     char message[1024];
378b9c1b51eSKate Stone     int message_len = ::snprintf(
379b9c1b51eSKate Stone         message, sizeof(message), "Process %" PRIu64 " %s\n",
380b9c1b51eSKate Stone         process_sp->GetID(), SBDebugger::StateAsCString(event_state));
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner     if (message_len > 0)
38330fdc8d8SChris Lattner       ::fwrite(message, 1, message_len, out);
38430fdc8d8SChris Lattner   }
38530fdc8d8SChris Lattner }
38630fdc8d8SChris Lattner 
387b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event,
388b9c1b51eSKate Stone                                        SBCommandReturnObject &result) {
389acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
390b9c1b51eSKate Stone   if (process_sp) {
39130fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
39230fdc8d8SChris Lattner     char message[1024];
393b9c1b51eSKate Stone     ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
394b9c1b51eSKate Stone                process_sp->GetID(), SBDebugger::StateAsCString(event_state));
39530fdc8d8SChris Lattner 
39630fdc8d8SChris Lattner     result.AppendMessage(message);
39730fdc8d8SChris Lattner   }
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
400b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) {
401acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
402b9c1b51eSKate Stone   if (process_sp) {
403b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
404b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
405b9c1b51eSKate Stone     return process_sp->GetThreadList().SetSelectedThreadByID(
406b9c1b51eSKate Stone         thread.GetThreadID());
407af67cecdSGreg Clayton   }
40830fdc8d8SChris Lattner   return false;
40930fdc8d8SChris Lattner }
41030fdc8d8SChris Lattner 
411b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
4125160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
413ceb6b139SCaroline Tice 
414ceb6b139SCaroline Tice   bool ret_val = false;
415acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
416b9c1b51eSKate Stone   if (process_sp) {
417b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
418b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
419acdbe816SGreg Clayton     ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
420af67cecdSGreg Clayton   }
421ceb6b139SCaroline Tice 
422ceb6b139SCaroline Tice   if (log)
423b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64
424b9c1b51eSKate Stone                 ") => %s",
425324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
426324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
427ceb6b139SCaroline Tice 
428ceb6b139SCaroline Tice   return ret_val;
42930fdc8d8SChris Lattner }
43030fdc8d8SChris Lattner 
431b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
4325160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
43318b46896SJim Ingham 
43418b46896SJim Ingham   bool ret_val = false;
43518b46896SJim Ingham   ProcessSP process_sp(GetSP());
436b9c1b51eSKate Stone   if (process_sp) {
437b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
438b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
43918b46896SJim Ingham     ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
44018b46896SJim Ingham   }
44118b46896SJim Ingham 
44218b46896SJim Ingham   if (log)
44318b46896SJim Ingham     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
444324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
445324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
44618b46896SJim Ingham 
44718b46896SJim Ingham   return ret_val;
44818b46896SJim Ingham }
44918b46896SJim Ingham 
450b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) {
4515160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
452ceb6b139SCaroline Tice 
45317a6ad05SGreg Clayton   SBThread sb_thread;
45417a6ad05SGreg Clayton   ThreadSP thread_sp;
455acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
456b9c1b51eSKate Stone   if (process_sp) {
4577fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
4587fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
459b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
460b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
4617fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
46217a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
463af67cecdSGreg Clayton   }
464ceb6b139SCaroline Tice 
465ceb6b139SCaroline Tice   if (log)
46693aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
467324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
468324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
469324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
470ceb6b139SCaroline Tice 
47117a6ad05SGreg Clayton   return sb_thread;
47230fdc8d8SChris Lattner }
47330fdc8d8SChris Lattner 
474b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() {
4755e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4765e8dce4dSJason Molenda 
4775e8dce4dSJason Molenda   uint32_t num_queues = 0;
4785e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
479b9c1b51eSKate Stone   if (process_sp) {
4805e8dce4dSJason Molenda     Process::StopLocker stop_locker;
481b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
482b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
483b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
4845e8dce4dSJason Molenda       num_queues = process_sp->GetQueueList().GetSize();
4855e8dce4dSJason Molenda     }
486a61d0a5bSGreg Clayton   }
4875e8dce4dSJason Molenda 
4885e8dce4dSJason Molenda   if (log)
489324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumQueues () => %d",
490324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_queues);
4915e8dce4dSJason Molenda 
4925e8dce4dSJason Molenda   return num_queues;
4935e8dce4dSJason Molenda }
4945e8dce4dSJason Molenda 
495b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) {
4965e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4975e8dce4dSJason Molenda 
4985e8dce4dSJason Molenda   SBQueue sb_queue;
4995e8dce4dSJason Molenda   QueueSP queue_sp;
5005e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
501b9c1b51eSKate Stone   if (process_sp) {
5025e8dce4dSJason Molenda     Process::StopLocker stop_locker;
503b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
504b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
505b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
5065e8dce4dSJason Molenda       queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5075e8dce4dSJason Molenda       sb_queue.SetQueue(queue_sp);
5085e8dce4dSJason Molenda     }
509a61d0a5bSGreg Clayton   }
5105e8dce4dSJason Molenda 
5115e8dce4dSJason Molenda   if (log)
5125e8dce4dSJason Molenda     log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
513324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
514324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
515324a1036SSaleem Abdulrasool                 static_cast<void *>(queue_sp.get()));
5165e8dce4dSJason Molenda 
5175e8dce4dSJason Molenda   return sb_queue;
5185e8dce4dSJason Molenda }
5195e8dce4dSJason Molenda 
520b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) {
521bf2956a2SJim Ingham   ProcessSP process_sp(GetSP());
522b9c1b51eSKate Stone   if (process_sp) {
523b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
524b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
525bf2956a2SJim Ingham     if (include_expression_stops)
526bf2956a2SJim Ingham       return process_sp->GetStopID();
527bf2956a2SJim Ingham     else
528bf2956a2SJim Ingham       return process_sp->GetLastNaturalStopID();
529bf2956a2SJim Ingham   }
530bf2956a2SJim Ingham   return 0;
531bf2956a2SJim Ingham }
532bf2956a2SJim Ingham 
533b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
53438810f43SIlia K   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53538810f43SIlia K 
53638810f43SIlia K   SBEvent sb_event;
53738810f43SIlia K   EventSP event_sp;
53838810f43SIlia K   ProcessSP process_sp(GetSP());
539b9c1b51eSKate Stone   if (process_sp) {
540b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
541b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
54238810f43SIlia K     event_sp = process_sp->GetStopEventForStopID(stop_id);
54338810f43SIlia K     sb_event.reset(event_sp);
54438810f43SIlia K   }
54538810f43SIlia K 
54638810f43SIlia K   if (log)
547b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32
548b9c1b51eSKate Stone                 ") => SBEvent(%p)",
549b9c1b51eSKate Stone                 static_cast<void *>(process_sp.get()), stop_id,
55038810f43SIlia K                 static_cast<void *>(event_sp.get()));
55138810f43SIlia K 
55238810f43SIlia K   return sb_event;
55338810f43SIlia K }
55438810f43SIlia K 
555b9c1b51eSKate Stone StateType SBProcess::GetState() {
556ceb6b139SCaroline Tice 
557ceb6b139SCaroline Tice   StateType ret_val = eStateInvalid;
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     ret_val = process_sp->GetState();
563af67cecdSGreg Clayton   }
564ceb6b139SCaroline Tice 
5655160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
566ceb6b139SCaroline Tice   if (log)
567cfd1acedSGreg Clayton     log->Printf("SBProcess(%p)::GetState () => %s",
568324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
569750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
570ceb6b139SCaroline Tice 
571ceb6b139SCaroline Tice   return ret_val;
57230fdc8d8SChris Lattner }
57330fdc8d8SChris Lattner 
574b9c1b51eSKate Stone int SBProcess::GetExitStatus() {
5754838131bSGreg Clayton   int exit_status = 0;
576acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
577b9c1b51eSKate Stone   if (process_sp) {
578b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
579b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
580acdbe816SGreg Clayton     exit_status = process_sp->GetExitStatus();
581af67cecdSGreg Clayton   }
5825160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5834838131bSGreg Clayton   if (log)
5844838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
585324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_status,
586324a1036SSaleem Abdulrasool                 exit_status);
5874838131bSGreg Clayton 
5884838131bSGreg Clayton   return exit_status;
58930fdc8d8SChris Lattner }
59030fdc8d8SChris Lattner 
591b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() {
5924838131bSGreg Clayton   const char *exit_desc = NULL;
593acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
594b9c1b51eSKate Stone   if (process_sp) {
595b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
596b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
597acdbe816SGreg Clayton     exit_desc = process_sp->GetExitDescription();
598af67cecdSGreg Clayton   }
5995160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6004838131bSGreg Clayton   if (log)
6014838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitDescription () => %s",
602324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_desc);
6034838131bSGreg Clayton   return exit_desc;
60430fdc8d8SChris Lattner }
60530fdc8d8SChris Lattner 
606b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() {
607ceb6b139SCaroline Tice   lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
608acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
609acdbe816SGreg Clayton   if (process_sp)
610acdbe816SGreg Clayton     ret_val = process_sp->GetID();
611ceb6b139SCaroline Tice 
6125160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
613ceb6b139SCaroline Tice   if (log)
614324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64,
615324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
616ceb6b139SCaroline Tice 
617ceb6b139SCaroline Tice   return ret_val;
61830fdc8d8SChris Lattner }
61930fdc8d8SChris Lattner 
620b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() {
621949e8221SGreg Clayton   uint32_t ret_val = 0;
622949e8221SGreg Clayton   ProcessSP process_sp(GetSP());
623949e8221SGreg Clayton   if (process_sp)
624949e8221SGreg Clayton     ret_val = process_sp->GetUniqueID();
6255160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
626949e8221SGreg Clayton   if (log)
627324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32,
628324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
629949e8221SGreg Clayton   return ret_val;
630949e8221SGreg Clayton }
631949e8221SGreg Clayton 
632b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const {
633cf386e24SJohnny Chen   ByteOrder byteOrder = eByteOrderInvalid;
634acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
635acdbe816SGreg Clayton   if (process_sp)
636acdbe816SGreg Clayton     byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
637cf386e24SJohnny Chen 
6385160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
639cf386e24SJohnny Chen   if (log)
640324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetByteOrder () => %d",
641324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), byteOrder);
642cf386e24SJohnny Chen 
643cf386e24SJohnny Chen   return byteOrder;
644cf386e24SJohnny Chen }
645cf386e24SJohnny Chen 
646b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const {
647ceb6b139SCaroline Tice   uint32_t size = 0;
648acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
649acdbe816SGreg Clayton   if (process_sp)
650acdbe816SGreg Clayton     size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
651ceb6b139SCaroline Tice 
6525160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
653ceb6b139SCaroline Tice   if (log)
654324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetAddressByteSize () => %d",
655324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), size);
656ceb6b139SCaroline Tice 
657ceb6b139SCaroline Tice   return size;
65830fdc8d8SChris Lattner }
65930fdc8d8SChris Lattner 
660b9c1b51eSKate Stone SBError SBProcess::Continue() {
6615160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
662ceb6b139SCaroline Tice 
66330fdc8d8SChris Lattner   SBError sb_error;
664acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
6650c74e78dSGreg Clayton 
666acdbe816SGreg Clayton   if (log)
667324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue ()...",
668324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()));
669acdbe816SGreg Clayton 
670b9c1b51eSKate Stone   if (process_sp) {
671b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
672b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
673acdbe816SGreg Clayton 
674dc6224e0SGreg Clayton     if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
675dc6224e0SGreg Clayton       sb_error.ref() = process_sp->Resume();
676dc6224e0SGreg Clayton     else
677dc6224e0SGreg Clayton       sb_error.ref() = process_sp->ResumeSynchronous(NULL);
678b9c1b51eSKate Stone   } else
67930fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
68030fdc8d8SChris Lattner 
681b9c1b51eSKate Stone   if (log) {
682ceb6b139SCaroline Tice     SBStream sstr;
683ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
684324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s",
685324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
686324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
687ceb6b139SCaroline Tice   }
688ceb6b139SCaroline Tice 
68930fdc8d8SChris Lattner   return sb_error;
69030fdc8d8SChris Lattner }
69130fdc8d8SChris Lattner 
692b9c1b51eSKate Stone SBError SBProcess::Destroy() {
69330fdc8d8SChris Lattner   SBError sb_error;
694acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
695b9c1b51eSKate Stone   if (process_sp) {
696b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
697b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
698ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(false));
699b9c1b51eSKate Stone   } else
70030fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
70130fdc8d8SChris Lattner 
7025160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
703b9c1b51eSKate Stone   if (log) {
7044838131bSGreg Clayton     SBStream sstr;
7054838131bSGreg Clayton     sb_error.GetDescription(sstr);
7066779606aSGreg Clayton     log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s",
707324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
708324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7094838131bSGreg Clayton   }
7104838131bSGreg Clayton 
71130fdc8d8SChris Lattner   return sb_error;
71230fdc8d8SChris Lattner }
71330fdc8d8SChris Lattner 
714b9c1b51eSKate Stone SBError SBProcess::Stop() {
71530fdc8d8SChris Lattner   SBError sb_error;
716acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
717b9c1b51eSKate Stone   if (process_sp) {
718b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
719b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
720acdbe816SGreg Clayton     sb_error.SetError(process_sp->Halt());
721b9c1b51eSKate Stone   } else
72230fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
723ceb6b139SCaroline Tice 
7245160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
725b9c1b51eSKate Stone   if (log) {
726ceb6b139SCaroline Tice     SBStream sstr;
727ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
72893aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s",
729324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
730324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
731ceb6b139SCaroline Tice   }
732ceb6b139SCaroline Tice 
73330fdc8d8SChris Lattner   return sb_error;
73430fdc8d8SChris Lattner }
73530fdc8d8SChris Lattner 
736b9c1b51eSKate Stone SBError SBProcess::Kill() {
73730fdc8d8SChris Lattner   SBError sb_error;
738acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
739b9c1b51eSKate Stone   if (process_sp) {
740b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
741b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
742ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(true));
743b9c1b51eSKate Stone   } else
74430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
745ceb6b139SCaroline Tice 
7465160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
747b9c1b51eSKate Stone   if (log) {
748ceb6b139SCaroline Tice     SBStream sstr;
749ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
75093aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s",
751324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
752324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
753ceb6b139SCaroline Tice   }
754ceb6b139SCaroline Tice 
75530fdc8d8SChris Lattner   return sb_error;
75630fdc8d8SChris Lattner }
75730fdc8d8SChris Lattner 
758b9c1b51eSKate Stone SBError SBProcess::Detach() {
759acff8950SJim Ingham   // FIXME: This should come from a process default.
760acff8950SJim Ingham   bool keep_stopped = false;
761acff8950SJim Ingham   return Detach(keep_stopped);
762acff8950SJim Ingham }
763acff8950SJim Ingham 
764b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) {
76530fdc8d8SChris Lattner   SBError sb_error;
766acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
767b9c1b51eSKate Stone   if (process_sp) {
768b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
769b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
770acff8950SJim Ingham     sb_error.SetError(process_sp->Detach(keep_stopped));
771b9c1b51eSKate Stone   } else
77230fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
77330fdc8d8SChris Lattner 
77430fdc8d8SChris Lattner   return sb_error;
77530fdc8d8SChris Lattner }
77630fdc8d8SChris Lattner 
777b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) {
77830fdc8d8SChris Lattner   SBError sb_error;
779acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
780b9c1b51eSKate Stone   if (process_sp) {
781b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
782b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
783acdbe816SGreg Clayton     sb_error.SetError(process_sp->Signal(signo));
784b9c1b51eSKate Stone   } else
78530fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
7865160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
787b9c1b51eSKate Stone   if (log) {
7884838131bSGreg Clayton     SBStream sstr;
7894838131bSGreg Clayton     sb_error.GetDescription(sstr);
7904838131bSGreg Clayton     log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
791324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), signo,
792324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7934838131bSGreg Clayton   }
79430fdc8d8SChris Lattner   return sb_error;
79530fdc8d8SChris Lattner }
79630fdc8d8SChris Lattner 
797b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() {
79898d0a4b3SChaoren Lin   if (auto process_sp = GetSP())
79998d0a4b3SChaoren Lin     return SBUnixSignals{process_sp};
800802dc402STodd Fiala 
80198d0a4b3SChaoren Lin   return {};
802802dc402STodd Fiala }
803802dc402STodd Fiala 
804b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() {
805cfc0935eSJim Ingham   ProcessSP process_sp(GetSP());
806b9c1b51eSKate Stone   if (process_sp) {
807cfc0935eSJim Ingham     process_sp->SendAsyncInterrupt();
808cfc0935eSJim Ingham   }
809cfc0935eSJim Ingham }
810cfc0935eSJim Ingham 
811b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) {
8124838131bSGreg Clayton   SBThread sb_thread;
81317a6ad05SGreg Clayton   ThreadSP thread_sp;
814acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
815b9c1b51eSKate Stone   if (process_sp) {
8167fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
8177fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
818b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
819b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
8207fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
82117a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
822af67cecdSGreg Clayton   }
8234838131bSGreg Clayton 
8245160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
8254838131bSGreg Clayton   if (log)
826b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64
827b9c1b51eSKate Stone                 ") => SBThread (%p)",
828324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
829324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
8304838131bSGreg Clayton 
8314838131bSGreg Clayton   return sb_thread;
83230fdc8d8SChris Lattner }
83330fdc8d8SChris Lattner 
834b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
83518b46896SJim Ingham   SBThread sb_thread;
83618b46896SJim Ingham   ThreadSP thread_sp;
83718b46896SJim Ingham   ProcessSP process_sp(GetSP());
838b9c1b51eSKate Stone   if (process_sp) {
83918b46896SJim Ingham     Process::StopLocker stop_locker;
84018b46896SJim Ingham     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
841b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
842b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
843b9c1b51eSKate Stone     thread_sp =
844b9c1b51eSKate Stone         process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
84518b46896SJim Ingham     sb_thread.SetThread(thread_sp);
84618b46896SJim Ingham   }
84718b46896SJim Ingham 
8485160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
84918b46896SJim Ingham   if (log)
85018b46896SJim Ingham     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
851324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
852324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
85318b46896SJim Ingham 
85418b46896SJim Ingham   return sb_thread;
85518b46896SJim Ingham }
85618b46896SJim Ingham 
857b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
8585160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
859ceb6b139SCaroline Tice 
860ceb6b139SCaroline Tice   StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
861ceb6b139SCaroline Tice 
862ceb6b139SCaroline Tice   if (log)
863324a1036SSaleem Abdulrasool     log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
864324a1036SSaleem Abdulrasool                 static_cast<void *>(event.get()),
865750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
866ceb6b139SCaroline Tice 
867ceb6b139SCaroline Tice   return ret_val;
86830fdc8d8SChris Lattner }
86930fdc8d8SChris Lattner 
870b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
871ea2cc5e0SPavel Labath   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
872ea2cc5e0SPavel Labath 
873ea2cc5e0SPavel Labath   bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
874ea2cc5e0SPavel Labath 
875ea2cc5e0SPavel Labath   if (log)
876400e1809SHans Wennborg     log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
877400e1809SHans Wennborg                 static_cast<void *>(event.get()), ret_val);
878ea2cc5e0SPavel Labath 
879ea2cc5e0SPavel Labath   return ret_val;
88030fdc8d8SChris Lattner }
88130fdc8d8SChris Lattner 
882b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
8830161b49cSJim Ingham   return Process::ProcessEventData::GetNumRestartedReasons(event.get());
8840161b49cSJim Ingham }
8850161b49cSJim Ingham 
8860161b49cSJim Ingham const char *
887b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
888b9c1b51eSKate Stone                                               size_t idx) {
8890161b49cSJim Ingham   return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
8900161b49cSJim Ingham }
8910161b49cSJim Ingham 
892b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
89375930019STodd Fiala   ProcessSP process_sp =
89475930019STodd Fiala       Process::ProcessEventData::GetProcessFromEvent(event.get());
895b9c1b51eSKate Stone   if (!process_sp) {
89605097246SAdrian Prantl     // StructuredData events also know the process they come from. Try that.
89775930019STodd Fiala     process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
89875930019STodd Fiala   }
89975930019STodd Fiala 
90075930019STodd Fiala   return SBProcess(process_sp);
90130fdc8d8SChris Lattner }
90230fdc8d8SChris Lattner 
903b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
90406d2855fSIlia K   return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
90506d2855fSIlia K }
90606d2855fSIlia K 
90775930019STodd Fiala lldb::SBStructuredData
908b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
90975930019STodd Fiala   return SBStructuredData(event.GetSP());
91075930019STodd Fiala }
91175930019STodd Fiala 
912b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
91375930019STodd Fiala   return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
91475930019STodd Fiala          !EventIsStructuredDataEvent(event);
91575930019STodd Fiala }
91675930019STodd Fiala 
917b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
91875930019STodd Fiala   EventSP event_sp = event.GetSP();
91975930019STodd Fiala   EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
920b9c1b51eSKate Stone   return event_data && (event_data->GetFlavor() ==
921b9c1b51eSKate Stone                         EventDataStructuredData::GetFlavorString());
922e6bc6cb9SJim Ingham }
92330fdc8d8SChris Lattner 
924b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const {
9255160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
926ceb6b139SCaroline Tice 
927acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
928acdbe816SGreg Clayton 
929acdbe816SGreg Clayton   SBBroadcaster broadcaster(process_sp.get(), false);
930ceb6b139SCaroline Tice 
931ceb6b139SCaroline Tice   if (log)
932324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
933324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
934324a1036SSaleem Abdulrasool                 static_cast<void *>(broadcaster.get()));
935ceb6b139SCaroline Tice 
93630fdc8d8SChris Lattner   return broadcaster;
93730fdc8d8SChris Lattner }
93830fdc8d8SChris Lattner 
939b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() {
9404bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
9414bddaeb5SJim Ingham }
9424bddaeb5SJim Ingham 
943b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
944b9c1b51eSKate Stone                              SBError &sb_error) {
9455160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
946ceb6b139SCaroline Tice 
94730fdc8d8SChris Lattner   size_t bytes_read = 0;
94830fdc8d8SChris Lattner 
949acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
950acdbe816SGreg Clayton 
9514838131bSGreg Clayton   if (log)
952b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
953b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
954324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
955324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
956324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
9574838131bSGreg Clayton 
958b9c1b51eSKate Stone   if (process_sp) {
9597fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
960b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
961b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
962b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
9637fdf9ef1SGreg Clayton       bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
964b9c1b51eSKate Stone     } else {
965c9858e4dSGreg Clayton       if (log)
966324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::ReadMemory() => error: process is running",
967324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
9687fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
9697fdf9ef1SGreg Clayton     }
970b9c1b51eSKate Stone   } else {
97130fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
97230fdc8d8SChris Lattner   }
97330fdc8d8SChris Lattner 
974b9c1b51eSKate Stone   if (log) {
97593aa84e8SGreg Clayton     SBStream sstr;
97693aa84e8SGreg Clayton     sb_error.GetDescription(sstr);
977b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
978b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
979324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
980324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
981324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
982324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_read));
98393aa84e8SGreg Clayton   }
984ceb6b139SCaroline Tice 
98530fdc8d8SChris Lattner   return bytes_read;
98630fdc8d8SChris Lattner }
98730fdc8d8SChris Lattner 
988b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
989b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
990e91b7957SGreg Clayton   size_t bytes_read = 0;
991acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
992b9c1b51eSKate Stone   if (process_sp) {
9937fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
994b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
995b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
996b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
997b9c1b51eSKate Stone       bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
998b9c1b51eSKate Stone                                                      sb_error.ref());
999b9c1b51eSKate Stone     } else {
10005160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1001c9858e4dSGreg Clayton       if (log)
1002b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process "
1003b9c1b51eSKate Stone                     "is running",
1004324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10057fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10067fdf9ef1SGreg Clayton     }
1007b9c1b51eSKate Stone   } else {
1008e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1009e91b7957SGreg Clayton   }
1010e91b7957SGreg Clayton   return bytes_read;
1011e91b7957SGreg Clayton }
1012e91b7957SGreg Clayton 
1013b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
1014b9c1b51eSKate Stone                                            lldb::SBError &sb_error) {
10157fdf9ef1SGreg Clayton   uint64_t value = 0;
1016acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1017b9c1b51eSKate Stone   if (process_sp) {
10187fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1019b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1020b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1021b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1022b9c1b51eSKate Stone       value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
1023b9c1b51eSKate Stone                                                         sb_error.ref());
1024b9c1b51eSKate Stone     } else {
10255160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1026c9858e4dSGreg Clayton       if (log)
1027b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process "
1028b9c1b51eSKate Stone                     "is running",
1029324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10307fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10317fdf9ef1SGreg Clayton     }
1032b9c1b51eSKate Stone   } else {
1033e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1034e91b7957SGreg Clayton   }
10357fdf9ef1SGreg Clayton   return value;
1036e91b7957SGreg Clayton }
1037e91b7957SGreg Clayton 
1038b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
1039b9c1b51eSKate Stone                                               lldb::SBError &sb_error) {
1040e91b7957SGreg Clayton   lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1041acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1042b9c1b51eSKate Stone   if (process_sp) {
10437fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1044b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1045b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1046b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
10477fdf9ef1SGreg Clayton       ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
1048b9c1b51eSKate Stone     } else {
10495160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1050c9858e4dSGreg Clayton       if (log)
1051b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process "
1052b9c1b51eSKate Stone                     "is running",
1053324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10547fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10557fdf9ef1SGreg Clayton     }
1056b9c1b51eSKate Stone   } else {
1057e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1058e91b7957SGreg Clayton   }
1059e91b7957SGreg Clayton   return ptr;
1060e91b7957SGreg Clayton }
1061e91b7957SGreg Clayton 
1062b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
1063b9c1b51eSKate Stone                               SBError &sb_error) {
106430fdc8d8SChris Lattner   size_t bytes_written = 0;
106530fdc8d8SChris Lattner 
10665160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1067acdbe816SGreg Clayton 
1068acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1069acdbe816SGreg Clayton 
10704838131bSGreg Clayton   if (log)
1071b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1072b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1073324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1074b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1075324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
10764838131bSGreg Clayton 
1077b9c1b51eSKate Stone   if (process_sp) {
10787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1079b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1080b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1081b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1082b9c1b51eSKate Stone       bytes_written =
1083b9c1b51eSKate Stone           process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
1084b9c1b51eSKate Stone     } else {
1085c9858e4dSGreg Clayton       if (log)
1086324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::WriteMemory() => error: process is running",
1087324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10887fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10897fdf9ef1SGreg Clayton     }
109030fdc8d8SChris Lattner   }
109130fdc8d8SChris Lattner 
1092b9c1b51eSKate Stone   if (log) {
10934838131bSGreg Clayton     SBStream sstr;
10944838131bSGreg Clayton     sb_error.GetDescription(sstr);
1095b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1096b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1097324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1098b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1099324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1100324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_written));
11014838131bSGreg Clayton   }
11024838131bSGreg Clayton 
110330fdc8d8SChris Lattner   return bytes_written;
110430fdc8d8SChris Lattner }
110530fdc8d8SChris Lattner 
1106b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) {
1107da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1108da7bc7d0SGreg Clayton 
1109acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1110b9c1b51eSKate Stone   if (process_sp) {
1111dde9cff3SCaroline Tice     char path[PATH_MAX];
1112dde9cff3SCaroline Tice     GetTarget().GetExecutable().GetPath(path, sizeof(path));
1113acdbe816SGreg Clayton     Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
11141d273166SGreg Clayton     const char *exe_name = NULL;
11151d273166SGreg Clayton     if (exe_module)
11161d273166SGreg Clayton       exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
11171d273166SGreg Clayton 
1118d01b2953SDaniel Malea     strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1119b9c1b51eSKate Stone                 process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1120b9c1b51eSKate Stone                 GetNumThreads(), exe_name ? ", executable = " : "",
11211d273166SGreg Clayton                 exe_name ? exe_name : "");
1122b9c1b51eSKate Stone   } else
1123da7bc7d0SGreg Clayton     strm.PutCString("No value");
1124dde9cff3SCaroline Tice 
1125dde9cff3SCaroline Tice   return true;
1126dde9cff3SCaroline Tice }
11278f343b09SGreg Clayton 
11288f343b09SGreg Clayton uint32_t
1129b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
11305160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1131f9ef60d2SJohnny Chen 
1132f9ef60d2SJohnny Chen   uint32_t num = 0;
1133f9ef60d2SJohnny Chen   ProcessSP process_sp(GetSP());
1134b9c1b51eSKate Stone   if (process_sp) {
1135b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1136b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1137f9ef60d2SJohnny Chen     sb_error.SetError(process_sp->GetWatchpointSupportInfo(num));
1138f9ef60d2SJohnny Chen     if (log)
1139f9ef60d2SJohnny Chen       log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1140324a1036SSaleem Abdulrasool                   static_cast<void *>(process_sp.get()), num);
1141b9c1b51eSKate Stone   } else {
1142f9ef60d2SJohnny Chen     sb_error.SetErrorString("SBProcess is invalid");
1143f9ef60d2SJohnny Chen   }
1144f9ef60d2SJohnny Chen   return num;
1145f9ef60d2SJohnny Chen }
1146f9ef60d2SJohnny Chen 
1147b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1148b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
11494fbd67acSTamas Berghammer   return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
11504fbd67acSTamas Berghammer }
11514fbd67acSTamas Berghammer 
1152b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
11534fbd67acSTamas Berghammer                               const lldb::SBFileSpec &sb_remote_image_spec,
1154b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1155abc5d72fSJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1156acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1157b9c1b51eSKate Stone   if (process_sp) {
11587fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1159b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1160abc5d72fSJim Ingham       if (log)
1161abc5d72fSJim Ingham         log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage"
1162abc5d72fSJim Ingham                     "for: %s",
1163abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()),
1164abc5d72fSJim Ingham                     sb_local_image_spec.GetFilename());
1165abc5d72fSJim Ingham 
1166b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1167b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
11683cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1169b9c1b51eSKate Stone       return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1170b9c1b51eSKate Stone                                     *sb_remote_image_spec, sb_error.ref());
1171b9c1b51eSKate Stone     } else {
1172c9858e4dSGreg Clayton       if (log)
1173324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::LoadImage() => error: process is running",
1174324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11757fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11767fdf9ef1SGreg Clayton     }
1177abc5d72fSJim Ingham   } else {
1178abc5d72fSJim Ingham     if (log)
1179abc5d72fSJim Ingham       log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid"
1180abc5d72fSJim Ingham                     " process",
1181abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()));
1182abc5d72fSJim Ingham     sb_error.SetErrorString("process is invalid");
11837fdf9ef1SGreg Clayton   }
11848f343b09SGreg Clayton   return LLDB_INVALID_IMAGE_TOKEN;
11858f343b09SGreg Clayton }
11868f343b09SGreg Clayton 
11870d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec,
11880d231f71SJim Ingham                                         SBStringList &paths,
11890d231f71SJim Ingham                                         lldb::SBFileSpec &loaded_path,
11900d231f71SJim Ingham                                         lldb::SBError &error) {
11910d231f71SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
11920d231f71SJim Ingham   ProcessSP process_sp(GetSP());
11930d231f71SJim Ingham   if (process_sp) {
11940d231f71SJim Ingham     Process::StopLocker stop_locker;
11950d231f71SJim Ingham     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
11960d231f71SJim Ingham       if (log)
11970d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => "
11980d231f71SJim Ingham                     "calling Platform::LoadImageUsingPaths for: %s",
11990d231f71SJim Ingham                     static_cast<void *>(process_sp.get()),
12000d231f71SJim Ingham                     image_spec.GetFilename());
12010d231f71SJim Ingham 
12020d231f71SJim Ingham       std::lock_guard<std::recursive_mutex> guard(
12030d231f71SJim Ingham         process_sp->GetTarget().GetAPIMutex());
12040d231f71SJim Ingham       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
12050d231f71SJim Ingham       size_t num_paths = paths.GetSize();
12060d231f71SJim Ingham       std::vector<std::string> paths_vec;
12070d231f71SJim Ingham       paths_vec.reserve(num_paths);
12080d231f71SJim Ingham       for (size_t i = 0; i < num_paths; i++)
12090d231f71SJim Ingham         paths_vec.push_back(paths.GetStringAtIndex(i));
12100d231f71SJim Ingham       FileSpec loaded_spec;
12110d231f71SJim Ingham 
12120d231f71SJim Ingham       uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(),
12130d231f71SJim Ingham                                                         *image_spec,
12140d231f71SJim Ingham                                                         paths_vec,
12150d231f71SJim Ingham                                                         error.ref(),
12160d231f71SJim Ingham                                                         &loaded_spec);
12170d231f71SJim Ingham        if (token != LLDB_INVALID_IMAGE_TOKEN)
12180d231f71SJim Ingham           loaded_path = loaded_spec;
12190d231f71SJim Ingham        return token;
12200d231f71SJim Ingham     } else {
12210d231f71SJim Ingham       if (log)
12220d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
12230d231f71SJim Ingham                     "process is running",
12240d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
12250d231f71SJim Ingham       error.SetErrorString("process is running");
12260d231f71SJim Ingham     }
12270d231f71SJim Ingham   } else {
12280d231f71SJim Ingham     if (log)
12290d231f71SJim Ingham       log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
12300d231f71SJim Ingham                    "called with invalid process",
12310d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
12320d231f71SJim Ingham     error.SetErrorString("process is invalid");
12330d231f71SJim Ingham   }
12340d231f71SJim Ingham 
12350d231f71SJim Ingham   return LLDB_INVALID_IMAGE_TOKEN;
12360d231f71SJim Ingham }
12370d231f71SJim Ingham 
1238b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
12398f343b09SGreg Clayton   lldb::SBError sb_error;
1240acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1241b9c1b51eSKate Stone   if (process_sp) {
12427fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1243b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1244b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1245b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
12463cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1247b9c1b51eSKate Stone       sb_error.SetError(
1248b9c1b51eSKate Stone           platform_sp->UnloadImage(process_sp.get(), image_token));
1249b9c1b51eSKate Stone     } else {
12505160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1251c9858e4dSGreg Clayton       if (log)
1252324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::UnloadImage() => error: process is running",
1253324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12547fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
12557fdf9ef1SGreg Clayton     }
1256b9c1b51eSKate Stone   } else
12578f343b09SGreg Clayton     sb_error.SetErrorString("invalid process");
12588f343b09SGreg Clayton   return sb_error;
12598f343b09SGreg Clayton }
12608c71337aSJason Molenda 
1261b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) {
1262a332978bSJason Molenda   lldb::SBError sb_error;
1263a332978bSJason Molenda   ProcessSP process_sp(GetSP());
1264b9c1b51eSKate Stone   if (process_sp) {
1265a332978bSJason Molenda     Process::StopLocker stop_locker;
1266b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1267b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1268b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1269a332978bSJason Molenda       sb_error.SetError(process_sp->SendEventData(event_data));
1270b9c1b51eSKate Stone     } else {
1271a332978bSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1272a332978bSJason Molenda       if (log)
1273b9c1b51eSKate Stone         log->Printf(
1274b9c1b51eSKate Stone             "SBProcess(%p)::SendEventData() => error: process is running",
1275324a1036SSaleem Abdulrasool             static_cast<void *>(process_sp.get()));
1276a332978bSJason Molenda       sb_error.SetErrorString("process is running");
1277a332978bSJason Molenda     }
1278b9c1b51eSKate Stone   } else
1279a332978bSJason Molenda     sb_error.SetErrorString("invalid process");
1280a332978bSJason Molenda   return sb_error;
1281a332978bSJason Molenda }
1282a332978bSJason Molenda 
1283b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
12848c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1285b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12868c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
128795d005c7SJason Molenda     return runtime->GetExtendedBacktraceTypes().size();
12888c71337aSJason Molenda   }
12898c71337aSJason Molenda   return 0;
12908c71337aSJason Molenda }
12918c71337aSJason Molenda 
1292b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
12938c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1294b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12958c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
1296b9c1b51eSKate Stone     const std::vector<ConstString> &names =
1297b9c1b51eSKate Stone         runtime->GetExtendedBacktraceTypes();
1298b9c1b51eSKate Stone     if (idx < names.size()) {
12998c71337aSJason Molenda       return names[idx].AsCString();
1300b9c1b51eSKate Stone     } else {
13018c71337aSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
13028c71337aSJason Molenda       if (log)
1303b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => "
1304b9c1b51eSKate Stone                     "error: requested extended backtrace name out of bounds",
1305324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
13068c71337aSJason Molenda     }
13078c71337aSJason Molenda   }
13088c71337aSJason Molenda   return NULL;
13098c71337aSJason Molenda }
1310a51ea382SKuba Brecka 
1311b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1312a51ea382SKuba Brecka   ProcessSP process_sp(GetSP());
1313a51ea382SKuba Brecka   SBThreadCollection threads;
1314b9c1b51eSKate Stone   if (process_sp) {
1315a51ea382SKuba Brecka     threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1316a51ea382SKuba Brecka   }
1317a51ea382SKuba Brecka   return threads;
1318a51ea382SKuba Brecka }
131963927548SKuba Brecka 
1320b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent(
1321b9c1b51eSKate Stone     InstrumentationRuntimeType type) {
132263927548SKuba Brecka   ProcessSP process_sp(GetSP());
132363927548SKuba Brecka   if (!process_sp)
132463927548SKuba Brecka     return false;
132563927548SKuba Brecka 
1326b9c1b51eSKate Stone   InstrumentationRuntimeSP runtime_sp =
1327b9c1b51eSKate Stone       process_sp->GetInstrumentationRuntime(type);
132863927548SKuba Brecka 
132963927548SKuba Brecka   if (!runtime_sp.get())
133063927548SKuba Brecka     return false;
133163927548SKuba Brecka 
133263927548SKuba Brecka   return runtime_sp->IsActive();
133363927548SKuba Brecka }
1334f7d1893fSAdrian McCarthy 
1335b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) {
1336f7d1893fSAdrian McCarthy   lldb::SBError error;
1337f7d1893fSAdrian McCarthy   ProcessSP process_sp(GetSP());
1338b9c1b51eSKate Stone   if (!process_sp) {
1339f7d1893fSAdrian McCarthy     error.SetErrorString("SBProcess is invalid");
1340f7d1893fSAdrian McCarthy     return error;
1341f7d1893fSAdrian McCarthy   }
1342f7d1893fSAdrian McCarthy 
1343b9c1b51eSKate Stone   std::lock_guard<std::recursive_mutex> guard(
1344b9c1b51eSKate Stone       process_sp->GetTarget().GetAPIMutex());
1345f7d1893fSAdrian McCarthy 
1346b9c1b51eSKate Stone   if (process_sp->GetState() != eStateStopped) {
1347f7d1893fSAdrian McCarthy     error.SetErrorString("the process is not stopped");
1348f7d1893fSAdrian McCarthy     return error;
1349f7d1893fSAdrian McCarthy   }
1350f7d1893fSAdrian McCarthy 
13518f3be7a3SJonas Devlieghere   FileSpec core_file(file_name);
1352f7d1893fSAdrian McCarthy   error.ref() = PluginManager::SaveCore(process_sp, core_file);
1353f7d1893fSAdrian McCarthy   return error;
1354f7d1893fSAdrian McCarthy }
135526036843SHoward Hellyer 
135626036843SHoward Hellyer lldb::SBError
1357b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1358b9c1b51eSKate Stone                                SBMemoryRegionInfo &sb_region_info) {
135926036843SHoward Hellyer   lldb::SBError sb_error;
136026036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1361b9c1b51eSKate Stone   if (process_sp) {
136226036843SHoward Hellyer     Process::StopLocker stop_locker;
1363b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1364b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1365b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1366*36788bbbSTatyana Krasnukha 
1367b9c1b51eSKate Stone       sb_error.ref() =
1368*36788bbbSTatyana Krasnukha           process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref());
1369b9c1b51eSKate Stone     } else {
137026036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
137126036843SHoward Hellyer       if (log)
1372b9c1b51eSKate Stone         log->Printf(
1373b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
137426036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
137526036843SHoward Hellyer       sb_error.SetErrorString("process is running");
137626036843SHoward Hellyer     }
1377b9c1b51eSKate Stone   } else {
137826036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
137926036843SHoward Hellyer   }
138026036843SHoward Hellyer   return sb_error;
138126036843SHoward Hellyer }
138226036843SHoward Hellyer 
1383b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
138426036843SHoward Hellyer   lldb::SBMemoryRegionInfoList sb_region_list;
1385*36788bbbSTatyana Krasnukha 
138626036843SHoward Hellyer   ProcessSP process_sp(GetSP());
138726036843SHoward Hellyer   Process::StopLocker stop_locker;
1388*36788bbbSTatyana Krasnukha   if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) {
1389b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1390b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1391*36788bbbSTatyana Krasnukha 
1392*36788bbbSTatyana Krasnukha     process_sp->GetMemoryRegions(sb_region_list.ref());
1393b9c1b51eSKate Stone   } else {
139426036843SHoward Hellyer     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
139526036843SHoward Hellyer     if (log)
1396b9c1b51eSKate Stone       log->Printf(
1397b9c1b51eSKate Stone           "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
139826036843SHoward Hellyer           static_cast<void *>(process_sp.get()));
139926036843SHoward Hellyer   }
1400*36788bbbSTatyana Krasnukha 
140126036843SHoward Hellyer   return sb_region_list;
140226036843SHoward Hellyer }
1403141a6263SVadim Macagon 
1404141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() {
1405141a6263SVadim Macagon   lldb::SBProcessInfo sb_proc_info;
1406141a6263SVadim Macagon   ProcessSP process_sp(GetSP());
1407141a6263SVadim Macagon   ProcessInstanceInfo proc_info;
1408141a6263SVadim Macagon   if (process_sp && process_sp->GetProcessInfo(proc_info)) {
1409141a6263SVadim Macagon     sb_proc_info.SetProcessInfo(proc_info);
1410141a6263SVadim Macagon   }
1411141a6263SVadim Macagon   return sb_proc_info;
1412141a6263SVadim Macagon }
1413