130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
94c5de699SEli Friedman #include "lldb/API/SBProcess.h"
10*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
1130fdc8d8SChris Lattner 
12bdae3787SVirgile Bello #include <inttypes.h>
13bdae3787SVirgile Bello 
1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
175d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
181f746071SGreg Clayton #include "lldb/Core/Module.h"
19f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2126036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h"
2230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
248c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
256611103cSGreg Clayton #include "lldb/Target/Target.h"
266611103cSGreg Clayton #include "lldb/Target/Thread.h"
27145d95c9SPavel Labath #include "lldb/Utility/Args.h"
286f9e6901SZachary Turner #include "lldb/Utility/Log.h"
29805e7106SZachary Turner #include "lldb/Utility/ProcessInfo.h"
30d821c997SPavel Labath #include "lldb/Utility/State.h"
31bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner 
344c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
354c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
360e615684SGreg Clayton #include "lldb/API/SBDebugger.h"
374c5de699SEli Friedman #include "lldb/API/SBEvent.h"
380e615684SGreg Clayton #include "lldb/API/SBFileSpec.h"
3926036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h"
4026036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h"
41b9c1b51eSKate Stone #include "lldb/API/SBStream.h"
42b9c1b51eSKate Stone #include "lldb/API/SBStringList.h"
4375930019STodd Fiala #include "lldb/API/SBStructuredData.h"
444c5de699SEli Friedman #include "lldb/API/SBThread.h"
45a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h"
46d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h"
47d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h"
48802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h"
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner using namespace lldb;
5130fdc8d8SChris Lattner using namespace lldb_private;
5230fdc8d8SChris Lattner 
53*baf5664fSJonas Devlieghere SBProcess::SBProcess() : m_opaque_wp() {
54*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBProcess);
55*baf5664fSJonas Devlieghere }
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner //----------------------------------------------------------------------
5830fdc8d8SChris Lattner // SBProcess constructor
5930fdc8d8SChris Lattner //----------------------------------------------------------------------
6030fdc8d8SChris Lattner 
61*baf5664fSJonas Devlieghere SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {
62*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBProcess, (const lldb::SBProcess &), rhs);
63*baf5664fSJonas Devlieghere }
6430fdc8d8SChris Lattner 
65b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp)
66*baf5664fSJonas Devlieghere     : m_opaque_wp(process_sp) {
67*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBProcess, (const lldb::ProcessSP &), process_sp);
68*baf5664fSJonas Devlieghere }
6930fdc8d8SChris Lattner 
70b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) {
71*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBProcess &,
72*baf5664fSJonas Devlieghere                      SBProcess, operator=,(const lldb::SBProcess &), rhs);
73*baf5664fSJonas Devlieghere 
74efabb123SGreg Clayton   if (this != &rhs)
754e0fe8abSGreg Clayton     m_opaque_wp = rhs.m_opaque_wp;
76efabb123SGreg Clayton   return *this;
77efabb123SGreg Clayton }
78efabb123SGreg Clayton 
7930fdc8d8SChris Lattner //----------------------------------------------------------------------
8030fdc8d8SChris Lattner // Destructor
8130fdc8d8SChris Lattner //----------------------------------------------------------------------
82b9c1b51eSKate Stone SBProcess::~SBProcess() {}
8330fdc8d8SChris Lattner 
84b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() {
85*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBProcess,
86*baf5664fSJonas Devlieghere                                     GetBroadcasterClassName);
87*baf5664fSJonas Devlieghere 
884bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
894bddaeb5SJim Ingham }
904bddaeb5SJim Ingham 
91b9c1b51eSKate Stone const char *SBProcess::GetPluginName() {
92*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBProcess, GetPluginName);
93*baf5664fSJonas Devlieghere 
94d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
95b9c1b51eSKate Stone   if (process_sp) {
9657abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
97d7b30ef9SJim Ingham   }
98d7b30ef9SJim Ingham   return "<Unknown>";
99d7b30ef9SJim Ingham }
100d7b30ef9SJim Ingham 
101b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() {
102*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBProcess, GetShortPluginName);
103*baf5664fSJonas Devlieghere 
104d7b30ef9SJim Ingham   ProcessSP process_sp(GetSP());
105b9c1b51eSKate Stone   if (process_sp) {
10657abc5d6SGreg Clayton     return process_sp->GetPluginName().GetCString();
107d7b30ef9SJim Ingham   }
108d7b30ef9SJim Ingham   return "<Unknown>";
109d7b30ef9SJim Ingham }
110d7b30ef9SJim Ingham 
111b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); }
112d7b30ef9SJim Ingham 
113b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; }
114b9556accSGreg Clayton 
115*baf5664fSJonas Devlieghere void SBProcess::Clear() {
116*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBProcess, Clear);
117*baf5664fSJonas Devlieghere 
118*baf5664fSJonas Devlieghere   m_opaque_wp.reset();
119*baf5664fSJonas Devlieghere }
12030fdc8d8SChris Lattner 
121b9c1b51eSKate Stone bool SBProcess::IsValid() const {
122*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBProcess, IsValid);
123*baf5664fSJonas Devlieghere 
1244fc6cb9cSJim Ingham   ProcessSP process_sp(m_opaque_wp.lock());
1254fc6cb9cSJim Ingham   return ((bool)process_sp && process_sp->IsValid());
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
128b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp,
129b9c1b51eSKate Stone                              const char *stdin_path, const char *stdout_path,
1309631aae2SJames McIlree                              const char *stderr_path,
1319631aae2SJames McIlree                              const char *working_directory,
132b9c1b51eSKate Stone                              uint32_t launch_flags, bool stop_at_entry,
133b9c1b51eSKate Stone                              lldb::SBError &error) {
134*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, RemoteLaunch,
135*baf5664fSJonas Devlieghere                      (const char **, const char **, const char *, const char *,
136*baf5664fSJonas Devlieghere                       const char *, const char *, uint32_t, bool,
137*baf5664fSJonas Devlieghere                       lldb::SBError &),
138*baf5664fSJonas Devlieghere                      argv, envp, stdin_path, stdout_path, stderr_path,
139*baf5664fSJonas Devlieghere                      working_directory, launch_flags, stop_at_entry, error);
140*baf5664fSJonas Devlieghere 
1415160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
142324a1036SSaleem Abdulrasool   if (log)
143b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, "
144b9c1b51eSKate Stone                 "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, "
145b9c1b51eSKate Stone                 "stop_at_entry=%i, &error (%p))...",
146324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_wp.lock().get()),
147324a1036SSaleem Abdulrasool                 static_cast<void *>(argv), static_cast<void *>(envp),
1489631aae2SJames McIlree                 stdin_path ? stdin_path : "NULL",
1499631aae2SJames McIlree                 stdout_path ? stdout_path : "NULL",
1509631aae2SJames McIlree                 stderr_path ? stderr_path : "NULL",
151b9c1b51eSKate Stone                 working_directory ? working_directory : "NULL", launch_flags,
152b9c1b51eSKate Stone                 stop_at_entry, static_cast<void *>(error.get()));
1539631aae2SJames McIlree 
154acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
155b9c1b51eSKate Stone   if (process_sp) {
156b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
157b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
158b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
159982c9762SGreg Clayton       if (stop_at_entry)
160982c9762SGreg Clayton         launch_flags |= eLaunchFlagStopAtEntry;
1618f3be7a3SJonas Devlieghere       ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path),
1628f3be7a3SJonas Devlieghere                                     FileSpec(stderr_path),
1638f3be7a3SJonas Devlieghere                                     FileSpec(working_directory), launch_flags);
164acdbe816SGreg Clayton       Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
165982c9762SGreg Clayton       if (exe_module)
16614715c68SGreg Clayton         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
167982c9762SGreg Clayton       if (argv)
168982c9762SGreg Clayton         launch_info.GetArguments().AppendArguments(argv);
169982c9762SGreg Clayton       if (envp)
17062930e57SPavel Labath         launch_info.GetEnvironment() = Environment(envp);
171acdbe816SGreg Clayton       error.SetError(process_sp->Launch(launch_info));
172b9c1b51eSKate Stone     } else {
1739631aae2SJames McIlree       error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
1749631aae2SJames McIlree     }
175b9c1b51eSKate Stone   } else {
1769631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
1779631aae2SJames McIlree   }
1789631aae2SJames McIlree 
1799631aae2SJames McIlree   if (log) {
1809631aae2SJames McIlree     SBStream sstr;
1819631aae2SJames McIlree     error.GetDescription(sstr);
182324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
183324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
184324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
1859631aae2SJames McIlree   }
1869631aae2SJames McIlree 
1879631aae2SJames McIlree   return error.Success();
1889631aae2SJames McIlree }
1899631aae2SJames McIlree 
190b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
191b9c1b51eSKate Stone                                             lldb::SBError &error) {
192*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, RemoteAttachToProcessWithID,
193*baf5664fSJonas Devlieghere                      (lldb::pid_t, lldb::SBError &), pid, error);
194*baf5664fSJonas Devlieghere 
195acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
196b9c1b51eSKate Stone   if (process_sp) {
197b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
198b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
199b9c1b51eSKate Stone     if (process_sp->GetState() == eStateConnected) {
200144f3a9cSGreg Clayton       ProcessAttachInfo attach_info;
201144f3a9cSGreg Clayton       attach_info.SetProcessID(pid);
202acdbe816SGreg Clayton       error.SetError(process_sp->Attach(attach_info));
203b9c1b51eSKate Stone     } else {
204b9c1b51eSKate Stone       error.SetErrorString(
205b9c1b51eSKate Stone           "must be in eStateConnected to call RemoteAttachToProcessWithID");
2069631aae2SJames McIlree     }
207b9c1b51eSKate Stone   } else {
2089631aae2SJames McIlree     error.SetErrorString("unable to attach pid");
2099631aae2SJames McIlree   }
2109631aae2SJames McIlree 
2115160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
2129631aae2SJames McIlree   if (log) {
2139631aae2SJames McIlree     SBStream sstr;
2149631aae2SJames McIlree     error.GetDescription(sstr);
215b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64
216b9c1b51eSKate Stone                 ") => SBError (%p): %s",
217324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), pid,
218324a1036SSaleem Abdulrasool                 static_cast<void *>(error.get()), sstr.GetData());
2199631aae2SJames McIlree   }
2209631aae2SJames McIlree 
2219631aae2SJames McIlree   return error.Success();
2229631aae2SJames McIlree }
2239631aae2SJames McIlree 
224b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() {
225*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetNumThreads);
226*baf5664fSJonas Devlieghere 
2275160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
228ceb6b139SCaroline Tice 
229ceb6b139SCaroline Tice   uint32_t num_threads = 0;
230acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
231b9c1b51eSKate Stone   if (process_sp) {
2327fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
2337fdf9ef1SGreg Clayton 
2347fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
235b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
236b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
237acdbe816SGreg Clayton     num_threads = process_sp->GetThreadList().GetSize(can_update);
23830fdc8d8SChris Lattner   }
239ceb6b139SCaroline Tice 
240ceb6b139SCaroline Tice   if (log)
241324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumThreads () => %d",
242324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_threads);
243ceb6b139SCaroline Tice 
244ceb6b139SCaroline Tice   return num_threads;
24530fdc8d8SChris Lattner }
24630fdc8d8SChris Lattner 
247b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const {
248*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBProcess,
249*baf5664fSJonas Devlieghere                                    GetSelectedThread);
250*baf5664fSJonas Devlieghere 
2515160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
252ceb6b139SCaroline Tice 
25330fdc8d8SChris Lattner   SBThread sb_thread;
25417a6ad05SGreg Clayton   ThreadSP thread_sp;
255acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
256b9c1b51eSKate Stone   if (process_sp) {
257b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
258b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
259acdbe816SGreg Clayton     thread_sp = process_sp->GetThreadList().GetSelectedThread();
26017a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
261af67cecdSGreg Clayton   }
262ceb6b139SCaroline Tice 
263ceb6b139SCaroline Tice   if (log)
264324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
265324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
266324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
267ceb6b139SCaroline Tice 
268*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
26930fdc8d8SChris Lattner }
27030fdc8d8SChris Lattner 
271b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
272b9c1b51eSKate Stone                                          lldb::addr_t context) {
273*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, CreateOSPluginThread,
274*baf5664fSJonas Devlieghere                      (lldb::tid_t, lldb::addr_t), tid, context);
275*baf5664fSJonas Devlieghere 
2765160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
277a4d8747dSGreg Clayton 
278a4d8747dSGreg Clayton   SBThread sb_thread;
279a4d8747dSGreg Clayton   ThreadSP thread_sp;
280a4d8747dSGreg Clayton   ProcessSP process_sp(GetSP());
281b9c1b51eSKate Stone   if (process_sp) {
282b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
283b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
284a4d8747dSGreg Clayton     thread_sp = process_sp->CreateOSPluginThread(tid, context);
285a4d8747dSGreg Clayton     sb_thread.SetThread(thread_sp);
286a4d8747dSGreg Clayton   }
287a4d8747dSGreg Clayton 
288a4d8747dSGreg Clayton   if (log)
289b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64
290b9c1b51eSKate Stone                 ", context=0x%" PRIx64 ") => SBThread(%p)",
291324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid, context,
292324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
293a4d8747dSGreg Clayton 
294*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
295a4d8747dSGreg Clayton }
296a4d8747dSGreg Clayton 
297b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const {
298*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBTarget, SBProcess, GetTarget);
299*baf5664fSJonas Devlieghere 
3005160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
301ceb6b139SCaroline Tice 
30230fdc8d8SChris Lattner   SBTarget sb_target;
303b9556accSGreg Clayton   TargetSP target_sp;
304acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
305b9c1b51eSKate Stone   if (process_sp) {
306acdbe816SGreg Clayton     target_sp = process_sp->GetTarget().shared_from_this();
307b9556accSGreg Clayton     sb_target.SetSP(target_sp);
308b9556accSGreg Clayton   }
309ceb6b139SCaroline Tice 
310ceb6b139SCaroline Tice   if (log)
311324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)",
312324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
313324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
314ceb6b139SCaroline Tice 
315*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
31630fdc8d8SChris Lattner }
31730fdc8d8SChris Lattner 
318b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
319*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(size_t, SBProcess, PutSTDIN, (const char *, size_t), src,
320*baf5664fSJonas Devlieghere                      src_len);
321*baf5664fSJonas Devlieghere 
3225160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
323ceb6b139SCaroline Tice 
324ceb6b139SCaroline Tice   size_t ret_val = 0;
325acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
326b9c1b51eSKate Stone   if (process_sp) {
32797206d57SZachary Turner     Status error;
328acdbe816SGreg Clayton     ret_val = process_sp->PutSTDIN(src, src_len, error);
32930fdc8d8SChris Lattner   }
330ceb6b139SCaroline Tice 
331ceb6b139SCaroline Tice   if (log)
332b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64
333b9c1b51eSKate Stone                 ") => %" PRIu64,
334324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), src,
335b9c1b51eSKate Stone                 static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val));
336ceb6b139SCaroline Tice 
337ceb6b139SCaroline Tice   return ret_val;
33830fdc8d8SChris Lattner }
33930fdc8d8SChris Lattner 
340b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
341*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(size_t, SBProcess, GetSTDOUT, (char *, size_t), dst,
342*baf5664fSJonas Devlieghere                            dst_len);
343*baf5664fSJonas Devlieghere 
344cfd1acedSGreg Clayton   size_t bytes_read = 0;
345acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
346b9c1b51eSKate Stone   if (process_sp) {
34797206d57SZachary Turner     Status error;
348acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
34930fdc8d8SChris Lattner   }
350ceb6b139SCaroline Tice 
3515160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
352ceb6b139SCaroline Tice   if (log)
353b9c1b51eSKate Stone     log->Printf(
354b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64
355b9c1b51eSKate Stone         ") => %" PRIu64,
356b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
357b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
358ceb6b139SCaroline Tice 
359cfd1acedSGreg Clayton   return bytes_read;
36030fdc8d8SChris Lattner }
36130fdc8d8SChris Lattner 
362b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
363*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(size_t, SBProcess, GetSTDERR, (char *, size_t), dst,
364*baf5664fSJonas Devlieghere                            dst_len);
365*baf5664fSJonas Devlieghere 
366cfd1acedSGreg Clayton   size_t bytes_read = 0;
367acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
368b9c1b51eSKate Stone   if (process_sp) {
36997206d57SZachary Turner     Status error;
370acdbe816SGreg Clayton     bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
37130fdc8d8SChris Lattner   }
372ceb6b139SCaroline Tice 
3735160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
374ceb6b139SCaroline Tice   if (log)
375b9c1b51eSKate Stone     log->Printf(
376b9c1b51eSKate Stone         "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64
377b9c1b51eSKate Stone         ") => %" PRIu64,
378b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
379b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
380ceb6b139SCaroline Tice 
381cfd1acedSGreg Clayton   return bytes_read;
38230fdc8d8SChris Lattner }
38330fdc8d8SChris Lattner 
384b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
385*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(size_t, SBProcess, GetAsyncProfileData,
386*baf5664fSJonas Devlieghere                            (char *, size_t), dst, dst_len);
387*baf5664fSJonas Devlieghere 
388ab3b8b22SHan Ming Ong   size_t bytes_read = 0;
389ab3b8b22SHan Ming Ong   ProcessSP process_sp(GetSP());
390b9c1b51eSKate Stone   if (process_sp) {
39197206d57SZachary Turner     Status error;
392ab3b8b22SHan Ming Ong     bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
393ab3b8b22SHan Ming Ong   }
394ab3b8b22SHan Ming Ong 
3955160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
396ab3b8b22SHan Ming Ong   if (log)
397b9c1b51eSKate Stone     log->Printf(
398b9c1b51eSKate Stone         "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64
399b9c1b51eSKate Stone         ") => %" PRIu64,
400b9c1b51eSKate Stone         static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read),
401b9c1b51eSKate Stone         dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read));
402ab3b8b22SHan Ming Ong 
403ab3b8b22SHan Ming Ong   return bytes_read;
404ab3b8b22SHan Ming Ong }
405ab3b8b22SHan Ming Ong 
406d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options,
407d5d8d91cSRavitheja Addepally                                     lldb::SBError &error) {
408*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTrace, SBProcess, StartTrace,
409*baf5664fSJonas Devlieghere                      (lldb::SBTraceOptions &, lldb::SBError &), options, error);
410*baf5664fSJonas Devlieghere 
411d5d8d91cSRavitheja Addepally   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
412d5d8d91cSRavitheja Addepally   ProcessSP process_sp(GetSP());
413d5d8d91cSRavitheja Addepally   error.Clear();
414d5d8d91cSRavitheja Addepally   SBTrace trace_instance;
415d5d8d91cSRavitheja Addepally   trace_instance.SetSP(process_sp);
416d5d8d91cSRavitheja Addepally   lldb::user_id_t uid = LLDB_INVALID_UID;
417d5d8d91cSRavitheja Addepally 
418d5d8d91cSRavitheja Addepally   if (!process_sp) {
419d5d8d91cSRavitheja Addepally     error.SetErrorString("invalid process");
420d5d8d91cSRavitheja Addepally   } else {
421e714c4f5SRavitheja Addepally     uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref());
422d5d8d91cSRavitheja Addepally     trace_instance.SetTraceUID(uid);
423e714c4f5SRavitheja Addepally     LLDB_LOG(log, "SBProcess::returned uid - {0}", uid);
424d5d8d91cSRavitheja Addepally   }
425*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(trace_instance);
426d5d8d91cSRavitheja Addepally }
427d5d8d91cSRavitheja Addepally 
428b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
429*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(void, SBProcess, ReportEventState,
430*baf5664fSJonas Devlieghere                            (const lldb::SBEvent &, FILE *), event, out);
431*baf5664fSJonas Devlieghere 
43230fdc8d8SChris Lattner   if (out == NULL)
43330fdc8d8SChris Lattner     return;
43430fdc8d8SChris Lattner 
435acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
436b9c1b51eSKate Stone   if (process_sp) {
43730fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
43830fdc8d8SChris Lattner     char message[1024];
439b9c1b51eSKate Stone     int message_len = ::snprintf(
440b9c1b51eSKate Stone         message, sizeof(message), "Process %" PRIu64 " %s\n",
441b9c1b51eSKate Stone         process_sp->GetID(), SBDebugger::StateAsCString(event_state));
44230fdc8d8SChris Lattner 
44330fdc8d8SChris Lattner     if (message_len > 0)
44430fdc8d8SChris Lattner       ::fwrite(message, 1, message_len, out);
44530fdc8d8SChris Lattner   }
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
448b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event,
449b9c1b51eSKate Stone                                        SBCommandReturnObject &result) {
450*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBProcess, AppendEventStateReport,
451*baf5664fSJonas Devlieghere                      (const lldb::SBEvent &, lldb::SBCommandReturnObject &),
452*baf5664fSJonas Devlieghere                      event, result);
453*baf5664fSJonas Devlieghere 
454acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
455b9c1b51eSKate Stone   if (process_sp) {
45630fdc8d8SChris Lattner     const StateType event_state = SBProcess::GetStateFromEvent(event);
45730fdc8d8SChris Lattner     char message[1024];
458b9c1b51eSKate Stone     ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
459b9c1b51eSKate Stone                process_sp->GetID(), SBDebugger::StateAsCString(event_state));
46030fdc8d8SChris Lattner 
46130fdc8d8SChris Lattner     result.AppendMessage(message);
46230fdc8d8SChris Lattner   }
46330fdc8d8SChris Lattner }
46430fdc8d8SChris Lattner 
465b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) {
466*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, SetSelectedThread,
467*baf5664fSJonas Devlieghere                      (const lldb::SBThread &), thread);
468*baf5664fSJonas Devlieghere 
469acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
470b9c1b51eSKate Stone   if (process_sp) {
471b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
472b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
473b9c1b51eSKate Stone     return process_sp->GetThreadList().SetSelectedThreadByID(
474b9c1b51eSKate Stone         thread.GetThreadID());
475af67cecdSGreg Clayton   }
47630fdc8d8SChris Lattner   return false;
47730fdc8d8SChris Lattner }
47830fdc8d8SChris Lattner 
479b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
480*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, SetSelectedThreadByID, (lldb::tid_t),
481*baf5664fSJonas Devlieghere                      tid);
482*baf5664fSJonas Devlieghere 
4835160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
484ceb6b139SCaroline Tice 
485ceb6b139SCaroline Tice   bool ret_val = false;
486acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
487b9c1b51eSKate Stone   if (process_sp) {
488b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
489b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
490acdbe816SGreg Clayton     ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
491af67cecdSGreg Clayton   }
492ceb6b139SCaroline Tice 
493ceb6b139SCaroline Tice   if (log)
494b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64
495b9c1b51eSKate Stone                 ") => %s",
496324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
497324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
498ceb6b139SCaroline Tice 
499ceb6b139SCaroline Tice   return ret_val;
50030fdc8d8SChris Lattner }
50130fdc8d8SChris Lattner 
502b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
503*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, SetSelectedThreadByIndexID, (uint32_t),
504*baf5664fSJonas Devlieghere                      index_id);
505*baf5664fSJonas Devlieghere 
5065160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
50718b46896SJim Ingham 
50818b46896SJim Ingham   bool ret_val = false;
50918b46896SJim Ingham   ProcessSP process_sp(GetSP());
510b9c1b51eSKate Stone   if (process_sp) {
511b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
512b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
51318b46896SJim Ingham     ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
51418b46896SJim Ingham   }
51518b46896SJim Ingham 
51618b46896SJim Ingham   if (log)
51718b46896SJim Ingham     log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
518324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
519324a1036SSaleem Abdulrasool                 (ret_val ? "true" : "false"));
52018b46896SJim Ingham 
52118b46896SJim Ingham   return ret_val;
52218b46896SJim Ingham }
52318b46896SJim Ingham 
524b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) {
525*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, GetThreadAtIndex, (size_t),
526*baf5664fSJonas Devlieghere                      index);
527*baf5664fSJonas Devlieghere 
5285160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
529ceb6b139SCaroline Tice 
53017a6ad05SGreg Clayton   SBThread sb_thread;
53117a6ad05SGreg Clayton   ThreadSP thread_sp;
532acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
533b9c1b51eSKate Stone   if (process_sp) {
5347fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
5357fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
536b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
537b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
5387fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
53917a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
540af67cecdSGreg Clayton   }
541ceb6b139SCaroline Tice 
542ceb6b139SCaroline Tice   if (log)
54393aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
544324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
545324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
546324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
547ceb6b139SCaroline Tice 
548*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
54930fdc8d8SChris Lattner }
55030fdc8d8SChris Lattner 
551b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() {
552*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetNumQueues);
553*baf5664fSJonas Devlieghere 
5545e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5555e8dce4dSJason Molenda 
5565e8dce4dSJason Molenda   uint32_t num_queues = 0;
5575e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
558b9c1b51eSKate Stone   if (process_sp) {
5595e8dce4dSJason Molenda     Process::StopLocker stop_locker;
560b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
561b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
562b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
5635e8dce4dSJason Molenda       num_queues = process_sp->GetQueueList().GetSize();
5645e8dce4dSJason Molenda     }
565a61d0a5bSGreg Clayton   }
5665e8dce4dSJason Molenda 
5675e8dce4dSJason Molenda   if (log)
568324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetNumQueues () => %d",
569324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), num_queues);
5705e8dce4dSJason Molenda 
5715e8dce4dSJason Molenda   return num_queues;
5725e8dce4dSJason Molenda }
5735e8dce4dSJason Molenda 
574b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) {
575*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBQueue, SBProcess, GetQueueAtIndex, (size_t),
576*baf5664fSJonas Devlieghere                      index);
577*baf5664fSJonas Devlieghere 
5785e8dce4dSJason Molenda   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5795e8dce4dSJason Molenda 
5805e8dce4dSJason Molenda   SBQueue sb_queue;
5815e8dce4dSJason Molenda   QueueSP queue_sp;
5825e8dce4dSJason Molenda   ProcessSP process_sp(GetSP());
583b9c1b51eSKate Stone   if (process_sp) {
5845e8dce4dSJason Molenda     Process::StopLocker stop_locker;
585b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
586b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
587b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
5885e8dce4dSJason Molenda       queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5895e8dce4dSJason Molenda       sb_queue.SetQueue(queue_sp);
5905e8dce4dSJason Molenda     }
591a61d0a5bSGreg Clayton   }
5925e8dce4dSJason Molenda 
5935e8dce4dSJason Molenda   if (log)
5945e8dce4dSJason Molenda     log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
595324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
596324a1036SSaleem Abdulrasool                 static_cast<uint32_t>(index),
597324a1036SSaleem Abdulrasool                 static_cast<void *>(queue_sp.get()));
5985e8dce4dSJason Molenda 
599*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_queue);
6005e8dce4dSJason Molenda }
6015e8dce4dSJason Molenda 
602b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) {
603*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBProcess, GetStopID, (bool),
604*baf5664fSJonas Devlieghere                      include_expression_stops);
605*baf5664fSJonas Devlieghere 
606bf2956a2SJim Ingham   ProcessSP process_sp(GetSP());
607b9c1b51eSKate Stone   if (process_sp) {
608b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
609b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
610bf2956a2SJim Ingham     if (include_expression_stops)
611bf2956a2SJim Ingham       return process_sp->GetStopID();
612bf2956a2SJim Ingham     else
613bf2956a2SJim Ingham       return process_sp->GetLastNaturalStopID();
614bf2956a2SJim Ingham   }
615bf2956a2SJim Ingham   return 0;
616bf2956a2SJim Ingham }
617bf2956a2SJim Ingham 
618b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
619*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBEvent, SBProcess, GetStopEventForStopID,
620*baf5664fSJonas Devlieghere                      (uint32_t), stop_id);
621*baf5664fSJonas Devlieghere 
62238810f43SIlia K   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
62338810f43SIlia K 
62438810f43SIlia K   SBEvent sb_event;
62538810f43SIlia K   EventSP event_sp;
62638810f43SIlia K   ProcessSP process_sp(GetSP());
627b9c1b51eSKate Stone   if (process_sp) {
628b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
629b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
63038810f43SIlia K     event_sp = process_sp->GetStopEventForStopID(stop_id);
63138810f43SIlia K     sb_event.reset(event_sp);
63238810f43SIlia K   }
63338810f43SIlia K 
63438810f43SIlia K   if (log)
635b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32
636b9c1b51eSKate Stone                 ") => SBEvent(%p)",
637b9c1b51eSKate Stone                 static_cast<void *>(process_sp.get()), stop_id,
63838810f43SIlia K                 static_cast<void *>(event_sp.get()));
63938810f43SIlia K 
640*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_event);
64138810f43SIlia K }
64238810f43SIlia K 
643b9c1b51eSKate Stone StateType SBProcess::GetState() {
644*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::StateType, SBProcess, GetState);
645ceb6b139SCaroline Tice 
646ceb6b139SCaroline Tice   StateType ret_val = eStateInvalid;
647acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
648b9c1b51eSKate Stone   if (process_sp) {
649b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
650b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
651acdbe816SGreg Clayton     ret_val = process_sp->GetState();
652af67cecdSGreg Clayton   }
653ceb6b139SCaroline Tice 
6545160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
655ceb6b139SCaroline Tice   if (log)
656cfd1acedSGreg Clayton     log->Printf("SBProcess(%p)::GetState () => %s",
657324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
658750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
659ceb6b139SCaroline Tice 
660ceb6b139SCaroline Tice   return ret_val;
66130fdc8d8SChris Lattner }
66230fdc8d8SChris Lattner 
663b9c1b51eSKate Stone int SBProcess::GetExitStatus() {
664*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(int, SBProcess, GetExitStatus);
665*baf5664fSJonas Devlieghere 
6664838131bSGreg Clayton   int exit_status = 0;
667acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
668b9c1b51eSKate Stone   if (process_sp) {
669b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
670b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
671acdbe816SGreg Clayton     exit_status = process_sp->GetExitStatus();
672af67cecdSGreg Clayton   }
6735160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6744838131bSGreg Clayton   if (log)
6754838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
676324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_status,
677324a1036SSaleem Abdulrasool                 exit_status);
6784838131bSGreg Clayton 
6794838131bSGreg Clayton   return exit_status;
68030fdc8d8SChris Lattner }
68130fdc8d8SChris Lattner 
682b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() {
683*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBProcess, GetExitDescription);
684*baf5664fSJonas Devlieghere 
6854838131bSGreg Clayton   const char *exit_desc = NULL;
686acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
687b9c1b51eSKate Stone   if (process_sp) {
688b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
689b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
690acdbe816SGreg Clayton     exit_desc = process_sp->GetExitDescription();
691af67cecdSGreg Clayton   }
6925160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6934838131bSGreg Clayton   if (log)
6944838131bSGreg Clayton     log->Printf("SBProcess(%p)::GetExitDescription () => %s",
695324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), exit_desc);
6964838131bSGreg Clayton   return exit_desc;
69730fdc8d8SChris Lattner }
69830fdc8d8SChris Lattner 
699b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() {
700*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::pid_t, SBProcess, GetProcessID);
701*baf5664fSJonas Devlieghere 
702ceb6b139SCaroline Tice   lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
703acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
704acdbe816SGreg Clayton   if (process_sp)
705acdbe816SGreg Clayton     ret_val = process_sp->GetID();
706ceb6b139SCaroline Tice 
7075160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
708ceb6b139SCaroline Tice   if (log)
709324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64,
710324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
711ceb6b139SCaroline Tice 
712ceb6b139SCaroline Tice   return ret_val;
71330fdc8d8SChris Lattner }
71430fdc8d8SChris Lattner 
715b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() {
716*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetUniqueID);
717*baf5664fSJonas Devlieghere 
718949e8221SGreg Clayton   uint32_t ret_val = 0;
719949e8221SGreg Clayton   ProcessSP process_sp(GetSP());
720949e8221SGreg Clayton   if (process_sp)
721949e8221SGreg Clayton     ret_val = process_sp->GetUniqueID();
7225160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
723949e8221SGreg Clayton   if (log)
724324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32,
725324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), ret_val);
726949e8221SGreg Clayton   return ret_val;
727949e8221SGreg Clayton }
728949e8221SGreg Clayton 
729b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const {
730*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ByteOrder, SBProcess, GetByteOrder);
731*baf5664fSJonas Devlieghere 
732cf386e24SJohnny Chen   ByteOrder byteOrder = eByteOrderInvalid;
733acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
734acdbe816SGreg Clayton   if (process_sp)
735acdbe816SGreg Clayton     byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
736cf386e24SJohnny Chen 
7375160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
738cf386e24SJohnny Chen   if (log)
739324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetByteOrder () => %d",
740324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), byteOrder);
741cf386e24SJohnny Chen 
742cf386e24SJohnny Chen   return byteOrder;
743cf386e24SJohnny Chen }
744cf386e24SJohnny Chen 
745b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const {
746*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBProcess, GetAddressByteSize);
747*baf5664fSJonas Devlieghere 
748ceb6b139SCaroline Tice   uint32_t size = 0;
749acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
750acdbe816SGreg Clayton   if (process_sp)
751acdbe816SGreg Clayton     size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
752ceb6b139SCaroline Tice 
7535160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
754ceb6b139SCaroline Tice   if (log)
755324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetAddressByteSize () => %d",
756324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), size);
757ceb6b139SCaroline Tice 
758ceb6b139SCaroline Tice   return size;
75930fdc8d8SChris Lattner }
76030fdc8d8SChris Lattner 
761b9c1b51eSKate Stone SBError SBProcess::Continue() {
762*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Continue);
763*baf5664fSJonas Devlieghere 
7645160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
765ceb6b139SCaroline Tice 
76630fdc8d8SChris Lattner   SBError sb_error;
767acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
7680c74e78dSGreg Clayton 
769acdbe816SGreg Clayton   if (log)
770324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue ()...",
771324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()));
772acdbe816SGreg Clayton 
773b9c1b51eSKate Stone   if (process_sp) {
774b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
775b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
776acdbe816SGreg Clayton 
777dc6224e0SGreg Clayton     if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
778dc6224e0SGreg Clayton       sb_error.ref() = process_sp->Resume();
779dc6224e0SGreg Clayton     else
780dc6224e0SGreg Clayton       sb_error.ref() = process_sp->ResumeSynchronous(NULL);
781b9c1b51eSKate Stone   } else
78230fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
78330fdc8d8SChris Lattner 
784b9c1b51eSKate Stone   if (log) {
785ceb6b139SCaroline Tice     SBStream sstr;
786ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
787324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s",
788324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
789324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
790ceb6b139SCaroline Tice   }
791ceb6b139SCaroline Tice 
792*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
79330fdc8d8SChris Lattner }
79430fdc8d8SChris Lattner 
795b9c1b51eSKate Stone SBError SBProcess::Destroy() {
796*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Destroy);
797*baf5664fSJonas Devlieghere 
79830fdc8d8SChris Lattner   SBError sb_error;
799acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
800b9c1b51eSKate Stone   if (process_sp) {
801b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
802b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
803ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(false));
804b9c1b51eSKate Stone   } else
80530fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
80630fdc8d8SChris Lattner 
8075160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
808b9c1b51eSKate Stone   if (log) {
8094838131bSGreg Clayton     SBStream sstr;
8104838131bSGreg Clayton     sb_error.GetDescription(sstr);
8116779606aSGreg Clayton     log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s",
812324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
813324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
8144838131bSGreg Clayton   }
8154838131bSGreg Clayton 
816*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
81730fdc8d8SChris Lattner }
81830fdc8d8SChris Lattner 
819b9c1b51eSKate Stone SBError SBProcess::Stop() {
820*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Stop);
821*baf5664fSJonas Devlieghere 
82230fdc8d8SChris Lattner   SBError sb_error;
823acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
824b9c1b51eSKate Stone   if (process_sp) {
825b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
826b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
827acdbe816SGreg Clayton     sb_error.SetError(process_sp->Halt());
828b9c1b51eSKate Stone   } else
82930fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
830ceb6b139SCaroline Tice 
8315160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
832b9c1b51eSKate Stone   if (log) {
833ceb6b139SCaroline Tice     SBStream sstr;
834ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
83593aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s",
836324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
837324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
838ceb6b139SCaroline Tice   }
839ceb6b139SCaroline Tice 
840*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
84130fdc8d8SChris Lattner }
84230fdc8d8SChris Lattner 
843b9c1b51eSKate Stone SBError SBProcess::Kill() {
844*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Kill);
845*baf5664fSJonas Devlieghere 
84630fdc8d8SChris Lattner   SBError sb_error;
847acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
848b9c1b51eSKate Stone   if (process_sp) {
849b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
850b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
851ede3193bSJason Molenda     sb_error.SetError(process_sp->Destroy(true));
852b9c1b51eSKate Stone   } else
85330fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
854ceb6b139SCaroline Tice 
8555160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
856b9c1b51eSKate Stone   if (log) {
857ceb6b139SCaroline Tice     SBStream sstr;
858ceb6b139SCaroline Tice     sb_error.GetDescription(sstr);
85993aa84e8SGreg Clayton     log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s",
860324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
861324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
862ceb6b139SCaroline Tice   }
863ceb6b139SCaroline Tice 
864*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
86530fdc8d8SChris Lattner }
86630fdc8d8SChris Lattner 
867b9c1b51eSKate Stone SBError SBProcess::Detach() {
868*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Detach);
869*baf5664fSJonas Devlieghere 
870acff8950SJim Ingham   // FIXME: This should come from a process default.
871acff8950SJim Ingham   bool keep_stopped = false;
872*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(Detach(keep_stopped));
873acff8950SJim Ingham }
874acff8950SJim Ingham 
875b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) {
876*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBProcess, Detach, (bool), keep_stopped);
877*baf5664fSJonas Devlieghere 
87830fdc8d8SChris Lattner   SBError sb_error;
879acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
880b9c1b51eSKate Stone   if (process_sp) {
881b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
882b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
883acff8950SJim Ingham     sb_error.SetError(process_sp->Detach(keep_stopped));
884b9c1b51eSKate Stone   } else
88530fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
88630fdc8d8SChris Lattner 
887*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
88830fdc8d8SChris Lattner }
88930fdc8d8SChris Lattner 
890b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) {
891*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBProcess, Signal, (int), signo);
892*baf5664fSJonas Devlieghere 
89330fdc8d8SChris Lattner   SBError sb_error;
894acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
895b9c1b51eSKate Stone   if (process_sp) {
896b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
897b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
898acdbe816SGreg Clayton     sb_error.SetError(process_sp->Signal(signo));
899b9c1b51eSKate Stone   } else
90030fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
9015160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
902b9c1b51eSKate Stone   if (log) {
9034838131bSGreg Clayton     SBStream sstr;
9044838131bSGreg Clayton     sb_error.GetDescription(sstr);
9054838131bSGreg Clayton     log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
906324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), signo,
907324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData());
9084838131bSGreg Clayton   }
909*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
91030fdc8d8SChris Lattner }
91130fdc8d8SChris Lattner 
912b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() {
913*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBUnixSignals, SBProcess, GetUnixSignals);
914802dc402STodd Fiala 
915*baf5664fSJonas Devlieghere   if (auto process_sp = GetSP())
916*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBUnixSignals{process_sp});
917*baf5664fSJonas Devlieghere 
918*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBUnixSignals{});
919802dc402STodd Fiala }
920802dc402STodd Fiala 
921b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() {
922*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBProcess, SendAsyncInterrupt);
923*baf5664fSJonas Devlieghere 
924cfc0935eSJim Ingham   ProcessSP process_sp(GetSP());
925b9c1b51eSKate Stone   if (process_sp) {
926cfc0935eSJim Ingham     process_sp->SendAsyncInterrupt();
927cfc0935eSJim Ingham   }
928cfc0935eSJim Ingham }
929cfc0935eSJim Ingham 
930b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) {
931*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, GetThreadByID, (lldb::tid_t),
932*baf5664fSJonas Devlieghere                      tid);
933*baf5664fSJonas Devlieghere 
9344838131bSGreg Clayton   SBThread sb_thread;
93517a6ad05SGreg Clayton   ThreadSP thread_sp;
936acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
937b9c1b51eSKate Stone   if (process_sp) {
9387fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
9397fdf9ef1SGreg Clayton     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
940b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
941b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
9427fdf9ef1SGreg Clayton     thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
94317a6ad05SGreg Clayton     sb_thread.SetThread(thread_sp);
944af67cecdSGreg Clayton   }
9454838131bSGreg Clayton 
9465160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
9474838131bSGreg Clayton   if (log)
948b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64
949b9c1b51eSKate Stone                 ") => SBThread (%p)",
950324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), tid,
951324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
9524838131bSGreg Clayton 
953*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
95430fdc8d8SChris Lattner }
95530fdc8d8SChris Lattner 
956b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
957*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, GetThreadByIndexID, (uint32_t),
958*baf5664fSJonas Devlieghere                      index_id);
959*baf5664fSJonas Devlieghere 
96018b46896SJim Ingham   SBThread sb_thread;
96118b46896SJim Ingham   ThreadSP thread_sp;
96218b46896SJim Ingham   ProcessSP process_sp(GetSP());
963b9c1b51eSKate Stone   if (process_sp) {
96418b46896SJim Ingham     Process::StopLocker stop_locker;
96518b46896SJim Ingham     const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
966b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
967b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
968b9c1b51eSKate Stone     thread_sp =
969b9c1b51eSKate Stone         process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
97018b46896SJim Ingham     sb_thread.SetThread(thread_sp);
97118b46896SJim Ingham   }
97218b46896SJim Ingham 
9735160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
97418b46896SJim Ingham   if (log)
97518b46896SJim Ingham     log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
976324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), index_id,
977324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()));
97818b46896SJim Ingham 
979*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
98018b46896SJim Ingham }
98118b46896SJim Ingham 
982b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
983*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::StateType, SBProcess, GetStateFromEvent,
984*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
985*baf5664fSJonas Devlieghere 
9865160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
987ceb6b139SCaroline Tice 
988ceb6b139SCaroline Tice   StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
989ceb6b139SCaroline Tice 
990ceb6b139SCaroline Tice   if (log)
991324a1036SSaleem Abdulrasool     log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
992324a1036SSaleem Abdulrasool                 static_cast<void *>(event.get()),
993750cd175SCaroline Tice                 lldb_private::StateAsCString(ret_val));
994ceb6b139SCaroline Tice 
995ceb6b139SCaroline Tice   return ret_val;
99630fdc8d8SChris Lattner }
99730fdc8d8SChris Lattner 
998b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
999*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBProcess, GetRestartedFromEvent,
1000*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
1001*baf5664fSJonas Devlieghere 
1002ea2cc5e0SPavel Labath   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1003ea2cc5e0SPavel Labath 
1004ea2cc5e0SPavel Labath   bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
1005ea2cc5e0SPavel Labath 
1006ea2cc5e0SPavel Labath   if (log)
1007400e1809SHans Wennborg     log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
1008400e1809SHans Wennborg                 static_cast<void *>(event.get()), ret_val);
1009ea2cc5e0SPavel Labath 
1010ea2cc5e0SPavel Labath   return ret_val;
101130fdc8d8SChris Lattner }
101230fdc8d8SChris Lattner 
1013b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
1014*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(size_t, SBProcess, GetNumRestartedReasonsFromEvent,
1015*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
1016*baf5664fSJonas Devlieghere 
10170161b49cSJim Ingham   return Process::ProcessEventData::GetNumRestartedReasons(event.get());
10180161b49cSJim Ingham }
10190161b49cSJim Ingham 
10200161b49cSJim Ingham const char *
1021b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
1022b9c1b51eSKate Stone                                               size_t idx) {
1023*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(const char *, SBProcess,
1024*baf5664fSJonas Devlieghere                             GetRestartedReasonAtIndexFromEvent,
1025*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &, size_t), event, idx);
1026*baf5664fSJonas Devlieghere 
10270161b49cSJim Ingham   return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
10280161b49cSJim Ingham }
10290161b49cSJim Ingham 
1030b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
1031*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBProcess, SBProcess, GetProcessFromEvent,
1032*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
1033*baf5664fSJonas Devlieghere 
103475930019STodd Fiala   ProcessSP process_sp =
103575930019STodd Fiala       Process::ProcessEventData::GetProcessFromEvent(event.get());
1036b9c1b51eSKate Stone   if (!process_sp) {
103705097246SAdrian Prantl     // StructuredData events also know the process they come from. Try that.
103875930019STodd Fiala     process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
103975930019STodd Fiala   }
104075930019STodd Fiala 
1041*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBProcess(process_sp));
104230fdc8d8SChris Lattner }
104330fdc8d8SChris Lattner 
1044b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
1045*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBProcess, GetInterruptedFromEvent,
1046*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
1047*baf5664fSJonas Devlieghere 
104806d2855fSIlia K   return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
104906d2855fSIlia K }
105006d2855fSIlia K 
105175930019STodd Fiala lldb::SBStructuredData
1052b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
1053*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBStructuredData, SBProcess,
1054*baf5664fSJonas Devlieghere                             GetStructuredDataFromEvent, (const lldb::SBEvent &),
1055*baf5664fSJonas Devlieghere                             event);
1056*baf5664fSJonas Devlieghere 
1057*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBStructuredData(event.GetSP()));
105875930019STodd Fiala }
105975930019STodd Fiala 
1060b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
1061*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBProcess, EventIsProcessEvent,
1062*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
1063*baf5664fSJonas Devlieghere 
106475930019STodd Fiala   return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
106575930019STodd Fiala          !EventIsStructuredDataEvent(event);
106675930019STodd Fiala }
106775930019STodd Fiala 
1068b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
1069*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBProcess, EventIsStructuredDataEvent,
1070*baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
1071*baf5664fSJonas Devlieghere 
107275930019STodd Fiala   EventSP event_sp = event.GetSP();
107375930019STodd Fiala   EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
1074b9c1b51eSKate Stone   return event_data && (event_data->GetFlavor() ==
1075b9c1b51eSKate Stone                         EventDataStructuredData::GetFlavorString());
1076e6bc6cb9SJim Ingham }
107730fdc8d8SChris Lattner 
1078b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const {
1079*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBroadcaster, SBProcess,
1080*baf5664fSJonas Devlieghere                                    GetBroadcaster);
1081*baf5664fSJonas Devlieghere 
10825160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1083ceb6b139SCaroline Tice 
1084acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1085acdbe816SGreg Clayton 
1086acdbe816SGreg Clayton   SBBroadcaster broadcaster(process_sp.get(), false);
1087ceb6b139SCaroline Tice 
1088ceb6b139SCaroline Tice   if (log)
1089324a1036SSaleem Abdulrasool     log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1090324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()),
1091324a1036SSaleem Abdulrasool                 static_cast<void *>(broadcaster.get()));
1092ceb6b139SCaroline Tice 
1093*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(broadcaster);
109430fdc8d8SChris Lattner }
109530fdc8d8SChris Lattner 
1096b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() {
1097*baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBProcess,
1098*baf5664fSJonas Devlieghere                                     GetBroadcasterClass);
1099*baf5664fSJonas Devlieghere 
11004bddaeb5SJim Ingham   return Process::GetStaticBroadcasterClass().AsCString();
11014bddaeb5SJim Ingham }
11024bddaeb5SJim Ingham 
1103b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
1104b9c1b51eSKate Stone                              SBError &sb_error) {
11055160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1106ceb6b139SCaroline Tice 
110730fdc8d8SChris Lattner   size_t bytes_read = 0;
110830fdc8d8SChris Lattner 
1109acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1110acdbe816SGreg Clayton 
11114838131bSGreg Clayton   if (log)
1112b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
1113b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
1114324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1115324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
1116324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
11174838131bSGreg Clayton 
1118b9c1b51eSKate Stone   if (process_sp) {
11197fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1120b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1121b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1122b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
11237fdf9ef1SGreg Clayton       bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
1124b9c1b51eSKate Stone     } else {
1125c9858e4dSGreg Clayton       if (log)
1126324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::ReadMemory() => error: process is running",
1127324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11287fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11297fdf9ef1SGreg Clayton     }
1130b9c1b51eSKate Stone   } else {
113130fdc8d8SChris Lattner     sb_error.SetErrorString("SBProcess is invalid");
113230fdc8d8SChris Lattner   }
113330fdc8d8SChris Lattner 
1134b9c1b51eSKate Stone   if (log) {
113593aa84e8SGreg Clayton     SBStream sstr;
113693aa84e8SGreg Clayton     sb_error.GetDescription(sstr);
1137b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64
1138b9c1b51eSKate Stone                 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1139324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1140324a1036SSaleem Abdulrasool                 static_cast<void *>(dst), static_cast<uint64_t>(dst_len),
1141324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1142324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_read));
114393aa84e8SGreg Clayton   }
1144ceb6b139SCaroline Tice 
114530fdc8d8SChris Lattner   return bytes_read;
114630fdc8d8SChris Lattner }
114730fdc8d8SChris Lattner 
1148b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
1149b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
1150e91b7957SGreg Clayton   size_t bytes_read = 0;
1151acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1152b9c1b51eSKate Stone   if (process_sp) {
11537fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1154b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1155b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1156b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1157b9c1b51eSKate Stone       bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
1158b9c1b51eSKate Stone                                                      sb_error.ref());
1159b9c1b51eSKate Stone     } else {
11605160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1161c9858e4dSGreg Clayton       if (log)
1162b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process "
1163b9c1b51eSKate Stone                     "is running",
1164324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11657fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11667fdf9ef1SGreg Clayton     }
1167b9c1b51eSKate Stone   } else {
1168e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1169e91b7957SGreg Clayton   }
1170e91b7957SGreg Clayton   return bytes_read;
1171e91b7957SGreg Clayton }
1172e91b7957SGreg Clayton 
1173b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
1174b9c1b51eSKate Stone                                            lldb::SBError &sb_error) {
1175*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint64_t, SBProcess, ReadUnsignedFromMemory,
1176*baf5664fSJonas Devlieghere                      (lldb::addr_t, uint32_t, lldb::SBError &), addr, byte_size,
1177*baf5664fSJonas Devlieghere                      sb_error);
1178*baf5664fSJonas Devlieghere 
11797fdf9ef1SGreg Clayton   uint64_t value = 0;
1180acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1181b9c1b51eSKate Stone   if (process_sp) {
11827fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1183b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1184b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1185b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1186b9c1b51eSKate Stone       value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
1187b9c1b51eSKate Stone                                                         sb_error.ref());
1188b9c1b51eSKate Stone     } else {
11895160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1190c9858e4dSGreg Clayton       if (log)
1191b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process "
1192b9c1b51eSKate Stone                     "is running",
1193324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
11947fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
11957fdf9ef1SGreg Clayton     }
1196b9c1b51eSKate Stone   } else {
1197e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1198e91b7957SGreg Clayton   }
11997fdf9ef1SGreg Clayton   return value;
1200e91b7957SGreg Clayton }
1201e91b7957SGreg Clayton 
1202b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
1203b9c1b51eSKate Stone                                               lldb::SBError &sb_error) {
1204*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::addr_t, SBProcess, ReadPointerFromMemory,
1205*baf5664fSJonas Devlieghere                      (lldb::addr_t, lldb::SBError &), addr, sb_error);
1206*baf5664fSJonas Devlieghere 
1207e91b7957SGreg Clayton   lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1208acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1209b9c1b51eSKate Stone   if (process_sp) {
12107fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1211b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1212b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1213b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
12147fdf9ef1SGreg Clayton       ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
1215b9c1b51eSKate Stone     } else {
12165160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1217c9858e4dSGreg Clayton       if (log)
1218b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process "
1219b9c1b51eSKate Stone                     "is running",
1220324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12217fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
12227fdf9ef1SGreg Clayton     }
1223b9c1b51eSKate Stone   } else {
1224e91b7957SGreg Clayton     sb_error.SetErrorString("SBProcess is invalid");
1225e91b7957SGreg Clayton   }
1226e91b7957SGreg Clayton   return ptr;
1227e91b7957SGreg Clayton }
1228e91b7957SGreg Clayton 
1229b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
1230b9c1b51eSKate Stone                               SBError &sb_error) {
123130fdc8d8SChris Lattner   size_t bytes_written = 0;
123230fdc8d8SChris Lattner 
12335160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1234acdbe816SGreg Clayton 
1235acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1236acdbe816SGreg Clayton 
12374838131bSGreg Clayton   if (log)
1238b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1239b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1240324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1241b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1242324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()));
12434838131bSGreg Clayton 
1244b9c1b51eSKate Stone   if (process_sp) {
12457fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1246b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1247b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1248b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1249b9c1b51eSKate Stone       bytes_written =
1250b9c1b51eSKate Stone           process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
1251b9c1b51eSKate Stone     } else {
1252c9858e4dSGreg Clayton       if (log)
1253324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::WriteMemory() => error: process is running",
1254324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
12557fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
12567fdf9ef1SGreg Clayton     }
125730fdc8d8SChris Lattner   }
125830fdc8d8SChris Lattner 
1259b9c1b51eSKate Stone   if (log) {
12604838131bSGreg Clayton     SBStream sstr;
12614838131bSGreg Clayton     sb_error.GetDescription(sstr);
1262b9c1b51eSKate Stone     log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64
1263b9c1b51eSKate Stone                 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1264324a1036SSaleem Abdulrasool                 static_cast<void *>(process_sp.get()), addr,
1265b9c1b51eSKate Stone                 static_cast<const void *>(src), static_cast<uint64_t>(src_len),
1266324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_error.get()), sstr.GetData(),
1267324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(bytes_written));
12684838131bSGreg Clayton   }
12694838131bSGreg Clayton 
127030fdc8d8SChris Lattner   return bytes_written;
127130fdc8d8SChris Lattner }
127230fdc8d8SChris Lattner 
1273b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) {
1274*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, GetDescription, (lldb::SBStream &),
1275*baf5664fSJonas Devlieghere                      description);
1276*baf5664fSJonas Devlieghere 
1277da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1278da7bc7d0SGreg Clayton 
1279acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1280b9c1b51eSKate Stone   if (process_sp) {
1281dde9cff3SCaroline Tice     char path[PATH_MAX];
1282dde9cff3SCaroline Tice     GetTarget().GetExecutable().GetPath(path, sizeof(path));
1283acdbe816SGreg Clayton     Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
12841d273166SGreg Clayton     const char *exe_name = NULL;
12851d273166SGreg Clayton     if (exe_module)
12861d273166SGreg Clayton       exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
12871d273166SGreg Clayton 
1288d01b2953SDaniel Malea     strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1289b9c1b51eSKate Stone                 process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1290b9c1b51eSKate Stone                 GetNumThreads(), exe_name ? ", executable = " : "",
12911d273166SGreg Clayton                 exe_name ? exe_name : "");
1292b9c1b51eSKate Stone   } else
1293da7bc7d0SGreg Clayton     strm.PutCString("No value");
1294dde9cff3SCaroline Tice 
1295dde9cff3SCaroline Tice   return true;
1296dde9cff3SCaroline Tice }
12978f343b09SGreg Clayton 
12988f343b09SGreg Clayton uint32_t
1299b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
1300*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint32_t, SBProcess,
1301*baf5664fSJonas Devlieghere                            GetNumSupportedHardwareWatchpoints,
1302*baf5664fSJonas Devlieghere                            (lldb::SBError &), sb_error);
1303*baf5664fSJonas Devlieghere 
13045160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1305f9ef60d2SJohnny Chen 
1306f9ef60d2SJohnny Chen   uint32_t num = 0;
1307f9ef60d2SJohnny Chen   ProcessSP process_sp(GetSP());
1308b9c1b51eSKate Stone   if (process_sp) {
1309b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1310b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
1311f9ef60d2SJohnny Chen     sb_error.SetError(process_sp->GetWatchpointSupportInfo(num));
1312f9ef60d2SJohnny Chen     if (log)
1313f9ef60d2SJohnny Chen       log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1314324a1036SSaleem Abdulrasool                   static_cast<void *>(process_sp.get()), num);
1315b9c1b51eSKate Stone   } else {
1316f9ef60d2SJohnny Chen     sb_error.SetErrorString("SBProcess is invalid");
1317f9ef60d2SJohnny Chen   }
1318f9ef60d2SJohnny Chen   return num;
1319f9ef60d2SJohnny Chen }
1320f9ef60d2SJohnny Chen 
1321b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1322b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1323*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBProcess, LoadImage,
1324*baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &, lldb::SBError &),
1325*baf5664fSJonas Devlieghere                      sb_remote_image_spec, sb_error);
1326*baf5664fSJonas Devlieghere 
13274fbd67acSTamas Berghammer   return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
13284fbd67acSTamas Berghammer }
13294fbd67acSTamas Berghammer 
1330b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
13314fbd67acSTamas Berghammer                               const lldb::SBFileSpec &sb_remote_image_spec,
1332b9c1b51eSKate Stone                               lldb::SBError &sb_error) {
1333*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
1334*baf5664fSJonas Devlieghere       uint32_t, SBProcess, LoadImage,
1335*baf5664fSJonas Devlieghere       (const lldb::SBFileSpec &, const lldb::SBFileSpec &, lldb::SBError &),
1336*baf5664fSJonas Devlieghere       sb_local_image_spec, sb_remote_image_spec, sb_error);
1337*baf5664fSJonas Devlieghere 
1338abc5d72fSJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1339acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1340b9c1b51eSKate Stone   if (process_sp) {
13417fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1342b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1343abc5d72fSJim Ingham       if (log)
1344abc5d72fSJim Ingham         log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage"
1345abc5d72fSJim Ingham                     "for: %s",
1346abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()),
1347abc5d72fSJim Ingham                     sb_local_image_spec.GetFilename());
1348abc5d72fSJim Ingham 
1349b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1350b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
13513cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1352b9c1b51eSKate Stone       return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1353b9c1b51eSKate Stone                                     *sb_remote_image_spec, sb_error.ref());
1354b9c1b51eSKate Stone     } else {
1355c9858e4dSGreg Clayton       if (log)
1356324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::LoadImage() => error: process is running",
1357324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
13587fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
13597fdf9ef1SGreg Clayton     }
1360abc5d72fSJim Ingham   } else {
1361abc5d72fSJim Ingham     if (log)
1362abc5d72fSJim Ingham       log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid"
1363abc5d72fSJim Ingham                     " process",
1364abc5d72fSJim Ingham                     static_cast<void *>(process_sp.get()));
1365abc5d72fSJim Ingham     sb_error.SetErrorString("process is invalid");
13667fdf9ef1SGreg Clayton   }
13678f343b09SGreg Clayton   return LLDB_INVALID_IMAGE_TOKEN;
13688f343b09SGreg Clayton }
13698f343b09SGreg Clayton 
13700d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec,
13710d231f71SJim Ingham                                         SBStringList &paths,
13720d231f71SJim Ingham                                         lldb::SBFileSpec &loaded_path,
13730d231f71SJim Ingham                                         lldb::SBError &error) {
1374*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBProcess, LoadImageUsingPaths,
1375*baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &, lldb::SBStringList &,
1376*baf5664fSJonas Devlieghere                       lldb::SBFileSpec &, lldb::SBError &),
1377*baf5664fSJonas Devlieghere                      image_spec, paths, loaded_path, error);
1378*baf5664fSJonas Devlieghere 
13790d231f71SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
13800d231f71SJim Ingham   ProcessSP process_sp(GetSP());
13810d231f71SJim Ingham   if (process_sp) {
13820d231f71SJim Ingham     Process::StopLocker stop_locker;
13830d231f71SJim Ingham     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
13840d231f71SJim Ingham       if (log)
13850d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => "
13860d231f71SJim Ingham                     "calling Platform::LoadImageUsingPaths for: %s",
13870d231f71SJim Ingham                     static_cast<void *>(process_sp.get()),
13880d231f71SJim Ingham                     image_spec.GetFilename());
13890d231f71SJim Ingham 
13900d231f71SJim Ingham       std::lock_guard<std::recursive_mutex> guard(
13910d231f71SJim Ingham         process_sp->GetTarget().GetAPIMutex());
13920d231f71SJim Ingham       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
13930d231f71SJim Ingham       size_t num_paths = paths.GetSize();
13940d231f71SJim Ingham       std::vector<std::string> paths_vec;
13950d231f71SJim Ingham       paths_vec.reserve(num_paths);
13960d231f71SJim Ingham       for (size_t i = 0; i < num_paths; i++)
13970d231f71SJim Ingham         paths_vec.push_back(paths.GetStringAtIndex(i));
13980d231f71SJim Ingham       FileSpec loaded_spec;
13990d231f71SJim Ingham 
14000d231f71SJim Ingham       uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(),
14010d231f71SJim Ingham                                                         *image_spec,
14020d231f71SJim Ingham                                                         paths_vec,
14030d231f71SJim Ingham                                                         error.ref(),
14040d231f71SJim Ingham                                                         &loaded_spec);
14050d231f71SJim Ingham        if (token != LLDB_INVALID_IMAGE_TOKEN)
14060d231f71SJim Ingham           loaded_path = loaded_spec;
14070d231f71SJim Ingham        return token;
14080d231f71SJim Ingham     } else {
14090d231f71SJim Ingham       if (log)
14100d231f71SJim Ingham         log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
14110d231f71SJim Ingham                     "process is running",
14120d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
14130d231f71SJim Ingham       error.SetErrorString("process is running");
14140d231f71SJim Ingham     }
14150d231f71SJim Ingham   } else {
14160d231f71SJim Ingham     if (log)
14170d231f71SJim Ingham       log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: "
14180d231f71SJim Ingham                    "called with invalid process",
14190d231f71SJim Ingham                     static_cast<void *>(process_sp.get()));
14200d231f71SJim Ingham     error.SetErrorString("process is invalid");
14210d231f71SJim Ingham   }
14220d231f71SJim Ingham 
14230d231f71SJim Ingham   return LLDB_INVALID_IMAGE_TOKEN;
14240d231f71SJim Ingham }
14250d231f71SJim Ingham 
1426b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
1427*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBProcess, UnloadImage, (uint32_t),
1428*baf5664fSJonas Devlieghere                      image_token);
1429*baf5664fSJonas Devlieghere 
14308f343b09SGreg Clayton   lldb::SBError sb_error;
1431acdbe816SGreg Clayton   ProcessSP process_sp(GetSP());
1432b9c1b51eSKate Stone   if (process_sp) {
14337fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1434b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1435b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1436b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
14373cb132a0STamas Berghammer       PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1438b9c1b51eSKate Stone       sb_error.SetError(
1439b9c1b51eSKate Stone           platform_sp->UnloadImage(process_sp.get(), image_token));
1440b9c1b51eSKate Stone     } else {
14415160ce5cSGreg Clayton       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1442c9858e4dSGreg Clayton       if (log)
1443324a1036SSaleem Abdulrasool         log->Printf("SBProcess(%p)::UnloadImage() => error: process is running",
1444324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
14457fdf9ef1SGreg Clayton       sb_error.SetErrorString("process is running");
14467fdf9ef1SGreg Clayton     }
1447b9c1b51eSKate Stone   } else
14488f343b09SGreg Clayton     sb_error.SetErrorString("invalid process");
1449*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
14508f343b09SGreg Clayton }
14518c71337aSJason Molenda 
1452b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) {
1453*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBProcess, SendEventData, (const char *),
1454*baf5664fSJonas Devlieghere                      event_data);
1455*baf5664fSJonas Devlieghere 
1456a332978bSJason Molenda   lldb::SBError sb_error;
1457a332978bSJason Molenda   ProcessSP process_sp(GetSP());
1458b9c1b51eSKate Stone   if (process_sp) {
1459a332978bSJason Molenda     Process::StopLocker stop_locker;
1460b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1461b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1462b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
1463a332978bSJason Molenda       sb_error.SetError(process_sp->SendEventData(event_data));
1464b9c1b51eSKate Stone     } else {
1465a332978bSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1466a332978bSJason Molenda       if (log)
1467b9c1b51eSKate Stone         log->Printf(
1468b9c1b51eSKate Stone             "SBProcess(%p)::SendEventData() => error: process is running",
1469324a1036SSaleem Abdulrasool             static_cast<void *>(process_sp.get()));
1470a332978bSJason Molenda       sb_error.SetErrorString("process is running");
1471a332978bSJason Molenda     }
1472b9c1b51eSKate Stone   } else
1473a332978bSJason Molenda     sb_error.SetErrorString("invalid process");
1474*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
1475a332978bSJason Molenda }
1476a332978bSJason Molenda 
1477b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
1478*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetNumExtendedBacktraceTypes);
1479*baf5664fSJonas Devlieghere 
14808c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1481b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
14828c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
148395d005c7SJason Molenda     return runtime->GetExtendedBacktraceTypes().size();
14848c71337aSJason Molenda   }
14858c71337aSJason Molenda   return 0;
14868c71337aSJason Molenda }
14878c71337aSJason Molenda 
1488b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
1489*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const char *, SBProcess, GetExtendedBacktraceTypeAtIndex,
1490*baf5664fSJonas Devlieghere                      (uint32_t), idx);
1491*baf5664fSJonas Devlieghere 
14928c71337aSJason Molenda   ProcessSP process_sp(GetSP());
1493b9c1b51eSKate Stone   if (process_sp && process_sp->GetSystemRuntime()) {
14948c71337aSJason Molenda     SystemRuntime *runtime = process_sp->GetSystemRuntime();
1495b9c1b51eSKate Stone     const std::vector<ConstString> &names =
1496b9c1b51eSKate Stone         runtime->GetExtendedBacktraceTypes();
1497b9c1b51eSKate Stone     if (idx < names.size()) {
14988c71337aSJason Molenda       return names[idx].AsCString();
1499b9c1b51eSKate Stone     } else {
15008c71337aSJason Molenda       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
15018c71337aSJason Molenda       if (log)
1502b9c1b51eSKate Stone         log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => "
1503b9c1b51eSKate Stone                     "error: requested extended backtrace name out of bounds",
1504324a1036SSaleem Abdulrasool                     static_cast<void *>(process_sp.get()));
15058c71337aSJason Molenda     }
15068c71337aSJason Molenda   }
15078c71337aSJason Molenda   return NULL;
15088c71337aSJason Molenda }
1509a51ea382SKuba Brecka 
1510b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1511*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadCollection, SBProcess, GetHistoryThreads,
1512*baf5664fSJonas Devlieghere                      (lldb::addr_t), addr);
1513*baf5664fSJonas Devlieghere 
1514a51ea382SKuba Brecka   ProcessSP process_sp(GetSP());
1515a51ea382SKuba Brecka   SBThreadCollection threads;
1516b9c1b51eSKate Stone   if (process_sp) {
1517a51ea382SKuba Brecka     threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1518a51ea382SKuba Brecka   }
1519*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(threads);
1520a51ea382SKuba Brecka }
152163927548SKuba Brecka 
1522b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent(
1523b9c1b51eSKate Stone     InstrumentationRuntimeType type) {
1524*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBProcess, IsInstrumentationRuntimePresent,
1525*baf5664fSJonas Devlieghere                      (lldb::InstrumentationRuntimeType), type);
1526*baf5664fSJonas Devlieghere 
152763927548SKuba Brecka   ProcessSP process_sp(GetSP());
152863927548SKuba Brecka   if (!process_sp)
152963927548SKuba Brecka     return false;
153063927548SKuba Brecka 
1531b9c1b51eSKate Stone   InstrumentationRuntimeSP runtime_sp =
1532b9c1b51eSKate Stone       process_sp->GetInstrumentationRuntime(type);
153363927548SKuba Brecka 
153463927548SKuba Brecka   if (!runtime_sp.get())
153563927548SKuba Brecka     return false;
153663927548SKuba Brecka 
153763927548SKuba Brecka   return runtime_sp->IsActive();
153863927548SKuba Brecka }
1539f7d1893fSAdrian McCarthy 
1540b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) {
1541*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBProcess, SaveCore, (const char *),
1542*baf5664fSJonas Devlieghere                      file_name);
1543*baf5664fSJonas Devlieghere 
1544f7d1893fSAdrian McCarthy   lldb::SBError error;
1545f7d1893fSAdrian McCarthy   ProcessSP process_sp(GetSP());
1546b9c1b51eSKate Stone   if (!process_sp) {
1547f7d1893fSAdrian McCarthy     error.SetErrorString("SBProcess is invalid");
1548*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(error);
1549f7d1893fSAdrian McCarthy   }
1550f7d1893fSAdrian McCarthy 
1551b9c1b51eSKate Stone   std::lock_guard<std::recursive_mutex> guard(
1552b9c1b51eSKate Stone       process_sp->GetTarget().GetAPIMutex());
1553f7d1893fSAdrian McCarthy 
1554b9c1b51eSKate Stone   if (process_sp->GetState() != eStateStopped) {
1555f7d1893fSAdrian McCarthy     error.SetErrorString("the process is not stopped");
1556*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(error);
1557f7d1893fSAdrian McCarthy   }
1558f7d1893fSAdrian McCarthy 
15598f3be7a3SJonas Devlieghere   FileSpec core_file(file_name);
1560f7d1893fSAdrian McCarthy   error.ref() = PluginManager::SaveCore(process_sp, core_file);
1561*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
1562f7d1893fSAdrian McCarthy }
156326036843SHoward Hellyer 
156426036843SHoward Hellyer lldb::SBError
1565b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1566b9c1b51eSKate Stone                                SBMemoryRegionInfo &sb_region_info) {
1567*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBProcess, GetMemoryRegionInfo,
1568*baf5664fSJonas Devlieghere                      (lldb::addr_t, lldb::SBMemoryRegionInfo &), load_addr,
1569*baf5664fSJonas Devlieghere                      sb_region_info);
1570*baf5664fSJonas Devlieghere 
157126036843SHoward Hellyer   lldb::SBError sb_error;
157226036843SHoward Hellyer   ProcessSP process_sp(GetSP());
1573b9c1b51eSKate Stone   if (process_sp) {
157426036843SHoward Hellyer     Process::StopLocker stop_locker;
1575b9c1b51eSKate Stone     if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1576b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
1577b9c1b51eSKate Stone           process_sp->GetTarget().GetAPIMutex());
157836788bbbSTatyana Krasnukha 
1579b9c1b51eSKate Stone       sb_error.ref() =
158036788bbbSTatyana Krasnukha           process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref());
1581b9c1b51eSKate Stone     } else {
158226036843SHoward Hellyer       Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
158326036843SHoward Hellyer       if (log)
1584b9c1b51eSKate Stone         log->Printf(
1585b9c1b51eSKate Stone             "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
158626036843SHoward Hellyer             static_cast<void *>(process_sp.get()));
158726036843SHoward Hellyer       sb_error.SetErrorString("process is running");
158826036843SHoward Hellyer     }
1589b9c1b51eSKate Stone   } else {
159026036843SHoward Hellyer     sb_error.SetErrorString("SBProcess is invalid");
159126036843SHoward Hellyer   }
1592*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
159326036843SHoward Hellyer }
159426036843SHoward Hellyer 
1595b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
1596*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBMemoryRegionInfoList, SBProcess,
1597*baf5664fSJonas Devlieghere                              GetMemoryRegions);
1598*baf5664fSJonas Devlieghere 
159926036843SHoward Hellyer   lldb::SBMemoryRegionInfoList sb_region_list;
160036788bbbSTatyana Krasnukha 
160126036843SHoward Hellyer   ProcessSP process_sp(GetSP());
160226036843SHoward Hellyer   Process::StopLocker stop_locker;
160336788bbbSTatyana Krasnukha   if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) {
1604b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
1605b9c1b51eSKate Stone         process_sp->GetTarget().GetAPIMutex());
160636788bbbSTatyana Krasnukha 
160736788bbbSTatyana Krasnukha     process_sp->GetMemoryRegions(sb_region_list.ref());
1608b9c1b51eSKate Stone   } else {
160926036843SHoward Hellyer     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
161026036843SHoward Hellyer     if (log)
1611b9c1b51eSKate Stone       log->Printf(
1612b9c1b51eSKate Stone           "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
161326036843SHoward Hellyer           static_cast<void *>(process_sp.get()));
161426036843SHoward Hellyer   }
161536788bbbSTatyana Krasnukha 
1616*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_region_list);
161726036843SHoward Hellyer }
1618141a6263SVadim Macagon 
1619141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() {
1620*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBProcessInfo, SBProcess, GetProcessInfo);
1621*baf5664fSJonas Devlieghere 
1622141a6263SVadim Macagon   lldb::SBProcessInfo sb_proc_info;
1623141a6263SVadim Macagon   ProcessSP process_sp(GetSP());
1624141a6263SVadim Macagon   ProcessInstanceInfo proc_info;
1625141a6263SVadim Macagon   if (process_sp && process_sp->GetProcessInfo(proc_info)) {
1626141a6263SVadim Macagon     sb_proc_info.SetProcessInfo(proc_info);
1627141a6263SVadim Macagon   }
1628*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_proc_info);
1629141a6263SVadim Macagon }
1630