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/StreamFile.h"
2226036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h"
2330fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
258c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
266611103cSGreg Clayton #include "lldb/Target/Target.h"
276611103cSGreg Clayton #include "lldb/Target/Thread.h"
28145d95c9SPavel Labath #include "lldb/Utility/Args.h"
296f9e6901SZachary Turner #include "lldb/Utility/Log.h"
30d821c997SPavel Labath #include "lldb/Utility/State.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;
133*8f3be7a3SJonas Devlieghere       ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path),
134*8f3be7a3SJonas Devlieghere                                     FileSpec(stderr_path),
135*8f3be7a3SJonas Devlieghere                                     FileSpec(working_directory), launch_flags);
136acdbe816SGreg Clayton       Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
137982c9762SGreg Clayton       if (exe_module)
13814715c68SGreg Clayton         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
139982c9762SGreg Clayton       if (argv)
140982c9762SGreg Clayton         launch_info.GetArguments().AppendArguments(argv);
141982c9762SGreg Clayton       if (envp)
14262930e57SPavel Labath         launch_info.GetEnvironment() = Environment(envp);
143acdbe816SGreg Clayton       error.SetError(process_sp->Launch(launch_info));
144b9c1b51eSKate Stone     } else {
1459631aae2SJames McIlree       error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
1469631aae2SJames McIlree     }
147b9c1b51eSKate Stone   } else {
1489631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1499631aae2SJames McIlree   }
1509631aae2SJames McIlree 
1519631aae2SJames McIlree   if (log) {
1529631aae2SJames McIlree     SBStream sstr;
1539631aae2SJames McIlree     error.GetDescription(sstr);
154324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
155324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
156324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1579631aae2SJames McIlree   }
1589631aae2SJames McIlree 
1599631aae2SJames McIlree   return error.Success();
1609631aae2SJames McIlree }
1619631aae2SJames McIlree 
162b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
163b9c1b51eSKate Stone                                             lldb::SBError &error) {
164acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
165b9c1b51eSKate Stone   if (process_sp) {
166b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
167b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
168b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
169144f3a9cSGreg Clayton       ProcessAttachInfo attach_info;
170144f3a9cSGreg Clayton       attach_info.SetProcessID(pid);
171acdbe816SGreg Clayton       error.SetError(process_sp->Attach(attach_info));
172b9c1b51eSKate Stone     } else {
173b9c1b51eSKate Stone       error.SetErrorString(
174b9c1b51eSKate Stone           "must be in eStateConnected to call RemoteAttachToProcessWithID");
1759631aae2SJames McIlree     }
176b9c1b51eSKate Stone   } else {
1779631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1789631aae2SJames McIlree   }
1799631aae2SJames McIlree 
1805160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1819631aae2SJames McIlree   if (log) {
1829631aae2SJames McIlree     SBStream sstr;
1839631aae2SJames McIlree     error.GetDescription(sstr);
184b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64
185b9c1b51eSKate Stone                 ") => SBError (%p): %s",
186324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), pid,
187324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1889631aae2SJames McIlree   }
1899631aae2SJames McIlree 
1909631aae2SJames McIlree   return error.Success();
1919631aae2SJames McIlree }
1929631aae2SJames McIlree 
193b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() {
1945160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
195ceb6b139SCaroline Tice 
196ceb6b139SCaroline Tice   uint32_t num_threads = 0;
197acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
198b9c1b51eSKate Stone   if (process_sp) {
1997fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
2007fdf9ef1SGreg Clayton 
2017fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
202b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
203b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
204acdbe816SGreg Clayton     num_threads = process_sp->GetThreadList().GetSize(can_update);
20530fdc8d8SChris Lattner   }
206ceb6b139SCaroline Tice 
207ceb6b139SCaroline Tice   if (log)
208324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumThreads () => %d",
209324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_threads);
210ceb6b139SCaroline Tice 
211ceb6b139SCaroline Tice   return num_threads;
21230fdc8d8SChris Lattner }
21330fdc8d8SChris Lattner 
214b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const {
2155160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
216ceb6b139SCaroline Tice 
21730fdc8d8SChris Lattner   SBThread sb_thread;
21817a6ad05SGreg Clayton   ThreadSP thread_sp;
219acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
220b9c1b51eSKate Stone   if (process_sp) {
221b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
222b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
223acdbe816SGreg Clayton     thread_sp = process_sp->GetThreadList().GetSelectedThread();
22417a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
225af67cecdSGreg Clayton   }
226ceb6b139SCaroline Tice 
227ceb6b139SCaroline Tice   if (log)
228324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
229324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
230324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
231ceb6b139SCaroline Tice 
23230fdc8d8SChris Lattner   return sb_thread;
23330fdc8d8SChris Lattner }
23430fdc8d8SChris Lattner 
235b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
236b9c1b51eSKate Stone                                          lldb::addr_t context) {
2375160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
238a4d8747dSGreg Clayton 
239a4d8747dSGreg Clayton   SBThread sb_thread;
240a4d8747dSGreg Clayton   ThreadSP thread_sp;
241a4d8747dSGreg Clayton   ProcessSP process_sp(GetSP());
242b9c1b51eSKate Stone   if (process_sp) {
243b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
244b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
245a4d8747dSGreg Clayton     thread_sp = process_sp->CreateOSPluginThread(tid, context);
246a4d8747dSGreg Clayton     sb_thread.SetThread(thread_sp);
247a4d8747dSGreg Clayton   }
248a4d8747dSGreg Clayton 
249a4d8747dSGreg Clayton   if (log)
250b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64
251b9c1b51eSKate Stone                 ", context=0x%" PRIx64 ") => SBThread(%p)",
252324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid, context,
253324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
254a4d8747dSGreg Clayton 
255a4d8747dSGreg Clayton   return sb_thread;
256a4d8747dSGreg Clayton }
257a4d8747dSGreg Clayton 
258b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const {
2595160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
260ceb6b139SCaroline Tice 
26130fdc8d8SChris Lattner   SBTarget sb_target;
262b9556accSGreg Clayton   TargetSP target_sp;
263acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
264b9c1b51eSKate Stone   if (process_sp) {
265acdbe816SGreg Clayton     target_sp = process_sp->GetTarget().shared_from_this();
266b9556accSGreg Clayton     sb_target.SetSP(target_sp);
267b9556accSGreg Clayton   }
268ceb6b139SCaroline Tice 
269ceb6b139SCaroline Tice   if (log)
270324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)",
271324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
272324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
273ceb6b139SCaroline Tice 
27430fdc8d8SChris Lattner   return sb_target;
27530fdc8d8SChris Lattner }
27630fdc8d8SChris Lattner 
277b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
2785160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
279ceb6b139SCaroline Tice 
280ceb6b139SCaroline Tice   size_t ret_val = 0;
281acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
282b9c1b51eSKate Stone   if (process_sp) {
28397206d57SZachary Turner     Status error;
284acdbe816SGreg Clayton     ret_val = process_sp->PutSTDIN(src, src_len, error);
28530fdc8d8SChris Lattner   }
286ceb6b139SCaroline Tice 
287ceb6b139SCaroline Tice   if (log)
288b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64
289b9c1b51eSKate Stone                 ") => %" PRIu64,
290324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), src,
291b9c1b51eSKate Stone                 static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val));
292ceb6b139SCaroline Tice 
293ceb6b139SCaroline Tice   return ret_val;
29430fdc8d8SChris Lattner }
29530fdc8d8SChris Lattner 
296b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
297cfd1acedSGreg Clayton   size_t bytes_read = 0;
298acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
299b9c1b51eSKate Stone   if (process_sp) {
30097206d57SZachary Turner     Status error;
301acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
30230fdc8d8SChris Lattner   }
303ceb6b139SCaroline Tice 
3045160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
305ceb6b139SCaroline Tice   if (log)
306b9c1b51eSKate Stone     log->Printf(
307b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64
308b9c1b51eSKate Stone         ") => %" PRIu64,
309b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
310b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
311ceb6b139SCaroline Tice 
312cfd1acedSGreg Clayton   return bytes_read;
31330fdc8d8SChris Lattner }
31430fdc8d8SChris Lattner 
315b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
316cfd1acedSGreg Clayton   size_t bytes_read = 0;
317acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
318b9c1b51eSKate Stone   if (process_sp) {
31997206d57SZachary Turner     Status error;
320acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
32130fdc8d8SChris Lattner   }
322ceb6b139SCaroline Tice 
3235160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
324ceb6b139SCaroline Tice   if (log)
325b9c1b51eSKate Stone     log->Printf(
326b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64
327b9c1b51eSKate Stone         ") => %" PRIu64,
328b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
329b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
330ceb6b139SCaroline Tice 
331cfd1acedSGreg Clayton   return bytes_read;
33230fdc8d8SChris Lattner }
33330fdc8d8SChris Lattner 
334b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
335ab3b8b22SHan Ming Ong   size_t bytes_read = 0;
336ab3b8b22SHan Ming Ong   ProcessSP process_sp(GetSP());
337b9c1b51eSKate Stone   if (process_sp) {
33897206d57SZachary Turner     Status error;
339ab3b8b22SHan Ming Ong     bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
340ab3b8b22SHan Ming Ong   }
341ab3b8b22SHan Ming Ong 
3425160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
343ab3b8b22SHan Ming Ong   if (log)
344b9c1b51eSKate Stone     log->Printf(
345b9c1b51eSKate Stone         "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64
346b9c1b51eSKate Stone         ") => %" PRIu64,
347b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
348b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
349ab3b8b22SHan Ming Ong 
350ab3b8b22SHan Ming Ong   return bytes_read;
351ab3b8b22SHan Ming Ong }
352ab3b8b22SHan Ming Ong 
353d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options,
354d5d8d91cSRavitheja Addepally                                     lldb::SBError &error) {
355d5d8d91cSRavitheja Addepally   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
356d5d8d91cSRavitheja Addepally   ProcessSP process_sp(GetSP());
357d5d8d91cSRavitheja Addepally   error.Clear();
358d5d8d91cSRavitheja Addepally   SBTrace trace_instance;
359d5d8d91cSRavitheja Addepally   trace_instance.SetSP(process_sp);
360d5d8d91cSRavitheja Addepally   lldb::user_id_t uid = LLDB_INVALID_UID;
361d5d8d91cSRavitheja Addepally 
362d5d8d91cSRavitheja Addepally   if (!process_sp) {
363d5d8d91cSRavitheja Addepally     error.SetErrorString("invalid process");
364d5d8d91cSRavitheja Addepally   } else {
365e714c4f5SRavitheja Addepally     uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref());
366d5d8d91cSRavitheja Addepally     trace_instance.SetTraceUID(uid);
367e714c4f5SRavitheja Addepally     LLDB_LOG(log, "SBProcess::returned uid - {0}", uid);
368d5d8d91cSRavitheja Addepally   }
369d5d8d91cSRavitheja Addepally   return trace_instance;
370d5d8d91cSRavitheja Addepally }
371d5d8d91cSRavitheja Addepally 
372b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
37330fdc8d8SChris Lattner   if (out == NULL)
37430fdc8d8SChris Lattner     return;
37530fdc8d8SChris Lattner 
376acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
377b9c1b51eSKate Stone   if (process_sp) {
37830fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
37930fdc8d8SChris Lattner     char message[1024];
380b9c1b51eSKate Stone     int message_len = ::snprintf(
381b9c1b51eSKate Stone         message, sizeof(message), "Process %" PRIu64 " %s\n",
382b9c1b51eSKate Stone         process_sp->GetID(), SBDebugger::StateAsCString(event_state));
38330fdc8d8SChris Lattner 
38430fdc8d8SChris Lattner     if (message_len > 0)
38530fdc8d8SChris Lattner       ::fwrite(message, 1, message_len, out);
38630fdc8d8SChris Lattner   }
38730fdc8d8SChris Lattner }
38830fdc8d8SChris Lattner 
389b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event,
390b9c1b51eSKate Stone                                        SBCommandReturnObject &result) {
391acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
392b9c1b51eSKate Stone   if (process_sp) {
39330fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
39430fdc8d8SChris Lattner     char message[1024];
395b9c1b51eSKate Stone     ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
396b9c1b51eSKate Stone                process_sp->GetID(), SBDebugger::StateAsCString(event_state));
39730fdc8d8SChris Lattner 
39830fdc8d8SChris Lattner     result.AppendMessage(message);
39930fdc8d8SChris Lattner   }
40030fdc8d8SChris Lattner }
40130fdc8d8SChris Lattner 
402b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) {
403acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
404b9c1b51eSKate Stone   if (process_sp) {
405b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
406b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
407b9c1b51eSKate Stone     return process_sp->GetThreadList().SetSelectedThreadByID(
408b9c1b51eSKate Stone         thread.GetThreadID());
409af67cecdSGreg Clayton   }
41030fdc8d8SChris Lattner   return false;
41130fdc8d8SChris Lattner }
41230fdc8d8SChris Lattner 
413b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
4145160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
415ceb6b139SCaroline Tice 
416ceb6b139SCaroline Tice   bool ret_val = false;
417acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
418b9c1b51eSKate Stone   if (process_sp) {
419b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
420b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
421acdbe816SGreg Clayton     ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
422af67cecdSGreg Clayton   }
423ceb6b139SCaroline Tice 
424ceb6b139SCaroline Tice   if (log)
425b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64
426b9c1b51eSKate Stone                 ") => %s",
427324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
428324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
429ceb6b139SCaroline Tice 
430ceb6b139SCaroline Tice   return ret_val;
43130fdc8d8SChris Lattner }
43230fdc8d8SChris Lattner 
433b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
4345160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
43518b46896SJim Ingham 
43618b46896SJim Ingham   bool ret_val = false;
43718b46896SJim Ingham   ProcessSP process_sp(GetSP());
438b9c1b51eSKate Stone   if (process_sp) {
439b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
440b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
44118b46896SJim Ingham     ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
44218b46896SJim Ingham   }
44318b46896SJim Ingham 
44418b46896SJim Ingham   if (log)
44518b46896SJim Ingham     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
446324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
447324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
44818b46896SJim Ingham 
44918b46896SJim Ingham   return ret_val;
45018b46896SJim Ingham }
45118b46896SJim Ingham 
452b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) {
4535160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
454ceb6b139SCaroline Tice 
45517a6ad05SGreg Clayton   SBThread sb_thread;
45617a6ad05SGreg Clayton   ThreadSP thread_sp;
457acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
458b9c1b51eSKate Stone   if (process_sp) {
4597fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
4607fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
461b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
462b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
4637fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
46417a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
465af67cecdSGreg Clayton   }
466ceb6b139SCaroline Tice 
467ceb6b139SCaroline Tice   if (log)
46893aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
469324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
470324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
471324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
472ceb6b139SCaroline Tice 
47317a6ad05SGreg Clayton   return sb_thread;
47430fdc8d8SChris Lattner }
47530fdc8d8SChris Lattner 
476b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() {
4775e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4785e8dce4dSJason Molenda 
4795e8dce4dSJason Molenda   uint32_t num_queues = 0;
4805e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
481b9c1b51eSKate Stone   if (process_sp) {
4825e8dce4dSJason Molenda     Process::StopLocker stop_locker;
483b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
484b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
485b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
4865e8dce4dSJason Molenda       num_queues = process_sp->GetQueueList().GetSize();
4875e8dce4dSJason Molenda     }
488a61d0a5bSGreg Clayton   }
4895e8dce4dSJason Molenda 
4905e8dce4dSJason Molenda   if (log)
491324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumQueues () => %d",
492324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_queues);
4935e8dce4dSJason Molenda 
4945e8dce4dSJason Molenda   return num_queues;
4955e8dce4dSJason Molenda }
4965e8dce4dSJason Molenda 
497b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) {
4985e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4995e8dce4dSJason Molenda 
5005e8dce4dSJason Molenda   SBQueue sb_queue;
5015e8dce4dSJason Molenda   QueueSP queue_sp;
5025e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
503b9c1b51eSKate Stone   if (process_sp) {
5045e8dce4dSJason Molenda     Process::StopLocker stop_locker;
505b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
506b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
507b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
5085e8dce4dSJason Molenda       queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5095e8dce4dSJason Molenda       sb_queue.SetQueue(queue_sp);
5105e8dce4dSJason Molenda     }
511a61d0a5bSGreg Clayton   }
5125e8dce4dSJason Molenda 
5135e8dce4dSJason Molenda   if (log)
5145e8dce4dSJason Molenda     log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
515324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
516324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
517324a1036SSaleem Abdulrasool                 static_cast<void *>(queue_sp.get()));
5185e8dce4dSJason Molenda 
5195e8dce4dSJason Molenda   return sb_queue;
5205e8dce4dSJason Molenda }
5215e8dce4dSJason Molenda 
522b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) {
523bf2956a2SJim Ingham   ProcessSP process_sp(GetSP());
524b9c1b51eSKate Stone   if (process_sp) {
525b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
526b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
527bf2956a2SJim Ingham     if (include_expression_stops)
528bf2956a2SJim Ingham       return process_sp->GetStopID();
529bf2956a2SJim Ingham     else
530bf2956a2SJim Ingham       return process_sp->GetLastNaturalStopID();
531bf2956a2SJim Ingham   }
532bf2956a2SJim Ingham   return 0;
533bf2956a2SJim Ingham }
534bf2956a2SJim Ingham 
535b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
53638810f43SIlia K   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53738810f43SIlia K 
53838810f43SIlia K   SBEvent sb_event;
53938810f43SIlia K   EventSP event_sp;
54038810f43SIlia K   ProcessSP process_sp(GetSP());
541b9c1b51eSKate Stone   if (process_sp) {
542b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
543b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
54438810f43SIlia K     event_sp = process_sp->GetStopEventForStopID(stop_id);
54538810f43SIlia K     sb_event.reset(event_sp);
54638810f43SIlia K   }
54738810f43SIlia K 
54838810f43SIlia K   if (log)
549b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32
550b9c1b51eSKate Stone                 ") => SBEvent(%p)",
551b9c1b51eSKate Stone                 static_cast<void *>(process_sp.get()), stop_id,
55238810f43SIlia K                 static_cast<void *>(event_sp.get()));
55338810f43SIlia K 
55438810f43SIlia K   return sb_event;
55538810f43SIlia K }
55638810f43SIlia K 
557b9c1b51eSKate Stone StateType SBProcess::GetState() {
558ceb6b139SCaroline Tice 
559ceb6b139SCaroline Tice   StateType ret_val = eStateInvalid;
560acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
561b9c1b51eSKate Stone   if (process_sp) {
562b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
563b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
564acdbe816SGreg Clayton     ret_val = process_sp->GetState();
565af67cecdSGreg Clayton   }
566ceb6b139SCaroline Tice 
5675160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
568ceb6b139SCaroline Tice   if (log)
569cfd1acedSGreg Clayton     log->Printf("SBProcess(%p)::GetState () => %s",
570324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
571750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
572ceb6b139SCaroline Tice 
573ceb6b139SCaroline Tice   return ret_val;
57430fdc8d8SChris Lattner }
57530fdc8d8SChris Lattner 
576b9c1b51eSKate Stone int SBProcess::GetExitStatus() {
5774838131bSGreg Clayton   int exit_status = 0;
578acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
579b9c1b51eSKate Stone   if (process_sp) {
580b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
581b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
582acdbe816SGreg Clayton     exit_status = process_sp->GetExitStatus();
583af67cecdSGreg Clayton   }
5845160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5854838131bSGreg Clayton   if (log)
5864838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
587324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_status,
588324a1036SSaleem Abdulrasool                 exit_status);
5894838131bSGreg Clayton 
5904838131bSGreg Clayton   return exit_status;
59130fdc8d8SChris Lattner }
59230fdc8d8SChris Lattner 
593b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() {
5944838131bSGreg Clayton   const char *exit_desc = NULL;
595acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
596b9c1b51eSKate Stone   if (process_sp) {
597b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
598b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
599acdbe816SGreg Clayton     exit_desc = process_sp->GetExitDescription();
600af67cecdSGreg Clayton   }
6015160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6024838131bSGreg Clayton   if (log)
6034838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitDescription () => %s",
604324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_desc);
6054838131bSGreg Clayton   return exit_desc;
60630fdc8d8SChris Lattner }
60730fdc8d8SChris Lattner 
608b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() {
609ceb6b139SCaroline Tice   lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
610acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
611acdbe816SGreg Clayton   if (process_sp)
612acdbe816SGreg Clayton     ret_val = process_sp->GetID();
613ceb6b139SCaroline Tice 
6145160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
615ceb6b139SCaroline Tice   if (log)
616324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64,
617324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
618ceb6b139SCaroline Tice 
619ceb6b139SCaroline Tice   return ret_val;
62030fdc8d8SChris Lattner }
62130fdc8d8SChris Lattner 
622b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() {
623949e8221SGreg Clayton   uint32_t ret_val = 0;
624949e8221SGreg Clayton   ProcessSP process_sp(GetSP());
625949e8221SGreg Clayton   if (process_sp)
626949e8221SGreg Clayton     ret_val = process_sp->GetUniqueID();
6275160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
628949e8221SGreg Clayton   if (log)
629324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32,
630324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
631949e8221SGreg Clayton   return ret_val;
632949e8221SGreg Clayton }
633949e8221SGreg Clayton 
634b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const {
635cf386e24SJohnny Chen   ByteOrder byteOrder = eByteOrderInvalid;
636acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
637acdbe816SGreg Clayton   if (process_sp)
638acdbe816SGreg Clayton     byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
639cf386e24SJohnny Chen 
6405160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
641cf386e24SJohnny Chen   if (log)
642324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetByteOrder () => %d",
643324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), byteOrder);
644cf386e24SJohnny Chen 
645cf386e24SJohnny Chen   return byteOrder;
646cf386e24SJohnny Chen }
647cf386e24SJohnny Chen 
648b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const {
649ceb6b139SCaroline Tice   uint32_t size = 0;
650acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
651acdbe816SGreg Clayton   if (process_sp)
652acdbe816SGreg Clayton     size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
653ceb6b139SCaroline Tice 
6545160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
655ceb6b139SCaroline Tice   if (log)
656324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetAddressByteSize () => %d",
657324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), size);
658ceb6b139SCaroline Tice 
659ceb6b139SCaroline Tice   return size;
66030fdc8d8SChris Lattner }
66130fdc8d8SChris Lattner 
662b9c1b51eSKate Stone SBError SBProcess::Continue() {
6635160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
664ceb6b139SCaroline Tice 
66530fdc8d8SChris Lattner   SBError sb_error;
666acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
6670c74e78dSGreg Clayton 
668acdbe816SGreg Clayton   if (log)
669324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue ()...",
670324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()));
671acdbe816SGreg Clayton 
672b9c1b51eSKate Stone   if (process_sp) {
673b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
674b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
675acdbe816SGreg Clayton 
676dc6224e0SGreg Clayton     if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
677dc6224e0SGreg Clayton       sb_error.ref() = process_sp->Resume();
678dc6224e0SGreg Clayton     else
679dc6224e0SGreg Clayton       sb_error.ref() = process_sp->ResumeSynchronous(NULL);
680b9c1b51eSKate Stone   } else
68130fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
68230fdc8d8SChris Lattner 
683b9c1b51eSKate Stone   if (log) {
684ceb6b139SCaroline Tice     SBStream sstr;
685ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
686324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s",
687324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
688324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
689ceb6b139SCaroline Tice   }
690ceb6b139SCaroline Tice 
69130fdc8d8SChris Lattner   return sb_error;
69230fdc8d8SChris Lattner }
69330fdc8d8SChris Lattner 
694b9c1b51eSKate Stone SBError SBProcess::Destroy() {
69530fdc8d8SChris Lattner   SBError sb_error;
696acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
697b9c1b51eSKate Stone   if (process_sp) {
698b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
699b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
700ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(false));
701b9c1b51eSKate Stone   } else
70230fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
70330fdc8d8SChris Lattner 
7045160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
705b9c1b51eSKate Stone   if (log) {
7064838131bSGreg Clayton     SBStream sstr;
7074838131bSGreg Clayton     sb_error.GetDescription(sstr);
7086779606aSGreg Clayton     log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s",
709324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
710324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7114838131bSGreg Clayton   }
7124838131bSGreg Clayton 
71330fdc8d8SChris Lattner   return sb_error;
71430fdc8d8SChris Lattner }
71530fdc8d8SChris Lattner 
716b9c1b51eSKate Stone SBError SBProcess::Stop() {
71730fdc8d8SChris Lattner   SBError sb_error;
718acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
719b9c1b51eSKate Stone   if (process_sp) {
720b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
721b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
722acdbe816SGreg Clayton     sb_error.SetError(process_sp->Halt());
723b9c1b51eSKate Stone   } else
72430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
725ceb6b139SCaroline Tice 
7265160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
727b9c1b51eSKate Stone   if (log) {
728ceb6b139SCaroline Tice     SBStream sstr;
729ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
73093aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s",
731324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
732324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
733ceb6b139SCaroline Tice   }
734ceb6b139SCaroline Tice 
73530fdc8d8SChris Lattner   return sb_error;
73630fdc8d8SChris Lattner }
73730fdc8d8SChris Lattner 
738b9c1b51eSKate Stone SBError SBProcess::Kill() {
73930fdc8d8SChris Lattner   SBError sb_error;
740acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
741b9c1b51eSKate Stone   if (process_sp) {
742b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
743b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
744ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(true));
745b9c1b51eSKate Stone   } else
74630fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
747ceb6b139SCaroline Tice 
7485160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
749b9c1b51eSKate Stone   if (log) {
750ceb6b139SCaroline Tice     SBStream sstr;
751ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
75293aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s",
753324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
754324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
755ceb6b139SCaroline Tice   }
756ceb6b139SCaroline Tice 
75730fdc8d8SChris Lattner   return sb_error;
75830fdc8d8SChris Lattner }
75930fdc8d8SChris Lattner 
760b9c1b51eSKate Stone SBError SBProcess::Detach() {
761acff8950SJim Ingham   // FIXME: This should come from a process default.
762acff8950SJim Ingham   bool keep_stopped = false;
763acff8950SJim Ingham   return Detach(keep_stopped);
764acff8950SJim Ingham }
765acff8950SJim Ingham 
766b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) {
76730fdc8d8SChris Lattner   SBError sb_error;
768acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
769b9c1b51eSKate Stone   if (process_sp) {
770b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
771b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
772acff8950SJim Ingham     sb_error.SetError(process_sp->Detach(keep_stopped));
773b9c1b51eSKate Stone   } else
77430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
77530fdc8d8SChris Lattner 
77630fdc8d8SChris Lattner   return sb_error;
77730fdc8d8SChris Lattner }
77830fdc8d8SChris Lattner 
779b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) {
78030fdc8d8SChris Lattner   SBError sb_error;
781acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
782b9c1b51eSKate Stone   if (process_sp) {
783b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
784b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
785acdbe816SGreg Clayton     sb_error.SetError(process_sp->Signal(signo));
786b9c1b51eSKate Stone   } else
78730fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
7885160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
789b9c1b51eSKate Stone   if (log) {
7904838131bSGreg Clayton     SBStream sstr;
7914838131bSGreg Clayton     sb_error.GetDescription(sstr);
7924838131bSGreg Clayton     log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
793324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), signo,
794324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7954838131bSGreg Clayton   }
79630fdc8d8SChris Lattner   return sb_error;
79730fdc8d8SChris Lattner }
79830fdc8d8SChris Lattner 
799b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() {
80098d0a4b3SChaoren Lin   if (auto process_sp = GetSP())
80198d0a4b3SChaoren Lin     return SBUnixSignals{process_sp};
802802dc402STodd Fiala 
80398d0a4b3SChaoren Lin   return {};
804802dc402STodd Fiala }
805802dc402STodd Fiala 
806b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() {
807cfc0935eSJim Ingham   ProcessSP process_sp(GetSP());
808b9c1b51eSKate Stone   if (process_sp) {
809cfc0935eSJim Ingham     process_sp->SendAsyncInterrupt();
810cfc0935eSJim Ingham   }
811cfc0935eSJim Ingham }
812cfc0935eSJim Ingham 
813b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) {
8144838131bSGreg Clayton   SBThread sb_thread;
81517a6ad05SGreg Clayton   ThreadSP thread_sp;
816acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
817b9c1b51eSKate Stone   if (process_sp) {
8187fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
8197fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
820b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
821b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
8227fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
82317a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
824af67cecdSGreg Clayton   }
8254838131bSGreg Clayton 
8265160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
8274838131bSGreg Clayton   if (log)
828b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64
829b9c1b51eSKate Stone                 ") => SBThread (%p)",
830324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
831324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
8324838131bSGreg Clayton 
8334838131bSGreg Clayton   return sb_thread;
83430fdc8d8SChris Lattner }
83530fdc8d8SChris Lattner 
836b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
83718b46896SJim Ingham   SBThread sb_thread;
83818b46896SJim Ingham   ThreadSP thread_sp;
83918b46896SJim Ingham   ProcessSP process_sp(GetSP());
840b9c1b51eSKate Stone   if (process_sp) {
84118b46896SJim Ingham     Process::StopLocker stop_locker;
84218b46896SJim Ingham     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
843b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
844b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
845b9c1b51eSKate Stone     thread_sp =
846b9c1b51eSKate Stone         process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
84718b46896SJim Ingham     sb_thread.SetThread(thread_sp);
84818b46896SJim Ingham   }
84918b46896SJim Ingham 
8505160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
85118b46896SJim Ingham   if (log)
85218b46896SJim Ingham     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
853324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
854324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
85518b46896SJim Ingham 
85618b46896SJim Ingham   return sb_thread;
85718b46896SJim Ingham }
85818b46896SJim Ingham 
859b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
8605160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
861ceb6b139SCaroline Tice 
862ceb6b139SCaroline Tice   StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
863ceb6b139SCaroline Tice 
864ceb6b139SCaroline Tice   if (log)
865324a1036SSaleem Abdulrasool     log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
866324a1036SSaleem Abdulrasool                 static_cast<void *>(event.get()),
867750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
868ceb6b139SCaroline Tice 
869ceb6b139SCaroline Tice   return ret_val;
87030fdc8d8SChris Lattner }
87130fdc8d8SChris Lattner 
872b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
873ea2cc5e0SPavel Labath   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
874ea2cc5e0SPavel Labath 
875ea2cc5e0SPavel Labath   bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
876ea2cc5e0SPavel Labath 
877ea2cc5e0SPavel Labath   if (log)
878400e1809SHans Wennborg     log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
879400e1809SHans Wennborg                 static_cast<void *>(event.get()), ret_val);
880ea2cc5e0SPavel Labath 
881ea2cc5e0SPavel Labath   return ret_val;
88230fdc8d8SChris Lattner }
88330fdc8d8SChris Lattner 
884b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
8850161b49cSJim Ingham   return Process::ProcessEventData::GetNumRestartedReasons(event.get());
8860161b49cSJim Ingham }
8870161b49cSJim Ingham 
8880161b49cSJim Ingham const char *
889b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
890b9c1b51eSKate Stone                                               size_t idx) {
8910161b49cSJim Ingham   return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
8920161b49cSJim Ingham }
8930161b49cSJim Ingham 
894b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
89575930019STodd Fiala   ProcessSP process_sp =
89675930019STodd Fiala       Process::ProcessEventData::GetProcessFromEvent(event.get());
897b9c1b51eSKate Stone   if (!process_sp) {
89805097246SAdrian Prantl     // StructuredData events also know the process they come from. Try that.
89975930019STodd Fiala     process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
90075930019STodd Fiala   }
90175930019STodd Fiala 
90275930019STodd Fiala   return SBProcess(process_sp);
90330fdc8d8SChris Lattner }
90430fdc8d8SChris Lattner 
905b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
90606d2855fSIlia K   return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
90706d2855fSIlia K }
90806d2855fSIlia K 
90975930019STodd Fiala lldb::SBStructuredData
910b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
91175930019STodd Fiala   return SBStructuredData(event.GetSP());
91275930019STodd Fiala }
91375930019STodd Fiala 
914b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
91575930019STodd Fiala   return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
91675930019STodd Fiala          !EventIsStructuredDataEvent(event);
91775930019STodd Fiala }
91875930019STodd Fiala 
919b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
92075930019STodd Fiala   EventSP event_sp = event.GetSP();
92175930019STodd Fiala   EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
922b9c1b51eSKate Stone   return event_data && (event_data->GetFlavor() ==
923b9c1b51eSKate Stone                         EventDataStructuredData::GetFlavorString());
924e6bc6cb9SJim Ingham }
92530fdc8d8SChris Lattner 
926b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const {
9275160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
928ceb6b139SCaroline Tice 
929acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
930acdbe816SGreg Clayton 
931acdbe816SGreg Clayton   SBBroadcaster broadcaster(process_sp.get(), false);
932ceb6b139SCaroline Tice 
933ceb6b139SCaroline Tice   if (log)
934324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
935324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
936324a1036SSaleem Abdulrasool                 static_cast<void *>(broadcaster.get()));
937ceb6b139SCaroline Tice 
93830fdc8d8SChris Lattner   return broadcaster;
93930fdc8d8SChris Lattner }
94030fdc8d8SChris Lattner 
941b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() {
9424bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
9434bddaeb5SJim Ingham }
9444bddaeb5SJim Ingham 
945b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
946b9c1b51eSKate Stone                              SBError &sb_error) {
9475160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
948ceb6b139SCaroline Tice 
94930fdc8d8SChris Lattner   size_t bytes_read = 0;
95030fdc8d8SChris Lattner 
951acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
952acdbe816SGreg Clayton 
9534838131bSGreg Clayton   if (log)
954b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
955b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
956324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
957324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
958324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
9594838131bSGreg Clayton 
960b9c1b51eSKate Stone   if (process_sp) {
9617fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
962b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
963b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
964b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
9657fdf9ef1SGreg Clayton       bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
966b9c1b51eSKate Stone     } else {
967c9858e4dSGreg Clayton       if (log)
968324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::ReadMemory() => error: process is running",
969324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
9707fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
9717fdf9ef1SGreg Clayton     }
972b9c1b51eSKate Stone   } else {
97330fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
97430fdc8d8SChris Lattner   }
97530fdc8d8SChris Lattner 
976b9c1b51eSKate Stone   if (log) {
97793aa84e8SGreg Clayton     SBStream sstr;
97893aa84e8SGreg Clayton     sb_error.GetDescription(sstr);
979b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
980b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
981324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
982324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
983324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
984324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_read));
98593aa84e8SGreg Clayton   }
986ceb6b139SCaroline Tice 
98730fdc8d8SChris Lattner   return bytes_read;
98830fdc8d8SChris Lattner }
98930fdc8d8SChris Lattner 
990b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
991b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
992e91b7957SGreg Clayton   size_t bytes_read = 0;
993acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
994b9c1b51eSKate Stone   if (process_sp) {
9957fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
996b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
997b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
998b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
999b9c1b51eSKate Stone       bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
1000b9c1b51eSKate Stone                                                      sb_error.ref());
1001b9c1b51eSKate Stone     } else {
10025160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1003c9858e4dSGreg Clayton       if (log)
1004b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process "
1005b9c1b51eSKate Stone                     "is running",
1006324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10077fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10087fdf9ef1SGreg Clayton     }
1009b9c1b51eSKate Stone   } else {
1010e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1011e91b7957SGreg Clayton   }
1012e91b7957SGreg Clayton   return bytes_read;
1013e91b7957SGreg Clayton }
1014e91b7957SGreg Clayton 
1015b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
1016b9c1b51eSKate Stone                                            lldb::SBError &sb_error) {
10177fdf9ef1SGreg Clayton   uint64_t value = 0;
1018acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1019b9c1b51eSKate Stone   if (process_sp) {
10207fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1021b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1022b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1023b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1024b9c1b51eSKate Stone       value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
1025b9c1b51eSKate Stone                                                         sb_error.ref());
1026b9c1b51eSKate Stone     } else {
10275160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1028c9858e4dSGreg Clayton       if (log)
1029b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process "
1030b9c1b51eSKate Stone                     "is running",
1031324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10327fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10337fdf9ef1SGreg Clayton     }
1034b9c1b51eSKate Stone   } else {
1035e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1036e91b7957SGreg Clayton   }
10377fdf9ef1SGreg Clayton   return value;
1038e91b7957SGreg Clayton }
1039e91b7957SGreg Clayton 
1040b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
1041b9c1b51eSKate Stone                                               lldb::SBError &sb_error) {
1042e91b7957SGreg Clayton   lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1043acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1044b9c1b51eSKate Stone   if (process_sp) {
10457fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1046b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1047b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1048b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
10497fdf9ef1SGreg Clayton       ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
1050b9c1b51eSKate Stone     } else {
10515160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1052c9858e4dSGreg Clayton       if (log)
1053b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process "
1054b9c1b51eSKate Stone                     "is running",
1055324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10567fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10577fdf9ef1SGreg Clayton     }
1058b9c1b51eSKate Stone   } else {
1059e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1060e91b7957SGreg Clayton   }
1061e91b7957SGreg Clayton   return ptr;
1062e91b7957SGreg Clayton }
1063e91b7957SGreg Clayton 
1064b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
1065b9c1b51eSKate Stone                               SBError &sb_error) {
106630fdc8d8SChris Lattner   size_t bytes_written = 0;
106730fdc8d8SChris Lattner 
10685160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1069acdbe816SGreg Clayton 
1070acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1071acdbe816SGreg Clayton 
10724838131bSGreg Clayton   if (log)
1073b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1074b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1075324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1076b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1077324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
10784838131bSGreg Clayton 
1079b9c1b51eSKate Stone   if (process_sp) {
10807fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1081b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1082b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1083b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1084b9c1b51eSKate Stone       bytes_written =
1085b9c1b51eSKate Stone           process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
1086b9c1b51eSKate Stone     } else {
1087c9858e4dSGreg Clayton       if (log)
1088324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::WriteMemory() => error: process is running",
1089324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10907fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10917fdf9ef1SGreg Clayton     }
109230fdc8d8SChris Lattner   }
109330fdc8d8SChris Lattner 
1094b9c1b51eSKate Stone   if (log) {
10954838131bSGreg Clayton     SBStream sstr;
10964838131bSGreg Clayton     sb_error.GetDescription(sstr);
1097b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1098b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1099324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1100b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1101324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1102324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_written));
11034838131bSGreg Clayton   }
11044838131bSGreg Clayton 
110530fdc8d8SChris Lattner   return bytes_written;
110630fdc8d8SChris Lattner }
110730fdc8d8SChris Lattner 
1108b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) {
1109da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1110da7bc7d0SGreg Clayton 
1111acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1112b9c1b51eSKate Stone   if (process_sp) {
1113dde9cff3SCaroline Tice     char path[PATH_MAX];
1114dde9cff3SCaroline Tice     GetTarget().GetExecutable().GetPath(path, sizeof(path));
1115acdbe816SGreg Clayton     Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
11161d273166SGreg Clayton     const char *exe_name = NULL;
11171d273166SGreg Clayton     if (exe_module)
11181d273166SGreg Clayton       exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
11191d273166SGreg Clayton 
1120d01b2953SDaniel Malea     strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1121b9c1b51eSKate Stone                 process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1122b9c1b51eSKate Stone                 GetNumThreads(), exe_name ? ", executable = " : "",
11231d273166SGreg Clayton                 exe_name ? exe_name : "");
1124b9c1b51eSKate Stone   } else
1125da7bc7d0SGreg Clayton     strm.PutCString("No value");
1126dde9cff3SCaroline Tice 
1127dde9cff3SCaroline Tice   return true;
1128dde9cff3SCaroline Tice }
11298f343b09SGreg Clayton 
11308f343b09SGreg Clayton uint32_t
1131b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
11325160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1133f9ef60d2SJohnny Chen 
1134f9ef60d2SJohnny Chen   uint32_t num = 0;
1135f9ef60d2SJohnny Chen   ProcessSP process_sp(GetSP());
1136b9c1b51eSKate Stone   if (process_sp) {
1137b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1138b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1139f9ef60d2SJohnny Chen     sb_error.SetError(process_sp->GetWatchpointSupportInfo(num));
1140f9ef60d2SJohnny Chen     if (log)
1141f9ef60d2SJohnny Chen       log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1142324a1036SSaleem Abdulrasool                   static_cast<void *>(process_sp.get()), num);
1143b9c1b51eSKate Stone   } else {
1144f9ef60d2SJohnny Chen     sb_error.SetErrorString("SBProcess is invalid");
1145f9ef60d2SJohnny Chen   }
1146f9ef60d2SJohnny Chen   return num;
1147f9ef60d2SJohnny Chen }
1148f9ef60d2SJohnny Chen 
1149b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1150b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
11514fbd67acSTamas Berghammer   return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
11524fbd67acSTamas Berghammer }
11534fbd67acSTamas Berghammer 
1154b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
11554fbd67acSTamas Berghammer                               const lldb::SBFileSpec &sb_remote_image_spec,
1156b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1157abc5d72fSJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1158acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1159b9c1b51eSKate Stone   if (process_sp) {
11607fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1161b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1162abc5d72fSJim Ingham       if (log)
1163abc5d72fSJim Ingham         log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage"
1164abc5d72fSJim Ingham                     "for: %s",
1165abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()),
1166abc5d72fSJim Ingham                     sb_local_image_spec.GetFilename());
1167abc5d72fSJim Ingham 
1168b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1169b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
11703cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1171b9c1b51eSKate Stone       return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1172b9c1b51eSKate Stone                                     *sb_remote_image_spec, sb_error.ref());
1173b9c1b51eSKate Stone     } else {
1174c9858e4dSGreg Clayton       if (log)
1175324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::LoadImage() => error: process is running",
1176324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11777fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11787fdf9ef1SGreg Clayton     }
1179abc5d72fSJim Ingham   } else {
1180abc5d72fSJim Ingham     if (log)
1181abc5d72fSJim Ingham       log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid"
1182abc5d72fSJim Ingham                     " process",
1183abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()));
1184abc5d72fSJim Ingham     sb_error.SetErrorString("process is invalid");
11857fdf9ef1SGreg Clayton   }
11868f343b09SGreg Clayton   return LLDB_INVALID_IMAGE_TOKEN;
11878f343b09SGreg Clayton }
11888f343b09SGreg Clayton 
11890d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec,
11900d231f71SJim Ingham                                         SBStringList &paths,
11910d231f71SJim Ingham                                         lldb::SBFileSpec &loaded_path,
11920d231f71SJim Ingham                                         lldb::SBError &error) {
11930d231f71SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
11940d231f71SJim Ingham   ProcessSP process_sp(GetSP());
11950d231f71SJim Ingham   if (process_sp) {
11960d231f71SJim Ingham     Process::StopLocker stop_locker;
11970d231f71SJim Ingham     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
11980d231f71SJim Ingham       if (log)
11990d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => "
12000d231f71SJim Ingham                     "calling Platform::LoadImageUsingPaths for: %s",
12010d231f71SJim Ingham                     static_cast<void *>(process_sp.get()),
12020d231f71SJim Ingham                     image_spec.GetFilename());
12030d231f71SJim Ingham 
12040d231f71SJim Ingham       std::lock_guard<std::recursive_mutex> guard(
12050d231f71SJim Ingham         process_sp->GetTarget().GetAPIMutex());
12060d231f71SJim Ingham       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
12070d231f71SJim Ingham       size_t num_paths = paths.GetSize();
12080d231f71SJim Ingham       std::vector<std::string> paths_vec;
12090d231f71SJim Ingham       paths_vec.reserve(num_paths);
12100d231f71SJim Ingham       for (size_t i = 0; i < num_paths; i++)
12110d231f71SJim Ingham         paths_vec.push_back(paths.GetStringAtIndex(i));
12120d231f71SJim Ingham       FileSpec loaded_spec;
12130d231f71SJim Ingham 
12140d231f71SJim Ingham       uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(),
12150d231f71SJim Ingham                                                         *image_spec,
12160d231f71SJim Ingham                                                         paths_vec,
12170d231f71SJim Ingham                                                         error.ref(),
12180d231f71SJim Ingham                                                         &loaded_spec);
12190d231f71SJim Ingham        if (token != LLDB_INVALID_IMAGE_TOKEN)
12200d231f71SJim Ingham           loaded_path = loaded_spec;
12210d231f71SJim Ingham        return token;
12220d231f71SJim Ingham     } else {
12230d231f71SJim Ingham       if (log)
12240d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
12250d231f71SJim Ingham                     "process is running",
12260d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
12270d231f71SJim Ingham       error.SetErrorString("process is running");
12280d231f71SJim Ingham     }
12290d231f71SJim Ingham   } else {
12300d231f71SJim Ingham     if (log)
12310d231f71SJim Ingham       log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
12320d231f71SJim Ingham                    "called with invalid process",
12330d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
12340d231f71SJim Ingham     error.SetErrorString("process is invalid");
12350d231f71SJim Ingham   }
12360d231f71SJim Ingham 
12370d231f71SJim Ingham   return LLDB_INVALID_IMAGE_TOKEN;
12380d231f71SJim Ingham }
12390d231f71SJim Ingham 
1240b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
12418f343b09SGreg Clayton   lldb::SBError sb_error;
1242acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1243b9c1b51eSKate Stone   if (process_sp) {
12447fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1245b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1246b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1247b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
12483cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1249b9c1b51eSKate Stone       sb_error.SetError(
1250b9c1b51eSKate Stone           platform_sp->UnloadImage(process_sp.get(), image_token));
1251b9c1b51eSKate Stone     } else {
12525160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1253c9858e4dSGreg Clayton       if (log)
1254324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::UnloadImage() => error: process is running",
1255324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12567fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
12577fdf9ef1SGreg Clayton     }
1258b9c1b51eSKate Stone   } else
12598f343b09SGreg Clayton     sb_error.SetErrorString("invalid process");
12608f343b09SGreg Clayton   return sb_error;
12618f343b09SGreg Clayton }
12628c71337aSJason Molenda 
1263b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) {
1264a332978bSJason Molenda   lldb::SBError sb_error;
1265a332978bSJason Molenda   ProcessSP process_sp(GetSP());
1266b9c1b51eSKate Stone   if (process_sp) {
1267a332978bSJason Molenda     Process::StopLocker stop_locker;
1268b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1269b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1270b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1271a332978bSJason Molenda       sb_error.SetError(process_sp->SendEventData(event_data));
1272b9c1b51eSKate Stone     } else {
1273a332978bSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1274a332978bSJason Molenda       if (log)
1275b9c1b51eSKate Stone         log->Printf(
1276b9c1b51eSKate Stone             "SBProcess(%p)::SendEventData() => error: process is running",
1277324a1036SSaleem Abdulrasool             static_cast<void *>(process_sp.get()));
1278a332978bSJason Molenda       sb_error.SetErrorString("process is running");
1279a332978bSJason Molenda     }
1280b9c1b51eSKate Stone   } else
1281a332978bSJason Molenda     sb_error.SetErrorString("invalid process");
1282a332978bSJason Molenda   return sb_error;
1283a332978bSJason Molenda }
1284a332978bSJason Molenda 
1285b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
12868c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1287b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12888c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
128995d005c7SJason Molenda     return runtime->GetExtendedBacktraceTypes().size();
12908c71337aSJason Molenda   }
12918c71337aSJason Molenda   return 0;
12928c71337aSJason Molenda }
12938c71337aSJason Molenda 
1294b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
12958c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1296b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12978c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
1298b9c1b51eSKate Stone     const std::vector<ConstString> &names =
1299b9c1b51eSKate Stone         runtime->GetExtendedBacktraceTypes();
1300b9c1b51eSKate Stone     if (idx < names.size()) {
13018c71337aSJason Molenda       return names[idx].AsCString();
1302b9c1b51eSKate Stone     } else {
13038c71337aSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
13048c71337aSJason Molenda       if (log)
1305b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => "
1306b9c1b51eSKate Stone                     "error: requested extended backtrace name out of bounds",
1307324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
13088c71337aSJason Molenda     }
13098c71337aSJason Molenda   }
13108c71337aSJason Molenda   return NULL;
13118c71337aSJason Molenda }
1312a51ea382SKuba Brecka 
1313b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1314a51ea382SKuba Brecka   ProcessSP process_sp(GetSP());
1315a51ea382SKuba Brecka   SBThreadCollection threads;
1316b9c1b51eSKate Stone   if (process_sp) {
1317a51ea382SKuba Brecka     threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1318a51ea382SKuba Brecka   }
1319a51ea382SKuba Brecka   return threads;
1320a51ea382SKuba Brecka }
132163927548SKuba Brecka 
1322b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent(
1323b9c1b51eSKate Stone     InstrumentationRuntimeType type) {
132463927548SKuba Brecka   ProcessSP process_sp(GetSP());
132563927548SKuba Brecka   if (!process_sp)
132663927548SKuba Brecka     return false;
132763927548SKuba Brecka 
1328b9c1b51eSKate Stone   InstrumentationRuntimeSP runtime_sp =
1329b9c1b51eSKate Stone       process_sp->GetInstrumentationRuntime(type);
133063927548SKuba Brecka 
133163927548SKuba Brecka   if (!runtime_sp.get())
133263927548SKuba Brecka     return false;
133363927548SKuba Brecka 
133463927548SKuba Brecka   return runtime_sp->IsActive();
133563927548SKuba Brecka }
1336f7d1893fSAdrian McCarthy 
1337b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) {
1338f7d1893fSAdrian McCarthy   lldb::SBError error;
1339f7d1893fSAdrian McCarthy   ProcessSP process_sp(GetSP());
1340b9c1b51eSKate Stone   if (!process_sp) {
1341f7d1893fSAdrian McCarthy     error.SetErrorString("SBProcess is invalid");
1342f7d1893fSAdrian McCarthy     return error;
1343f7d1893fSAdrian McCarthy   }
1344f7d1893fSAdrian McCarthy 
1345b9c1b51eSKate Stone   std::lock_guard<std::recursive_mutex> guard(
1346b9c1b51eSKate Stone       process_sp->GetTarget().GetAPIMutex());
1347f7d1893fSAdrian McCarthy 
1348b9c1b51eSKate Stone   if (process_sp->GetState() != eStateStopped) {
1349f7d1893fSAdrian McCarthy     error.SetErrorString("the process is not stopped");
1350f7d1893fSAdrian McCarthy     return error;
1351f7d1893fSAdrian McCarthy   }
1352f7d1893fSAdrian McCarthy 
1353*8f3be7a3SJonas Devlieghere   FileSpec core_file(file_name);
1354f7d1893fSAdrian McCarthy   error.ref() = PluginManager::SaveCore(process_sp, core_file);
1355f7d1893fSAdrian McCarthy   return error;
1356f7d1893fSAdrian McCarthy }
135726036843SHoward Hellyer 
135826036843SHoward Hellyer lldb::SBError
1359b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1360b9c1b51eSKate Stone                                SBMemoryRegionInfo &sb_region_info) {
136126036843SHoward Hellyer   lldb::SBError sb_error;
136226036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1363b9c1b51eSKate Stone   MemoryRegionInfoSP region_info_sp =
1364b9c1b51eSKate Stone       std::make_shared<lldb_private::MemoryRegionInfo>();
1365b9c1b51eSKate Stone   if (process_sp) {
136626036843SHoward Hellyer     Process::StopLocker stop_locker;
1367b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1368b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1369b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1370b9c1b51eSKate Stone       sb_error.ref() =
1371b9c1b51eSKate Stone           process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp);
137226036843SHoward Hellyer       if (sb_error.Success()) {
137326036843SHoward Hellyer         sb_region_info.ref() = *region_info_sp;
137426036843SHoward Hellyer       }
1375b9c1b51eSKate Stone     } else {
137626036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
137726036843SHoward Hellyer       if (log)
1378b9c1b51eSKate Stone         log->Printf(
1379b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
138026036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
138126036843SHoward Hellyer       sb_error.SetErrorString("process is running");
138226036843SHoward Hellyer     }
1383b9c1b51eSKate Stone   } else {
138426036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
138526036843SHoward Hellyer   }
138626036843SHoward Hellyer   return sb_error;
138726036843SHoward Hellyer }
138826036843SHoward Hellyer 
1389b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
139026036843SHoward Hellyer   lldb::SBError sb_error;
139126036843SHoward Hellyer   lldb::SBMemoryRegionInfoList sb_region_list;
139226036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1393b9c1b51eSKate Stone   if (process_sp) {
139426036843SHoward Hellyer     Process::StopLocker stop_locker;
1395b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1396b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1397b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
139826036843SHoward Hellyer       std::vector<MemoryRegionInfoSP> region_list;
139926036843SHoward Hellyer       sb_error.ref() = process_sp->GetMemoryRegions(region_list);
140026036843SHoward Hellyer       if (sb_error.Success()) {
140126036843SHoward Hellyer         std::vector<MemoryRegionInfoSP>::iterator end = region_list.end();
1402b9c1b51eSKate Stone         for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin();
1403b9c1b51eSKate Stone              it != end; it++) {
140426036843SHoward Hellyer           SBMemoryRegionInfo sb_region_info(it->get());
140526036843SHoward Hellyer           sb_region_list.Append(sb_region_info);
140626036843SHoward Hellyer         }
140726036843SHoward Hellyer       }
1408b9c1b51eSKate Stone     } else {
140926036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
141026036843SHoward Hellyer       if (log)
1411b9c1b51eSKate Stone         log->Printf(
1412b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
141326036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
141426036843SHoward Hellyer       sb_error.SetErrorString("process is running");
141526036843SHoward Hellyer     }
1416b9c1b51eSKate Stone   } else {
141726036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
141826036843SHoward Hellyer   }
141926036843SHoward Hellyer   return sb_region_list;
142026036843SHoward Hellyer }
1421141a6263SVadim Macagon 
1422141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() {
1423141a6263SVadim Macagon   lldb::SBProcessInfo sb_proc_info;
1424141a6263SVadim Macagon   ProcessSP process_sp(GetSP());
1425141a6263SVadim Macagon   ProcessInstanceInfo proc_info;
1426141a6263SVadim Macagon   if (process_sp && process_sp->GetProcessInfo(proc_info)) {
1427141a6263SVadim Macagon     sb_proc_info.SetProcessInfo(proc_info);
1428141a6263SVadim Macagon   }
1429141a6263SVadim Macagon   return sb_proc_info;
1430141a6263SVadim Macagon }
1431