130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
94c5de699SEli Friedman #include "lldb/API/SBProcess.h"
1030fdc8d8SChris Lattner 
11bdae3787SVirgile Bello #include <inttypes.h>
12bdae3787SVirgile Bello 
1330fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1430fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1530fdc8d8SChris Lattner 
165d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
171f746071SGreg Clayton #include "lldb/Core/Module.h"
18f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h"
1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2026036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h"
2130fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
238c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
246611103cSGreg Clayton #include "lldb/Target/Target.h"
256611103cSGreg Clayton #include "lldb/Target/Thread.h"
26145d95c9SPavel Labath #include "lldb/Utility/Args.h"
276f9e6901SZachary Turner #include "lldb/Utility/Log.h"
28d821c997SPavel Labath #include "lldb/Utility/State.h"
29bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner 
324c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
334c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
340e615684SGreg Clayton #include "lldb/API/SBDebugger.h"
354c5de699SEli Friedman #include "lldb/API/SBEvent.h"
360e615684SGreg Clayton #include "lldb/API/SBFileSpec.h"
3726036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h"
3826036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h"
39b9c1b51eSKate Stone #include "lldb/API/SBStream.h"
40b9c1b51eSKate Stone #include "lldb/API/SBStringList.h"
4175930019STodd Fiala #include "lldb/API/SBStructuredData.h"
424c5de699SEli Friedman #include "lldb/API/SBThread.h"
43a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h"
44d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h"
45d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h"
46802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h"
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner using namespace lldb;
4930fdc8d8SChris Lattner using namespace lldb_private;
5030fdc8d8SChris Lattner 
51b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {}
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner //----------------------------------------------------------------------
5430fdc8d8SChris Lattner // SBProcess constructor
5530fdc8d8SChris Lattner //----------------------------------------------------------------------
5630fdc8d8SChris Lattner 
57b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {}
5830fdc8d8SChris Lattner 
59b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp)
60b9c1b51eSKate Stone     : m_opaque_wp(process_sp) {}
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) {
63efabb123SGreg Clayton   if (this != &rhs)
644e0fe8abSGreg Clayton     m_opaque_wp = rhs.m_opaque_wp;
65efabb123SGreg Clayton   return *this;
66efabb123SGreg Clayton }
67efabb123SGreg Clayton 
6830fdc8d8SChris Lattner //----------------------------------------------------------------------
6930fdc8d8SChris Lattner // Destructor
7030fdc8d8SChris Lattner //----------------------------------------------------------------------
71b9c1b51eSKate Stone SBProcess::~SBProcess() {}
7230fdc8d8SChris Lattner 
73b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() {
744bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
754bddaeb5SJim Ingham }
764bddaeb5SJim Ingham 
77b9c1b51eSKate Stone const char *SBProcess::GetPluginName() {
78d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
79b9c1b51eSKate Stone   if (process_sp) {
8057abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
81d7b30ef9SJim Ingham   }
82d7b30ef9SJim Ingham   return "<Unknown>";
83d7b30ef9SJim Ingham }
84d7b30ef9SJim Ingham 
85b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() {
86d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
87b9c1b51eSKate Stone   if (process_sp) {
8857abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
89d7b30ef9SJim Ingham   }
90d7b30ef9SJim Ingham   return "<Unknown>";
91d7b30ef9SJim Ingham }
92d7b30ef9SJim Ingham 
93b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); }
94d7b30ef9SJim Ingham 
95b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; }
96b9556accSGreg Clayton 
97b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); }
9830fdc8d8SChris Lattner 
99b9c1b51eSKate Stone bool SBProcess::IsValid() const {
1004fc6cb9cSJim Ingham   ProcessSP process_sp(m_opaque_wp.lock());
1014fc6cb9cSJim Ingham   return ((bool)process_sp && process_sp->IsValid());
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
104b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp,
105b9c1b51eSKate Stone                              const char *stdin_path, const char *stdout_path,
1069631aae2SJames McIlree                              const char *stderr_path,
1079631aae2SJames McIlree                              const char *working_directory,
108b9c1b51eSKate Stone                              uint32_t launch_flags, bool stop_at_entry,
109b9c1b51eSKate Stone                              lldb::SBError &error) {
1105160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
111324a1036SSaleem Abdulrasool   if (log)
112b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, "
113b9c1b51eSKate Stone                 "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, "
114b9c1b51eSKate Stone                 "stop_at_entry=%i, &error (%p))...",
115324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_wp.lock().get()),
116324a1036SSaleem Abdulrasool                 static_cast<void *>(argv), static_cast<void *>(envp),
1179631aae2SJames McIlree                 stdin_path ? stdin_path : "NULL",
1189631aae2SJames McIlree                 stdout_path ? stdout_path : "NULL",
1199631aae2SJames McIlree                 stderr_path ? stderr_path : "NULL",
120b9c1b51eSKate Stone                 working_directory ? working_directory : "NULL", launch_flags,
121b9c1b51eSKate Stone                 stop_at_entry, static_cast<void *>(error.get()));
1229631aae2SJames McIlree 
123acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
124b9c1b51eSKate Stone   if (process_sp) {
125b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
126b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
127b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
128982c9762SGreg Clayton       if (stop_at_entry)
129982c9762SGreg Clayton         launch_flags |= eLaunchFlagStopAtEntry;
1308f3be7a3SJonas Devlieghere       ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path),
1318f3be7a3SJonas Devlieghere                                     FileSpec(stderr_path),
1328f3be7a3SJonas Devlieghere                                     FileSpec(working_directory), launch_flags);
133acdbe816SGreg Clayton       Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
134982c9762SGreg Clayton       if (exe_module)
13514715c68SGreg Clayton         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
136982c9762SGreg Clayton       if (argv)
137982c9762SGreg Clayton         launch_info.GetArguments().AppendArguments(argv);
138982c9762SGreg Clayton       if (envp)
13962930e57SPavel Labath         launch_info.GetEnvironment() = Environment(envp);
140acdbe816SGreg Clayton       error.SetError(process_sp->Launch(launch_info));
141b9c1b51eSKate Stone     } else {
1429631aae2SJames McIlree       error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
1439631aae2SJames McIlree     }
144b9c1b51eSKate Stone   } else {
1459631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1469631aae2SJames McIlree   }
1479631aae2SJames McIlree 
1489631aae2SJames McIlree   if (log) {
1499631aae2SJames McIlree     SBStream sstr;
1509631aae2SJames McIlree     error.GetDescription(sstr);
151324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
152324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
153324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1549631aae2SJames McIlree   }
1559631aae2SJames McIlree 
1569631aae2SJames McIlree   return error.Success();
1579631aae2SJames McIlree }
1589631aae2SJames McIlree 
159b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
160b9c1b51eSKate Stone                                             lldb::SBError &error) {
161acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
162b9c1b51eSKate Stone   if (process_sp) {
163b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
164b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
165b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
166144f3a9cSGreg Clayton       ProcessAttachInfo attach_info;
167144f3a9cSGreg Clayton       attach_info.SetProcessID(pid);
168acdbe816SGreg Clayton       error.SetError(process_sp->Attach(attach_info));
169b9c1b51eSKate Stone     } else {
170b9c1b51eSKate Stone       error.SetErrorString(
171b9c1b51eSKate Stone           "must be in eStateConnected to call RemoteAttachToProcessWithID");
1729631aae2SJames McIlree     }
173b9c1b51eSKate Stone   } else {
1749631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1759631aae2SJames McIlree   }
1769631aae2SJames McIlree 
1775160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1789631aae2SJames McIlree   if (log) {
1799631aae2SJames McIlree     SBStream sstr;
1809631aae2SJames McIlree     error.GetDescription(sstr);
181b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64
182b9c1b51eSKate Stone                 ") => SBError (%p): %s",
183324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), pid,
184324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1859631aae2SJames McIlree   }
1869631aae2SJames McIlree 
1879631aae2SJames McIlree   return error.Success();
1889631aae2SJames McIlree }
1899631aae2SJames McIlree 
190b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() {
1915160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
192ceb6b139SCaroline Tice 
193ceb6b139SCaroline Tice   uint32_t num_threads = 0;
194acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
195b9c1b51eSKate Stone   if (process_sp) {
1967fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1977fdf9ef1SGreg Clayton 
1987fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
199b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
200b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
201acdbe816SGreg Clayton     num_threads = process_sp->GetThreadList().GetSize(can_update);
20230fdc8d8SChris Lattner   }
203ceb6b139SCaroline Tice 
204ceb6b139SCaroline Tice   if (log)
205324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumThreads () => %d",
206324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_threads);
207ceb6b139SCaroline Tice 
208ceb6b139SCaroline Tice   return num_threads;
20930fdc8d8SChris Lattner }
21030fdc8d8SChris Lattner 
211b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const {
2125160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
213ceb6b139SCaroline Tice 
21430fdc8d8SChris Lattner   SBThread sb_thread;
21517a6ad05SGreg Clayton   ThreadSP thread_sp;
216acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
217b9c1b51eSKate Stone   if (process_sp) {
218b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
219b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
220acdbe816SGreg Clayton     thread_sp = process_sp->GetThreadList().GetSelectedThread();
22117a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
222af67cecdSGreg Clayton   }
223ceb6b139SCaroline Tice 
224ceb6b139SCaroline Tice   if (log)
225324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
226324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
227324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
228ceb6b139SCaroline Tice 
22930fdc8d8SChris Lattner   return sb_thread;
23030fdc8d8SChris Lattner }
23130fdc8d8SChris Lattner 
232b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
233b9c1b51eSKate Stone                                          lldb::addr_t context) {
2345160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
235a4d8747dSGreg Clayton 
236a4d8747dSGreg Clayton   SBThread sb_thread;
237a4d8747dSGreg Clayton   ThreadSP thread_sp;
238a4d8747dSGreg Clayton   ProcessSP process_sp(GetSP());
239b9c1b51eSKate Stone   if (process_sp) {
240b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
241b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
242a4d8747dSGreg Clayton     thread_sp = process_sp->CreateOSPluginThread(tid, context);
243a4d8747dSGreg Clayton     sb_thread.SetThread(thread_sp);
244a4d8747dSGreg Clayton   }
245a4d8747dSGreg Clayton 
246a4d8747dSGreg Clayton   if (log)
247b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64
248b9c1b51eSKate Stone                 ", context=0x%" PRIx64 ") => SBThread(%p)",
249324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid, context,
250324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
251a4d8747dSGreg Clayton 
252a4d8747dSGreg Clayton   return sb_thread;
253a4d8747dSGreg Clayton }
254a4d8747dSGreg Clayton 
255b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const {
2565160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
257ceb6b139SCaroline Tice 
25830fdc8d8SChris Lattner   SBTarget sb_target;
259b9556accSGreg Clayton   TargetSP target_sp;
260acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
261b9c1b51eSKate Stone   if (process_sp) {
262acdbe816SGreg Clayton     target_sp = process_sp->GetTarget().shared_from_this();
263b9556accSGreg Clayton     sb_target.SetSP(target_sp);
264b9556accSGreg Clayton   }
265ceb6b139SCaroline Tice 
266ceb6b139SCaroline Tice   if (log)
267324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)",
268324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
269324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
270ceb6b139SCaroline Tice 
27130fdc8d8SChris Lattner   return sb_target;
27230fdc8d8SChris Lattner }
27330fdc8d8SChris Lattner 
274b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
2755160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
276ceb6b139SCaroline Tice 
277ceb6b139SCaroline Tice   size_t ret_val = 0;
278acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
279b9c1b51eSKate Stone   if (process_sp) {
28097206d57SZachary Turner     Status error;
281acdbe816SGreg Clayton     ret_val = process_sp->PutSTDIN(src, src_len, error);
28230fdc8d8SChris Lattner   }
283ceb6b139SCaroline Tice 
284ceb6b139SCaroline Tice   if (log)
285b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64
286b9c1b51eSKate Stone                 ") => %" PRIu64,
287324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), src,
288b9c1b51eSKate Stone                 static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val));
289ceb6b139SCaroline Tice 
290ceb6b139SCaroline Tice   return ret_val;
29130fdc8d8SChris Lattner }
29230fdc8d8SChris Lattner 
293b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
294cfd1acedSGreg Clayton   size_t bytes_read = 0;
295acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
296b9c1b51eSKate Stone   if (process_sp) {
29797206d57SZachary Turner     Status error;
298acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
29930fdc8d8SChris Lattner   }
300ceb6b139SCaroline Tice 
3015160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
302ceb6b139SCaroline Tice   if (log)
303b9c1b51eSKate Stone     log->Printf(
304b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64
305b9c1b51eSKate Stone         ") => %" PRIu64,
306b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
307b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
308ceb6b139SCaroline Tice 
309cfd1acedSGreg Clayton   return bytes_read;
31030fdc8d8SChris Lattner }
31130fdc8d8SChris Lattner 
312b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
313cfd1acedSGreg Clayton   size_t bytes_read = 0;
314acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
315b9c1b51eSKate Stone   if (process_sp) {
31697206d57SZachary Turner     Status error;
317acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
31830fdc8d8SChris Lattner   }
319ceb6b139SCaroline Tice 
3205160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
321ceb6b139SCaroline Tice   if (log)
322b9c1b51eSKate Stone     log->Printf(
323b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64
324b9c1b51eSKate Stone         ") => %" PRIu64,
325b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
326b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
327ceb6b139SCaroline Tice 
328cfd1acedSGreg Clayton   return bytes_read;
32930fdc8d8SChris Lattner }
33030fdc8d8SChris Lattner 
331b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
332ab3b8b22SHan Ming Ong   size_t bytes_read = 0;
333ab3b8b22SHan Ming Ong   ProcessSP process_sp(GetSP());
334b9c1b51eSKate Stone   if (process_sp) {
33597206d57SZachary Turner     Status error;
336ab3b8b22SHan Ming Ong     bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
337ab3b8b22SHan Ming Ong   }
338ab3b8b22SHan Ming Ong 
3395160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
340ab3b8b22SHan Ming Ong   if (log)
341b9c1b51eSKate Stone     log->Printf(
342b9c1b51eSKate Stone         "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64
343b9c1b51eSKate Stone         ") => %" PRIu64,
344b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
345b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
346ab3b8b22SHan Ming Ong 
347ab3b8b22SHan Ming Ong   return bytes_read;
348ab3b8b22SHan Ming Ong }
349ab3b8b22SHan Ming Ong 
350d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options,
351d5d8d91cSRavitheja Addepally                                     lldb::SBError &error) {
352d5d8d91cSRavitheja Addepally   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
353d5d8d91cSRavitheja Addepally   ProcessSP process_sp(GetSP());
354d5d8d91cSRavitheja Addepally   error.Clear();
355d5d8d91cSRavitheja Addepally   SBTrace trace_instance;
356d5d8d91cSRavitheja Addepally   trace_instance.SetSP(process_sp);
357d5d8d91cSRavitheja Addepally   lldb::user_id_t uid = LLDB_INVALID_UID;
358d5d8d91cSRavitheja Addepally 
359d5d8d91cSRavitheja Addepally   if (!process_sp) {
360d5d8d91cSRavitheja Addepally     error.SetErrorString("invalid process");
361d5d8d91cSRavitheja Addepally   } else {
362e714c4f5SRavitheja Addepally     uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref());
363d5d8d91cSRavitheja Addepally     trace_instance.SetTraceUID(uid);
364e714c4f5SRavitheja Addepally     LLDB_LOG(log, "SBProcess::returned uid - {0}", uid);
365d5d8d91cSRavitheja Addepally   }
366d5d8d91cSRavitheja Addepally   return trace_instance;
367d5d8d91cSRavitheja Addepally }
368d5d8d91cSRavitheja Addepally 
369b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
37030fdc8d8SChris Lattner   if (out == NULL)
37130fdc8d8SChris Lattner     return;
37230fdc8d8SChris Lattner 
373acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
374b9c1b51eSKate Stone   if (process_sp) {
37530fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
37630fdc8d8SChris Lattner     char message[1024];
377b9c1b51eSKate Stone     int message_len = ::snprintf(
378b9c1b51eSKate Stone         message, sizeof(message), "Process %" PRIu64 " %s\n",
379b9c1b51eSKate Stone         process_sp->GetID(), SBDebugger::StateAsCString(event_state));
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner     if (message_len > 0)
38230fdc8d8SChris Lattner       ::fwrite(message, 1, message_len, out);
38330fdc8d8SChris Lattner   }
38430fdc8d8SChris Lattner }
38530fdc8d8SChris Lattner 
386b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event,
387b9c1b51eSKate Stone                                        SBCommandReturnObject &result) {
388acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
389b9c1b51eSKate Stone   if (process_sp) {
39030fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
39130fdc8d8SChris Lattner     char message[1024];
392b9c1b51eSKate Stone     ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
393b9c1b51eSKate Stone                process_sp->GetID(), SBDebugger::StateAsCString(event_state));
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner     result.AppendMessage(message);
39630fdc8d8SChris Lattner   }
39730fdc8d8SChris Lattner }
39830fdc8d8SChris Lattner 
399b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) {
400acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
401b9c1b51eSKate Stone   if (process_sp) {
402b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
403b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
404b9c1b51eSKate Stone     return process_sp->GetThreadList().SetSelectedThreadByID(
405b9c1b51eSKate Stone         thread.GetThreadID());
406af67cecdSGreg Clayton   }
40730fdc8d8SChris Lattner   return false;
40830fdc8d8SChris Lattner }
40930fdc8d8SChris Lattner 
410b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
4115160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
412ceb6b139SCaroline Tice 
413ceb6b139SCaroline Tice   bool ret_val = false;
414acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
415b9c1b51eSKate Stone   if (process_sp) {
416b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
417b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
418acdbe816SGreg Clayton     ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
419af67cecdSGreg Clayton   }
420ceb6b139SCaroline Tice 
421ceb6b139SCaroline Tice   if (log)
422b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64
423b9c1b51eSKate Stone                 ") => %s",
424324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
425324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
426ceb6b139SCaroline Tice 
427ceb6b139SCaroline Tice   return ret_val;
42830fdc8d8SChris Lattner }
42930fdc8d8SChris Lattner 
430b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
4315160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
43218b46896SJim Ingham 
43318b46896SJim Ingham   bool ret_val = false;
43418b46896SJim Ingham   ProcessSP process_sp(GetSP());
435b9c1b51eSKate Stone   if (process_sp) {
436b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
437b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
43818b46896SJim Ingham     ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
43918b46896SJim Ingham   }
44018b46896SJim Ingham 
44118b46896SJim Ingham   if (log)
44218b46896SJim Ingham     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
443324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
444324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
44518b46896SJim Ingham 
44618b46896SJim Ingham   return ret_val;
44718b46896SJim Ingham }
44818b46896SJim Ingham 
449b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) {
4505160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
451ceb6b139SCaroline Tice 
45217a6ad05SGreg Clayton   SBThread sb_thread;
45317a6ad05SGreg Clayton   ThreadSP thread_sp;
454acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
455b9c1b51eSKate Stone   if (process_sp) {
4567fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
4577fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
458b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
459b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
4607fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
46117a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
462af67cecdSGreg Clayton   }
463ceb6b139SCaroline Tice 
464ceb6b139SCaroline Tice   if (log)
46593aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
466324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
467324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
468324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
469ceb6b139SCaroline Tice 
47017a6ad05SGreg Clayton   return sb_thread;
47130fdc8d8SChris Lattner }
47230fdc8d8SChris Lattner 
473b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() {
4745e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4755e8dce4dSJason Molenda 
4765e8dce4dSJason Molenda   uint32_t num_queues = 0;
4775e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
478b9c1b51eSKate Stone   if (process_sp) {
4795e8dce4dSJason Molenda     Process::StopLocker stop_locker;
480b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
481b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
482b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
4835e8dce4dSJason Molenda       num_queues = process_sp->GetQueueList().GetSize();
4845e8dce4dSJason Molenda     }
485a61d0a5bSGreg Clayton   }
4865e8dce4dSJason Molenda 
4875e8dce4dSJason Molenda   if (log)
488324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumQueues () => %d",
489324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_queues);
4905e8dce4dSJason Molenda 
4915e8dce4dSJason Molenda   return num_queues;
4925e8dce4dSJason Molenda }
4935e8dce4dSJason Molenda 
494b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) {
4955e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4965e8dce4dSJason Molenda 
4975e8dce4dSJason Molenda   SBQueue sb_queue;
4985e8dce4dSJason Molenda   QueueSP queue_sp;
4995e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
500b9c1b51eSKate Stone   if (process_sp) {
5015e8dce4dSJason Molenda     Process::StopLocker stop_locker;
502b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
503b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
504b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
5055e8dce4dSJason Molenda       queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5065e8dce4dSJason Molenda       sb_queue.SetQueue(queue_sp);
5075e8dce4dSJason Molenda     }
508a61d0a5bSGreg Clayton   }
5095e8dce4dSJason Molenda 
5105e8dce4dSJason Molenda   if (log)
5115e8dce4dSJason Molenda     log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
512324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
513324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
514324a1036SSaleem Abdulrasool                 static_cast<void *>(queue_sp.get()));
5155e8dce4dSJason Molenda 
5165e8dce4dSJason Molenda   return sb_queue;
5175e8dce4dSJason Molenda }
5185e8dce4dSJason Molenda 
519b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) {
520bf2956a2SJim Ingham   ProcessSP process_sp(GetSP());
521b9c1b51eSKate Stone   if (process_sp) {
522b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
523b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
524bf2956a2SJim Ingham     if (include_expression_stops)
525bf2956a2SJim Ingham       return process_sp->GetStopID();
526bf2956a2SJim Ingham     else
527bf2956a2SJim Ingham       return process_sp->GetLastNaturalStopID();
528bf2956a2SJim Ingham   }
529bf2956a2SJim Ingham   return 0;
530bf2956a2SJim Ingham }
531bf2956a2SJim Ingham 
532b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
53338810f43SIlia K   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53438810f43SIlia K 
53538810f43SIlia K   SBEvent sb_event;
53638810f43SIlia K   EventSP event_sp;
53738810f43SIlia K   ProcessSP process_sp(GetSP());
538b9c1b51eSKate Stone   if (process_sp) {
539b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
540b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
54138810f43SIlia K     event_sp = process_sp->GetStopEventForStopID(stop_id);
54238810f43SIlia K     sb_event.reset(event_sp);
54338810f43SIlia K   }
54438810f43SIlia K 
54538810f43SIlia K   if (log)
546b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32
547b9c1b51eSKate Stone                 ") => SBEvent(%p)",
548b9c1b51eSKate Stone                 static_cast<void *>(process_sp.get()), stop_id,
54938810f43SIlia K                 static_cast<void *>(event_sp.get()));
55038810f43SIlia K 
55138810f43SIlia K   return sb_event;
55238810f43SIlia K }
55338810f43SIlia K 
554b9c1b51eSKate Stone StateType SBProcess::GetState() {
555ceb6b139SCaroline Tice 
556ceb6b139SCaroline Tice   StateType ret_val = eStateInvalid;
557acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
558b9c1b51eSKate Stone   if (process_sp) {
559b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
560b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
561acdbe816SGreg Clayton     ret_val = process_sp->GetState();
562af67cecdSGreg Clayton   }
563ceb6b139SCaroline Tice 
5645160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
565ceb6b139SCaroline Tice   if (log)
566cfd1acedSGreg Clayton     log->Printf("SBProcess(%p)::GetState () => %s",
567324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
568750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
569ceb6b139SCaroline Tice 
570ceb6b139SCaroline Tice   return ret_val;
57130fdc8d8SChris Lattner }
57230fdc8d8SChris Lattner 
573b9c1b51eSKate Stone int SBProcess::GetExitStatus() {
5744838131bSGreg Clayton   int exit_status = 0;
575acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
576b9c1b51eSKate Stone   if (process_sp) {
577b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
578b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
579acdbe816SGreg Clayton     exit_status = process_sp->GetExitStatus();
580af67cecdSGreg Clayton   }
5815160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5824838131bSGreg Clayton   if (log)
5834838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
584324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_status,
585324a1036SSaleem Abdulrasool                 exit_status);
5864838131bSGreg Clayton 
5874838131bSGreg Clayton   return exit_status;
58830fdc8d8SChris Lattner }
58930fdc8d8SChris Lattner 
590b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() {
5914838131bSGreg Clayton   const char *exit_desc = NULL;
592acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
593b9c1b51eSKate Stone   if (process_sp) {
594b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
595b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
596acdbe816SGreg Clayton     exit_desc = process_sp->GetExitDescription();
597af67cecdSGreg Clayton   }
5985160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5994838131bSGreg Clayton   if (log)
6004838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitDescription () => %s",
601324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_desc);
6024838131bSGreg Clayton   return exit_desc;
60330fdc8d8SChris Lattner }
60430fdc8d8SChris Lattner 
605b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() {
606ceb6b139SCaroline Tice   lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
607acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
608acdbe816SGreg Clayton   if (process_sp)
609acdbe816SGreg Clayton     ret_val = process_sp->GetID();
610ceb6b139SCaroline Tice 
6115160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
612ceb6b139SCaroline Tice   if (log)
613324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64,
614324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
615ceb6b139SCaroline Tice 
616ceb6b139SCaroline Tice   return ret_val;
61730fdc8d8SChris Lattner }
61830fdc8d8SChris Lattner 
619b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() {
620949e8221SGreg Clayton   uint32_t ret_val = 0;
621949e8221SGreg Clayton   ProcessSP process_sp(GetSP());
622949e8221SGreg Clayton   if (process_sp)
623949e8221SGreg Clayton     ret_val = process_sp->GetUniqueID();
6245160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
625949e8221SGreg Clayton   if (log)
626324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32,
627324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
628949e8221SGreg Clayton   return ret_val;
629949e8221SGreg Clayton }
630949e8221SGreg Clayton 
631b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const {
632cf386e24SJohnny Chen   ByteOrder byteOrder = eByteOrderInvalid;
633acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
634acdbe816SGreg Clayton   if (process_sp)
635acdbe816SGreg Clayton     byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
636cf386e24SJohnny Chen 
6375160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
638cf386e24SJohnny Chen   if (log)
639324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetByteOrder () => %d",
640324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), byteOrder);
641cf386e24SJohnny Chen 
642cf386e24SJohnny Chen   return byteOrder;
643cf386e24SJohnny Chen }
644cf386e24SJohnny Chen 
645b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const {
646ceb6b139SCaroline Tice   uint32_t size = 0;
647acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
648acdbe816SGreg Clayton   if (process_sp)
649acdbe816SGreg Clayton     size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
650ceb6b139SCaroline Tice 
6515160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
652ceb6b139SCaroline Tice   if (log)
653324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetAddressByteSize () => %d",
654324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), size);
655ceb6b139SCaroline Tice 
656ceb6b139SCaroline Tice   return size;
65730fdc8d8SChris Lattner }
65830fdc8d8SChris Lattner 
659b9c1b51eSKate Stone SBError SBProcess::Continue() {
6605160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
661ceb6b139SCaroline Tice 
66230fdc8d8SChris Lattner   SBError sb_error;
663acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
6640c74e78dSGreg Clayton 
665acdbe816SGreg Clayton   if (log)
666324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue ()...",
667324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()));
668acdbe816SGreg Clayton 
669b9c1b51eSKate Stone   if (process_sp) {
670b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
671b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
672acdbe816SGreg Clayton 
673dc6224e0SGreg Clayton     if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
674dc6224e0SGreg Clayton       sb_error.ref() = process_sp->Resume();
675dc6224e0SGreg Clayton     else
676dc6224e0SGreg Clayton       sb_error.ref() = process_sp->ResumeSynchronous(NULL);
677b9c1b51eSKate Stone   } else
67830fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
67930fdc8d8SChris Lattner 
680b9c1b51eSKate Stone   if (log) {
681ceb6b139SCaroline Tice     SBStream sstr;
682ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
683324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s",
684324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
685324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
686ceb6b139SCaroline Tice   }
687ceb6b139SCaroline Tice 
68830fdc8d8SChris Lattner   return sb_error;
68930fdc8d8SChris Lattner }
69030fdc8d8SChris Lattner 
691b9c1b51eSKate Stone SBError SBProcess::Destroy() {
69230fdc8d8SChris Lattner   SBError sb_error;
693acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
694b9c1b51eSKate Stone   if (process_sp) {
695b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
696b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
697ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(false));
698b9c1b51eSKate Stone   } else
69930fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
70030fdc8d8SChris Lattner 
7015160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
702b9c1b51eSKate Stone   if (log) {
7034838131bSGreg Clayton     SBStream sstr;
7044838131bSGreg Clayton     sb_error.GetDescription(sstr);
7056779606aSGreg Clayton     log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s",
706324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
707324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7084838131bSGreg Clayton   }
7094838131bSGreg Clayton 
71030fdc8d8SChris Lattner   return sb_error;
71130fdc8d8SChris Lattner }
71230fdc8d8SChris Lattner 
713b9c1b51eSKate Stone SBError SBProcess::Stop() {
71430fdc8d8SChris Lattner   SBError sb_error;
715acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
716b9c1b51eSKate Stone   if (process_sp) {
717b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
718b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
719acdbe816SGreg Clayton     sb_error.SetError(process_sp->Halt());
720b9c1b51eSKate Stone   } else
72130fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
722ceb6b139SCaroline Tice 
7235160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
724b9c1b51eSKate Stone   if (log) {
725ceb6b139SCaroline Tice     SBStream sstr;
726ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
72793aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s",
728324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
729324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
730ceb6b139SCaroline Tice   }
731ceb6b139SCaroline Tice 
73230fdc8d8SChris Lattner   return sb_error;
73330fdc8d8SChris Lattner }
73430fdc8d8SChris Lattner 
735b9c1b51eSKate Stone SBError SBProcess::Kill() {
73630fdc8d8SChris Lattner   SBError sb_error;
737acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
738b9c1b51eSKate Stone   if (process_sp) {
739b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
740b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
741ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(true));
742b9c1b51eSKate Stone   } else
74330fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
744ceb6b139SCaroline Tice 
7455160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
746b9c1b51eSKate Stone   if (log) {
747ceb6b139SCaroline Tice     SBStream sstr;
748ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
74993aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s",
750324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
751324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
752ceb6b139SCaroline Tice   }
753ceb6b139SCaroline Tice 
75430fdc8d8SChris Lattner   return sb_error;
75530fdc8d8SChris Lattner }
75630fdc8d8SChris Lattner 
757b9c1b51eSKate Stone SBError SBProcess::Detach() {
758acff8950SJim Ingham   // FIXME: This should come from a process default.
759acff8950SJim Ingham   bool keep_stopped = false;
760acff8950SJim Ingham   return Detach(keep_stopped);
761acff8950SJim Ingham }
762acff8950SJim Ingham 
763b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) {
76430fdc8d8SChris Lattner   SBError sb_error;
765acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
766b9c1b51eSKate Stone   if (process_sp) {
767b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
768b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
769acff8950SJim Ingham     sb_error.SetError(process_sp->Detach(keep_stopped));
770b9c1b51eSKate Stone   } else
77130fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
77230fdc8d8SChris Lattner 
77330fdc8d8SChris Lattner   return sb_error;
77430fdc8d8SChris Lattner }
77530fdc8d8SChris Lattner 
776b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) {
77730fdc8d8SChris Lattner   SBError sb_error;
778acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
779b9c1b51eSKate Stone   if (process_sp) {
780b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
781b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
782acdbe816SGreg Clayton     sb_error.SetError(process_sp->Signal(signo));
783b9c1b51eSKate Stone   } else
78430fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
7855160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
786b9c1b51eSKate Stone   if (log) {
7874838131bSGreg Clayton     SBStream sstr;
7884838131bSGreg Clayton     sb_error.GetDescription(sstr);
7894838131bSGreg Clayton     log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
790324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), signo,
791324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
7924838131bSGreg Clayton   }
79330fdc8d8SChris Lattner   return sb_error;
79430fdc8d8SChris Lattner }
79530fdc8d8SChris Lattner 
796b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() {
79798d0a4b3SChaoren Lin   if (auto process_sp = GetSP())
79898d0a4b3SChaoren Lin     return SBUnixSignals{process_sp};
799802dc402STodd Fiala 
80098d0a4b3SChaoren Lin   return {};
801802dc402STodd Fiala }
802802dc402STodd Fiala 
803b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() {
804cfc0935eSJim Ingham   ProcessSP process_sp(GetSP());
805b9c1b51eSKate Stone   if (process_sp) {
806cfc0935eSJim Ingham     process_sp->SendAsyncInterrupt();
807cfc0935eSJim Ingham   }
808cfc0935eSJim Ingham }
809cfc0935eSJim Ingham 
810b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) {
8114838131bSGreg Clayton   SBThread sb_thread;
81217a6ad05SGreg Clayton   ThreadSP thread_sp;
813acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
814b9c1b51eSKate Stone   if (process_sp) {
8157fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
8167fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
817b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
818b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
8197fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
82017a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
821af67cecdSGreg Clayton   }
8224838131bSGreg Clayton 
8235160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
8244838131bSGreg Clayton   if (log)
825b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64
826b9c1b51eSKate Stone                 ") => SBThread (%p)",
827324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
828324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
8294838131bSGreg Clayton 
8304838131bSGreg Clayton   return sb_thread;
83130fdc8d8SChris Lattner }
83230fdc8d8SChris Lattner 
833b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
83418b46896SJim Ingham   SBThread sb_thread;
83518b46896SJim Ingham   ThreadSP thread_sp;
83618b46896SJim Ingham   ProcessSP process_sp(GetSP());
837b9c1b51eSKate Stone   if (process_sp) {
83818b46896SJim Ingham     Process::StopLocker stop_locker;
83918b46896SJim Ingham     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
840b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
841b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
842b9c1b51eSKate Stone     thread_sp =
843b9c1b51eSKate Stone         process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
84418b46896SJim Ingham     sb_thread.SetThread(thread_sp);
84518b46896SJim Ingham   }
84618b46896SJim Ingham 
8475160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
84818b46896SJim Ingham   if (log)
84918b46896SJim Ingham     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
850324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
851324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
85218b46896SJim Ingham 
85318b46896SJim Ingham   return sb_thread;
85418b46896SJim Ingham }
85518b46896SJim Ingham 
856b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
8575160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
858ceb6b139SCaroline Tice 
859ceb6b139SCaroline Tice   StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
860ceb6b139SCaroline Tice 
861ceb6b139SCaroline Tice   if (log)
862324a1036SSaleem Abdulrasool     log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
863324a1036SSaleem Abdulrasool                 static_cast<void *>(event.get()),
864750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
865ceb6b139SCaroline Tice 
866ceb6b139SCaroline Tice   return ret_val;
86730fdc8d8SChris Lattner }
86830fdc8d8SChris Lattner 
869b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
870ea2cc5e0SPavel Labath   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
871ea2cc5e0SPavel Labath 
872ea2cc5e0SPavel Labath   bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
873ea2cc5e0SPavel Labath 
874ea2cc5e0SPavel Labath   if (log)
875400e1809SHans Wennborg     log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
876400e1809SHans Wennborg                 static_cast<void *>(event.get()), ret_val);
877ea2cc5e0SPavel Labath 
878ea2cc5e0SPavel Labath   return ret_val;
87930fdc8d8SChris Lattner }
88030fdc8d8SChris Lattner 
881b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
8820161b49cSJim Ingham   return Process::ProcessEventData::GetNumRestartedReasons(event.get());
8830161b49cSJim Ingham }
8840161b49cSJim Ingham 
8850161b49cSJim Ingham const char *
886b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
887b9c1b51eSKate Stone                                               size_t idx) {
8880161b49cSJim Ingham   return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
8890161b49cSJim Ingham }
8900161b49cSJim Ingham 
891b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
89275930019STodd Fiala   ProcessSP process_sp =
89375930019STodd Fiala       Process::ProcessEventData::GetProcessFromEvent(event.get());
894b9c1b51eSKate Stone   if (!process_sp) {
89505097246SAdrian Prantl     // StructuredData events also know the process they come from. Try that.
89675930019STodd Fiala     process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
89775930019STodd Fiala   }
89875930019STodd Fiala 
89975930019STodd Fiala   return SBProcess(process_sp);
90030fdc8d8SChris Lattner }
90130fdc8d8SChris Lattner 
902b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
90306d2855fSIlia K   return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
90406d2855fSIlia K }
90506d2855fSIlia K 
90675930019STodd Fiala lldb::SBStructuredData
907b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
90875930019STodd Fiala   return SBStructuredData(event.GetSP());
90975930019STodd Fiala }
91075930019STodd Fiala 
911b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
91275930019STodd Fiala   return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
91375930019STodd Fiala          !EventIsStructuredDataEvent(event);
91475930019STodd Fiala }
91575930019STodd Fiala 
916b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
91775930019STodd Fiala   EventSP event_sp = event.GetSP();
91875930019STodd Fiala   EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
919b9c1b51eSKate Stone   return event_data && (event_data->GetFlavor() ==
920b9c1b51eSKate Stone                         EventDataStructuredData::GetFlavorString());
921e6bc6cb9SJim Ingham }
92230fdc8d8SChris Lattner 
923b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const {
9245160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
925ceb6b139SCaroline Tice 
926acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
927acdbe816SGreg Clayton 
928acdbe816SGreg Clayton   SBBroadcaster broadcaster(process_sp.get(), false);
929ceb6b139SCaroline Tice 
930ceb6b139SCaroline Tice   if (log)
931324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
932324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
933324a1036SSaleem Abdulrasool                 static_cast<void *>(broadcaster.get()));
934ceb6b139SCaroline Tice 
93530fdc8d8SChris Lattner   return broadcaster;
93630fdc8d8SChris Lattner }
93730fdc8d8SChris Lattner 
938b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() {
9394bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
9404bddaeb5SJim Ingham }
9414bddaeb5SJim Ingham 
942b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
943b9c1b51eSKate Stone                              SBError &sb_error) {
9445160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
945ceb6b139SCaroline Tice 
94630fdc8d8SChris Lattner   size_t bytes_read = 0;
94730fdc8d8SChris Lattner 
948acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
949acdbe816SGreg Clayton 
9504838131bSGreg Clayton   if (log)
951b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
952b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
953324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
954324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
955324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
9564838131bSGreg Clayton 
957b9c1b51eSKate Stone   if (process_sp) {
9587fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
959b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
960b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
961b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
9627fdf9ef1SGreg Clayton       bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
963b9c1b51eSKate Stone     } else {
964c9858e4dSGreg Clayton       if (log)
965324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::ReadMemory() => error: process is running",
966324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
9677fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
9687fdf9ef1SGreg Clayton     }
969b9c1b51eSKate Stone   } else {
97030fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
97130fdc8d8SChris Lattner   }
97230fdc8d8SChris Lattner 
973b9c1b51eSKate Stone   if (log) {
97493aa84e8SGreg Clayton     SBStream sstr;
97593aa84e8SGreg Clayton     sb_error.GetDescription(sstr);
976b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
977b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
978324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
979324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
980324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
981324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_read));
98293aa84e8SGreg Clayton   }
983ceb6b139SCaroline Tice 
98430fdc8d8SChris Lattner   return bytes_read;
98530fdc8d8SChris Lattner }
98630fdc8d8SChris Lattner 
987b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
988b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
989e91b7957SGreg Clayton   size_t bytes_read = 0;
990acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
991b9c1b51eSKate Stone   if (process_sp) {
9927fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
993b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
994b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
995b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
996b9c1b51eSKate Stone       bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
997b9c1b51eSKate Stone                                                      sb_error.ref());
998b9c1b51eSKate Stone     } else {
9995160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1000c9858e4dSGreg Clayton       if (log)
1001b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process "
1002b9c1b51eSKate Stone                     "is running",
1003324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10047fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10057fdf9ef1SGreg Clayton     }
1006b9c1b51eSKate Stone   } else {
1007e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1008e91b7957SGreg Clayton   }
1009e91b7957SGreg Clayton   return bytes_read;
1010e91b7957SGreg Clayton }
1011e91b7957SGreg Clayton 
1012b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
1013b9c1b51eSKate Stone                                            lldb::SBError &sb_error) {
10147fdf9ef1SGreg Clayton   uint64_t value = 0;
1015acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1016b9c1b51eSKate Stone   if (process_sp) {
10177fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1018b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1019b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1020b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1021b9c1b51eSKate Stone       value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
1022b9c1b51eSKate Stone                                                         sb_error.ref());
1023b9c1b51eSKate Stone     } else {
10245160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1025c9858e4dSGreg Clayton       if (log)
1026b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process "
1027b9c1b51eSKate Stone                     "is running",
1028324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10297fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10307fdf9ef1SGreg Clayton     }
1031b9c1b51eSKate Stone   } else {
1032e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1033e91b7957SGreg Clayton   }
10347fdf9ef1SGreg Clayton   return value;
1035e91b7957SGreg Clayton }
1036e91b7957SGreg Clayton 
1037b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
1038b9c1b51eSKate Stone                                               lldb::SBError &sb_error) {
1039e91b7957SGreg Clayton   lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1040acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1041b9c1b51eSKate Stone   if (process_sp) {
10427fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1043b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1044b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1045b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
10467fdf9ef1SGreg Clayton       ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
1047b9c1b51eSKate Stone     } else {
10485160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1049c9858e4dSGreg Clayton       if (log)
1050b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process "
1051b9c1b51eSKate Stone                     "is running",
1052324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10537fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10547fdf9ef1SGreg Clayton     }
1055b9c1b51eSKate Stone   } else {
1056e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1057e91b7957SGreg Clayton   }
1058e91b7957SGreg Clayton   return ptr;
1059e91b7957SGreg Clayton }
1060e91b7957SGreg Clayton 
1061b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
1062b9c1b51eSKate Stone                               SBError &sb_error) {
106330fdc8d8SChris Lattner   size_t bytes_written = 0;
106430fdc8d8SChris Lattner 
10655160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1066acdbe816SGreg Clayton 
1067acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1068acdbe816SGreg Clayton 
10694838131bSGreg Clayton   if (log)
1070b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1071b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1072324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1073b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1074324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
10754838131bSGreg Clayton 
1076b9c1b51eSKate Stone   if (process_sp) {
10777fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1078b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1079b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1080b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1081b9c1b51eSKate Stone       bytes_written =
1082b9c1b51eSKate Stone           process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
1083b9c1b51eSKate Stone     } else {
1084c9858e4dSGreg Clayton       if (log)
1085324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::WriteMemory() => error: process is running",
1086324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
10877fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
10887fdf9ef1SGreg Clayton     }
108930fdc8d8SChris Lattner   }
109030fdc8d8SChris Lattner 
1091b9c1b51eSKate Stone   if (log) {
10924838131bSGreg Clayton     SBStream sstr;
10934838131bSGreg Clayton     sb_error.GetDescription(sstr);
1094b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1095b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1096324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1097b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1098324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1099324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_written));
11004838131bSGreg Clayton   }
11014838131bSGreg Clayton 
110230fdc8d8SChris Lattner   return bytes_written;
110330fdc8d8SChris Lattner }
110430fdc8d8SChris Lattner 
1105b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) {
1106da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1107da7bc7d0SGreg Clayton 
1108acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1109b9c1b51eSKate Stone   if (process_sp) {
1110dde9cff3SCaroline Tice     char path[PATH_MAX];
1111dde9cff3SCaroline Tice     GetTarget().GetExecutable().GetPath(path, sizeof(path));
1112acdbe816SGreg Clayton     Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
11131d273166SGreg Clayton     const char *exe_name = NULL;
11141d273166SGreg Clayton     if (exe_module)
11151d273166SGreg Clayton       exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
11161d273166SGreg Clayton 
1117d01b2953SDaniel Malea     strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1118b9c1b51eSKate Stone                 process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1119b9c1b51eSKate Stone                 GetNumThreads(), exe_name ? ", executable = " : "",
11201d273166SGreg Clayton                 exe_name ? exe_name : "");
1121b9c1b51eSKate Stone   } else
1122da7bc7d0SGreg Clayton     strm.PutCString("No value");
1123dde9cff3SCaroline Tice 
1124dde9cff3SCaroline Tice   return true;
1125dde9cff3SCaroline Tice }
11268f343b09SGreg Clayton 
11278f343b09SGreg Clayton uint32_t
1128b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
11295160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1130f9ef60d2SJohnny Chen 
1131f9ef60d2SJohnny Chen   uint32_t num = 0;
1132f9ef60d2SJohnny Chen   ProcessSP process_sp(GetSP());
1133b9c1b51eSKate Stone   if (process_sp) {
1134b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1135b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1136f9ef60d2SJohnny Chen     sb_error.SetError(process_sp->GetWatchpointSupportInfo(num));
1137f9ef60d2SJohnny Chen     if (log)
1138f9ef60d2SJohnny Chen       log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1139324a1036SSaleem Abdulrasool                   static_cast<void *>(process_sp.get()), num);
1140b9c1b51eSKate Stone   } else {
1141f9ef60d2SJohnny Chen     sb_error.SetErrorString("SBProcess is invalid");
1142f9ef60d2SJohnny Chen   }
1143f9ef60d2SJohnny Chen   return num;
1144f9ef60d2SJohnny Chen }
1145f9ef60d2SJohnny Chen 
1146b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1147b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
11484fbd67acSTamas Berghammer   return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
11494fbd67acSTamas Berghammer }
11504fbd67acSTamas Berghammer 
1151b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
11524fbd67acSTamas Berghammer                               const lldb::SBFileSpec &sb_remote_image_spec,
1153b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1154abc5d72fSJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1155acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1156b9c1b51eSKate Stone   if (process_sp) {
11577fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1158b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1159abc5d72fSJim Ingham       if (log)
1160abc5d72fSJim Ingham         log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage"
1161abc5d72fSJim Ingham                     "for: %s",
1162abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()),
1163abc5d72fSJim Ingham                     sb_local_image_spec.GetFilename());
1164abc5d72fSJim Ingham 
1165b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1166b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
11673cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1168b9c1b51eSKate Stone       return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1169b9c1b51eSKate Stone                                     *sb_remote_image_spec, sb_error.ref());
1170b9c1b51eSKate Stone     } else {
1171c9858e4dSGreg Clayton       if (log)
1172324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::LoadImage() => error: process is running",
1173324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11747fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11757fdf9ef1SGreg Clayton     }
1176abc5d72fSJim Ingham   } else {
1177abc5d72fSJim Ingham     if (log)
1178abc5d72fSJim Ingham       log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid"
1179abc5d72fSJim Ingham                     " process",
1180abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()));
1181abc5d72fSJim Ingham     sb_error.SetErrorString("process is invalid");
11827fdf9ef1SGreg Clayton   }
11838f343b09SGreg Clayton   return LLDB_INVALID_IMAGE_TOKEN;
11848f343b09SGreg Clayton }
11858f343b09SGreg Clayton 
11860d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec,
11870d231f71SJim Ingham                                         SBStringList &paths,
11880d231f71SJim Ingham                                         lldb::SBFileSpec &loaded_path,
11890d231f71SJim Ingham                                         lldb::SBError &error) {
11900d231f71SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
11910d231f71SJim Ingham   ProcessSP process_sp(GetSP());
11920d231f71SJim Ingham   if (process_sp) {
11930d231f71SJim Ingham     Process::StopLocker stop_locker;
11940d231f71SJim Ingham     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
11950d231f71SJim Ingham       if (log)
11960d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => "
11970d231f71SJim Ingham                     "calling Platform::LoadImageUsingPaths for: %s",
11980d231f71SJim Ingham                     static_cast<void *>(process_sp.get()),
11990d231f71SJim Ingham                     image_spec.GetFilename());
12000d231f71SJim Ingham 
12010d231f71SJim Ingham       std::lock_guard<std::recursive_mutex> guard(
12020d231f71SJim Ingham         process_sp->GetTarget().GetAPIMutex());
12030d231f71SJim Ingham       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
12040d231f71SJim Ingham       size_t num_paths = paths.GetSize();
12050d231f71SJim Ingham       std::vector<std::string> paths_vec;
12060d231f71SJim Ingham       paths_vec.reserve(num_paths);
12070d231f71SJim Ingham       for (size_t i = 0; i < num_paths; i++)
12080d231f71SJim Ingham         paths_vec.push_back(paths.GetStringAtIndex(i));
12090d231f71SJim Ingham       FileSpec loaded_spec;
12100d231f71SJim Ingham 
12110d231f71SJim Ingham       uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(),
12120d231f71SJim Ingham                                                         *image_spec,
12130d231f71SJim Ingham                                                         paths_vec,
12140d231f71SJim Ingham                                                         error.ref(),
12150d231f71SJim Ingham                                                         &loaded_spec);
12160d231f71SJim Ingham        if (token != LLDB_INVALID_IMAGE_TOKEN)
12170d231f71SJim Ingham           loaded_path = loaded_spec;
12180d231f71SJim Ingham        return token;
12190d231f71SJim Ingham     } else {
12200d231f71SJim Ingham       if (log)
12210d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
12220d231f71SJim Ingham                     "process is running",
12230d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
12240d231f71SJim Ingham       error.SetErrorString("process is running");
12250d231f71SJim Ingham     }
12260d231f71SJim Ingham   } else {
12270d231f71SJim Ingham     if (log)
12280d231f71SJim Ingham       log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
12290d231f71SJim Ingham                    "called with invalid process",
12300d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
12310d231f71SJim Ingham     error.SetErrorString("process is invalid");
12320d231f71SJim Ingham   }
12330d231f71SJim Ingham 
12340d231f71SJim Ingham   return LLDB_INVALID_IMAGE_TOKEN;
12350d231f71SJim Ingham }
12360d231f71SJim Ingham 
1237b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
12388f343b09SGreg Clayton   lldb::SBError sb_error;
1239acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1240b9c1b51eSKate Stone   if (process_sp) {
12417fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1242b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1243b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1244b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
12453cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1246b9c1b51eSKate Stone       sb_error.SetError(
1247b9c1b51eSKate Stone           platform_sp->UnloadImage(process_sp.get(), image_token));
1248b9c1b51eSKate Stone     } else {
12495160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1250c9858e4dSGreg Clayton       if (log)
1251324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::UnloadImage() => error: process is running",
1252324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12537fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
12547fdf9ef1SGreg Clayton     }
1255b9c1b51eSKate Stone   } else
12568f343b09SGreg Clayton     sb_error.SetErrorString("invalid process");
12578f343b09SGreg Clayton   return sb_error;
12588f343b09SGreg Clayton }
12598c71337aSJason Molenda 
1260b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) {
1261a332978bSJason Molenda   lldb::SBError sb_error;
1262a332978bSJason Molenda   ProcessSP process_sp(GetSP());
1263b9c1b51eSKate Stone   if (process_sp) {
1264a332978bSJason Molenda     Process::StopLocker stop_locker;
1265b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1266b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1267b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1268a332978bSJason Molenda       sb_error.SetError(process_sp->SendEventData(event_data));
1269b9c1b51eSKate Stone     } else {
1270a332978bSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1271a332978bSJason Molenda       if (log)
1272b9c1b51eSKate Stone         log->Printf(
1273b9c1b51eSKate Stone             "SBProcess(%p)::SendEventData() => error: process is running",
1274324a1036SSaleem Abdulrasool             static_cast<void *>(process_sp.get()));
1275a332978bSJason Molenda       sb_error.SetErrorString("process is running");
1276a332978bSJason Molenda     }
1277b9c1b51eSKate Stone   } else
1278a332978bSJason Molenda     sb_error.SetErrorString("invalid process");
1279a332978bSJason Molenda   return sb_error;
1280a332978bSJason Molenda }
1281a332978bSJason Molenda 
1282b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
12838c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1284b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12858c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
128695d005c7SJason Molenda     return runtime->GetExtendedBacktraceTypes().size();
12878c71337aSJason Molenda   }
12888c71337aSJason Molenda   return 0;
12898c71337aSJason Molenda }
12908c71337aSJason Molenda 
1291b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
12928c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1293b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
12948c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
1295b9c1b51eSKate Stone     const std::vector<ConstString> &names =
1296b9c1b51eSKate Stone         runtime->GetExtendedBacktraceTypes();
1297b9c1b51eSKate Stone     if (idx < names.size()) {
12988c71337aSJason Molenda       return names[idx].AsCString();
1299b9c1b51eSKate Stone     } else {
13008c71337aSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
13018c71337aSJason Molenda       if (log)
1302b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => "
1303b9c1b51eSKate Stone                     "error: requested extended backtrace name out of bounds",
1304324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
13058c71337aSJason Molenda     }
13068c71337aSJason Molenda   }
13078c71337aSJason Molenda   return NULL;
13088c71337aSJason Molenda }
1309a51ea382SKuba Brecka 
1310b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1311a51ea382SKuba Brecka   ProcessSP process_sp(GetSP());
1312a51ea382SKuba Brecka   SBThreadCollection threads;
1313b9c1b51eSKate Stone   if (process_sp) {
1314a51ea382SKuba Brecka     threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1315a51ea382SKuba Brecka   }
1316a51ea382SKuba Brecka   return threads;
1317a51ea382SKuba Brecka }
131863927548SKuba Brecka 
1319b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent(
1320b9c1b51eSKate Stone     InstrumentationRuntimeType type) {
132163927548SKuba Brecka   ProcessSP process_sp(GetSP());
132263927548SKuba Brecka   if (!process_sp)
132363927548SKuba Brecka     return false;
132463927548SKuba Brecka 
1325b9c1b51eSKate Stone   InstrumentationRuntimeSP runtime_sp =
1326b9c1b51eSKate Stone       process_sp->GetInstrumentationRuntime(type);
132763927548SKuba Brecka 
132863927548SKuba Brecka   if (!runtime_sp.get())
132963927548SKuba Brecka     return false;
133063927548SKuba Brecka 
133163927548SKuba Brecka   return runtime_sp->IsActive();
133263927548SKuba Brecka }
1333f7d1893fSAdrian McCarthy 
1334b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) {
1335f7d1893fSAdrian McCarthy   lldb::SBError error;
1336f7d1893fSAdrian McCarthy   ProcessSP process_sp(GetSP());
1337b9c1b51eSKate Stone   if (!process_sp) {
1338f7d1893fSAdrian McCarthy     error.SetErrorString("SBProcess is invalid");
1339f7d1893fSAdrian McCarthy     return error;
1340f7d1893fSAdrian McCarthy   }
1341f7d1893fSAdrian McCarthy 
1342b9c1b51eSKate Stone   std::lock_guard<std::recursive_mutex> guard(
1343b9c1b51eSKate Stone       process_sp->GetTarget().GetAPIMutex());
1344f7d1893fSAdrian McCarthy 
1345b9c1b51eSKate Stone   if (process_sp->GetState() != eStateStopped) {
1346f7d1893fSAdrian McCarthy     error.SetErrorString("the process is not stopped");
1347f7d1893fSAdrian McCarthy     return error;
1348f7d1893fSAdrian McCarthy   }
1349f7d1893fSAdrian McCarthy 
13508f3be7a3SJonas Devlieghere   FileSpec core_file(file_name);
1351f7d1893fSAdrian McCarthy   error.ref() = PluginManager::SaveCore(process_sp, core_file);
1352f7d1893fSAdrian McCarthy   return error;
1353f7d1893fSAdrian McCarthy }
135426036843SHoward Hellyer 
135526036843SHoward Hellyer lldb::SBError
1356b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1357b9c1b51eSKate Stone                                SBMemoryRegionInfo &sb_region_info) {
135826036843SHoward Hellyer   lldb::SBError sb_error;
135926036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1360b9c1b51eSKate Stone   if (process_sp) {
136126036843SHoward Hellyer     Process::StopLocker stop_locker;
1362b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1363b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1364b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
136536788bbbSTatyana Krasnukha 
1366b9c1b51eSKate Stone       sb_error.ref() =
136736788bbbSTatyana Krasnukha           process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref());
1368b9c1b51eSKate Stone     } else {
136926036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
137026036843SHoward Hellyer       if (log)
1371b9c1b51eSKate Stone         log->Printf(
1372b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
137326036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
137426036843SHoward Hellyer       sb_error.SetErrorString("process is running");
137526036843SHoward Hellyer     }
1376b9c1b51eSKate Stone   } else {
137726036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
137826036843SHoward Hellyer   }
137926036843SHoward Hellyer   return sb_error;
138026036843SHoward Hellyer }
138126036843SHoward Hellyer 
1382b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
138326036843SHoward Hellyer   lldb::SBMemoryRegionInfoList sb_region_list;
138436788bbbSTatyana Krasnukha 
138526036843SHoward Hellyer   ProcessSP process_sp(GetSP());
138626036843SHoward Hellyer   Process::StopLocker stop_locker;
138736788bbbSTatyana Krasnukha   if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) {
1388b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1389b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
139036788bbbSTatyana Krasnukha 
139136788bbbSTatyana Krasnukha     process_sp->GetMemoryRegions(sb_region_list.ref());
1392b9c1b51eSKate Stone   } else {
139326036843SHoward Hellyer     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
139426036843SHoward Hellyer     if (log)
1395b9c1b51eSKate Stone       log->Printf(
1396b9c1b51eSKate Stone           "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
139726036843SHoward Hellyer           static_cast<void *>(process_sp.get()));
139826036843SHoward Hellyer   }
139936788bbbSTatyana Krasnukha 
140026036843SHoward Hellyer   return sb_region_list;
140126036843SHoward Hellyer }
1402141a6263SVadim Macagon 
1403141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() {
1404141a6263SVadim Macagon   lldb::SBProcessInfo sb_proc_info;
1405141a6263SVadim Macagon   ProcessSP process_sp(GetSP());
1406141a6263SVadim Macagon   ProcessInstanceInfo proc_info;
1407141a6263SVadim Macagon   if (process_sp && process_sp->GetProcessInfo(proc_info)) {
1408141a6263SVadim Macagon     sb_proc_info.SetProcessInfo(proc_info);
1409141a6263SVadim Macagon   }
1410141a6263SVadim Macagon   return sb_proc_info;
1411141a6263SVadim Macagon }
1412