130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1330fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1430fdc8d8SChris Lattner 1540af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 165d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 17ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 1830fdc8d8SChris Lattner #include "lldb/Core/State.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 236611103cSGreg Clayton #include "lldb/Target/Target.h" 246611103cSGreg Clayton #include "lldb/Target/Thread.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner // Project includes 2730fdc8d8SChris Lattner 284c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 294c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 304c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 314c5de699SEli Friedman #include "lldb/API/SBEvent.h" 324c5de699SEli Friedman #include "lldb/API/SBThread.h" 33dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 344c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3530fdc8d8SChris Lattner 3630fdc8d8SChris Lattner using namespace lldb; 3730fdc8d8SChris Lattner using namespace lldb_private; 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner SBProcess::SBProcess () : 426611103cSGreg Clayton m_opaque_sp() 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner //---------------------------------------------------------------------- 4830fdc8d8SChris Lattner // SBProcess constructor 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 526611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 586611103cSGreg Clayton m_opaque_sp (process_sp) 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 62efabb123SGreg Clayton const SBProcess& 63efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 64efabb123SGreg Clayton { 65efabb123SGreg Clayton if (this != &rhs) 66efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 67efabb123SGreg Clayton return *this; 68efabb123SGreg Clayton } 69efabb123SGreg Clayton 7030fdc8d8SChris Lattner //---------------------------------------------------------------------- 7130fdc8d8SChris Lattner // Destructor 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner SBProcess::~SBProcess() 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 77*b9556accSGreg Clayton lldb::ProcessSP 78*b9556accSGreg Clayton SBProcess::GetSP() const 79*b9556accSGreg Clayton { 80*b9556accSGreg Clayton return m_opaque_sp; 81*b9556accSGreg Clayton } 82*b9556accSGreg Clayton 8330fdc8d8SChris Lattner void 84*b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 8530fdc8d8SChris Lattner { 866611103cSGreg Clayton m_opaque_sp = process_sp; 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 8930fdc8d8SChris Lattner void 9030fdc8d8SChris Lattner SBProcess::Clear () 9130fdc8d8SChris Lattner { 926611103cSGreg Clayton m_opaque_sp.reset(); 9330fdc8d8SChris Lattner } 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner bool 9730fdc8d8SChris Lattner SBProcess::IsValid() const 9830fdc8d8SChris Lattner { 996611103cSGreg Clayton return m_opaque_sp.get() != NULL; 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 1029631aae2SJames McIlree bool 1039631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1049631aae2SJames McIlree char const **envp, 1059631aae2SJames McIlree const char *stdin_path, 1069631aae2SJames McIlree const char *stdout_path, 1079631aae2SJames McIlree const char *stderr_path, 1089631aae2SJames McIlree const char *working_directory, 1099631aae2SJames McIlree uint32_t launch_flags, 1109631aae2SJames McIlree bool stop_at_entry, 1119631aae2SJames McIlree lldb::SBError& error) 1129631aae2SJames McIlree { 1139631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1149631aae2SJames McIlree if (log) { 1159631aae2SJames McIlree log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...", 1169631aae2SJames McIlree m_opaque_sp.get(), 1179631aae2SJames McIlree argv, 1189631aae2SJames McIlree envp, 1199631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1209631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1219631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1229631aae2SJames McIlree working_directory ? working_directory : "NULL", 1239631aae2SJames McIlree launch_flags, 1249631aae2SJames McIlree stop_at_entry, 1259631aae2SJames McIlree error.get()); 1269631aae2SJames McIlree } 1279631aae2SJames McIlree 1289631aae2SJames McIlree if (m_opaque_sp) 1299631aae2SJames McIlree { 1309631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1319631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1329631aae2SJames McIlree { 133982c9762SGreg Clayton if (stop_at_entry) 134982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 135982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 136982c9762SGreg Clayton stdout_path, 137982c9762SGreg Clayton stderr_path, 138982c9762SGreg Clayton working_directory, 139982c9762SGreg Clayton launch_flags); 140982c9762SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 141982c9762SGreg Clayton if (exe_module) 142982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 143982c9762SGreg Clayton if (argv) 144982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 145982c9762SGreg Clayton if (envp) 146982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 147982c9762SGreg Clayton error.SetError (m_opaque_sp->Launch (launch_info)); 1489631aae2SJames McIlree } 1499631aae2SJames McIlree else 1509631aae2SJames McIlree { 1519631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1529631aae2SJames McIlree } 1539631aae2SJames McIlree } 1549631aae2SJames McIlree else 1559631aae2SJames McIlree { 1569631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1579631aae2SJames McIlree } 1589631aae2SJames McIlree 1599631aae2SJames McIlree if (log) { 1609631aae2SJames McIlree SBStream sstr; 1619631aae2SJames McIlree error.GetDescription (sstr); 162930e3ad5SJohnny Chen log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData()); 1639631aae2SJames McIlree } 1649631aae2SJames McIlree 1659631aae2SJames McIlree return error.Success(); 1669631aae2SJames McIlree } 1679631aae2SJames McIlree 1689631aae2SJames McIlree bool 1699631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1709631aae2SJames McIlree { 1719631aae2SJames McIlree if (m_opaque_sp) 1729631aae2SJames McIlree { 1739631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1749631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1759631aae2SJames McIlree { 176144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 177144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 178144f3a9cSGreg Clayton error.SetError (m_opaque_sp->Attach (attach_info)); 1799631aae2SJames McIlree } 1809631aae2SJames McIlree else 1819631aae2SJames McIlree { 1829631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1839631aae2SJames McIlree } 1849631aae2SJames McIlree } 1859631aae2SJames McIlree else 1869631aae2SJames McIlree { 1879631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1889631aae2SJames McIlree } 1899631aae2SJames McIlree 1909631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1919631aae2SJames McIlree if (log) { 1929631aae2SJames McIlree SBStream sstr; 1939631aae2SJames McIlree error.GetDescription (sstr); 19461e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", m_opaque_sp.get(), pid, error.get(), sstr.GetData()); 1959631aae2SJames McIlree } 1969631aae2SJames McIlree 1979631aae2SJames McIlree return error.Success(); 1989631aae2SJames McIlree } 1999631aae2SJames McIlree 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner uint32_t 20230fdc8d8SChris Lattner SBProcess::GetNumThreads () 20330fdc8d8SChris Lattner { 2042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 205ceb6b139SCaroline Tice 206ceb6b139SCaroline Tice uint32_t num_threads = 0; 2076611103cSGreg Clayton if (m_opaque_sp) 20830fdc8d8SChris Lattner { 209af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 21030fdc8d8SChris Lattner const bool can_update = true; 211ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 21230fdc8d8SChris Lattner } 213ceb6b139SCaroline Tice 214ceb6b139SCaroline Tice if (log) 21593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 216ceb6b139SCaroline Tice 217ceb6b139SCaroline Tice return num_threads; 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner 22030fdc8d8SChris Lattner SBThread 2212976d00aSJim Ingham SBProcess::GetSelectedThread () const 22230fdc8d8SChris Lattner { 2232d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 224ceb6b139SCaroline Tice 22530fdc8d8SChris Lattner SBThread sb_thread; 22617a6ad05SGreg Clayton ThreadSP thread_sp; 2276611103cSGreg Clayton if (m_opaque_sp) 228af67cecdSGreg Clayton { 229af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 23017a6ad05SGreg Clayton thread_sp = m_opaque_sp->GetThreadList().GetSelectedThread(); 23117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 232af67cecdSGreg Clayton } 233ceb6b139SCaroline Tice 234ceb6b139SCaroline Tice if (log) 235ceb6b139SCaroline Tice { 23617a6ad05SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), thread_sp.get()); 237ceb6b139SCaroline Tice } 238ceb6b139SCaroline Tice 23930fdc8d8SChris Lattner return sb_thread; 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner SBTarget 24330fdc8d8SChris Lattner SBProcess::GetTarget() const 24430fdc8d8SChris Lattner { 2452d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 246ceb6b139SCaroline Tice 24730fdc8d8SChris Lattner SBTarget sb_target; 248*b9556accSGreg Clayton TargetSP target_sp; 2496611103cSGreg Clayton if (m_opaque_sp) 250*b9556accSGreg Clayton { 251*b9556accSGreg Clayton target_sp = m_opaque_sp->GetTarget().shared_from_this(); 252*b9556accSGreg Clayton sb_target.SetSP (target_sp); 253*b9556accSGreg Clayton } 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice if (log) 256*b9556accSGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), target_sp.get()); 257ceb6b139SCaroline Tice 25830fdc8d8SChris Lattner return sb_target; 25930fdc8d8SChris Lattner } 26030fdc8d8SChris Lattner 26130fdc8d8SChris Lattner 26230fdc8d8SChris Lattner size_t 26330fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 26430fdc8d8SChris Lattner { 2652d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 266ceb6b139SCaroline Tice 267ceb6b139SCaroline Tice size_t ret_val = 0; 268af67cecdSGreg Clayton if (m_opaque_sp) 26930fdc8d8SChris Lattner { 27030fdc8d8SChris Lattner Error error; 271ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 27230fdc8d8SChris Lattner } 273ceb6b139SCaroline Tice 274ceb6b139SCaroline Tice if (log) 275fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 27693aa84e8SGreg Clayton m_opaque_sp.get(), 27793aa84e8SGreg Clayton src, 27893aa84e8SGreg Clayton (uint32_t) src_len, 27993aa84e8SGreg Clayton ret_val); 280ceb6b139SCaroline Tice 281ceb6b139SCaroline Tice return ret_val; 28230fdc8d8SChris Lattner } 28330fdc8d8SChris Lattner 28430fdc8d8SChris Lattner size_t 28530fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 28630fdc8d8SChris Lattner { 287cfd1acedSGreg Clayton size_t bytes_read = 0; 288af67cecdSGreg Clayton if (m_opaque_sp) 28930fdc8d8SChris Lattner { 29030fdc8d8SChris Lattner Error error; 291cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 29230fdc8d8SChris Lattner } 293ceb6b139SCaroline Tice 2942d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 295ceb6b139SCaroline Tice if (log) 296cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 297cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 298ceb6b139SCaroline Tice 299cfd1acedSGreg Clayton return bytes_read; 30030fdc8d8SChris Lattner } 30130fdc8d8SChris Lattner 30230fdc8d8SChris Lattner size_t 30330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 30430fdc8d8SChris Lattner { 305cfd1acedSGreg Clayton size_t bytes_read = 0; 306af67cecdSGreg Clayton if (m_opaque_sp) 30730fdc8d8SChris Lattner { 30830fdc8d8SChris Lattner Error error; 309cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 31030fdc8d8SChris Lattner } 311ceb6b139SCaroline Tice 3122d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 313ceb6b139SCaroline Tice if (log) 314cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 315cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 316ceb6b139SCaroline Tice 317cfd1acedSGreg Clayton return bytes_read; 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner 32030fdc8d8SChris Lattner void 3212976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 32230fdc8d8SChris Lattner { 32330fdc8d8SChris Lattner if (out == NULL) 32430fdc8d8SChris Lattner return; 32530fdc8d8SChris Lattner 326af67cecdSGreg Clayton if (m_opaque_sp) 32730fdc8d8SChris Lattner { 32830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 32930fdc8d8SChris Lattner char message[1024]; 33030fdc8d8SChris Lattner int message_len = ::snprintf (message, 33130fdc8d8SChris Lattner sizeof (message), 33281c22f61SGreg Clayton "Process %llu %s\n", 3336611103cSGreg Clayton m_opaque_sp->GetID(), 33430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 33530fdc8d8SChris Lattner 33630fdc8d8SChris Lattner if (message_len > 0) 33730fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 33830fdc8d8SChris Lattner } 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner 34130fdc8d8SChris Lattner void 3422976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 34330fdc8d8SChris Lattner { 344af67cecdSGreg Clayton if (m_opaque_sp) 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 34730fdc8d8SChris Lattner char message[1024]; 34830fdc8d8SChris Lattner ::snprintf (message, 34930fdc8d8SChris Lattner sizeof (message), 35081c22f61SGreg Clayton "Process %llu %s\n", 3516611103cSGreg Clayton m_opaque_sp->GetID(), 35230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 35330fdc8d8SChris Lattner 35430fdc8d8SChris Lattner result.AppendMessage (message); 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner 35830fdc8d8SChris Lattner bool 3592976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 36030fdc8d8SChris Lattner { 361af67cecdSGreg Clayton if (m_opaque_sp) 362af67cecdSGreg Clayton { 363af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3642976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 365af67cecdSGreg Clayton } 36630fdc8d8SChris Lattner return false; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner bool 3702976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 37130fdc8d8SChris Lattner { 3722d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 373ceb6b139SCaroline Tice 374ceb6b139SCaroline Tice bool ret_val = false; 375af67cecdSGreg Clayton if (m_opaque_sp) 376af67cecdSGreg Clayton { 377af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 378ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 379af67cecdSGreg Clayton } 380ceb6b139SCaroline Tice 381ceb6b139SCaroline Tice if (log) 382cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 38393aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 384ceb6b139SCaroline Tice 385ceb6b139SCaroline Tice return ret_val; 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner SBThread 38930fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 39030fdc8d8SChris Lattner { 3912d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 392ceb6b139SCaroline Tice 39317a6ad05SGreg Clayton SBThread sb_thread; 39417a6ad05SGreg Clayton ThreadSP thread_sp; 3956611103cSGreg Clayton if (m_opaque_sp) 396af67cecdSGreg Clayton { 397af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 39817a6ad05SGreg Clayton thread_sp = m_opaque_sp->GetThreadList().GetThreadAtIndex(index); 39917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 400af67cecdSGreg Clayton } 401ceb6b139SCaroline Tice 402ceb6b139SCaroline Tice if (log) 403ceb6b139SCaroline Tice { 40493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 40517a6ad05SGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread_sp.get()); 406ceb6b139SCaroline Tice } 407ceb6b139SCaroline Tice 40817a6ad05SGreg Clayton return sb_thread; 40930fdc8d8SChris Lattner } 41030fdc8d8SChris Lattner 41130fdc8d8SChris Lattner StateType 41230fdc8d8SChris Lattner SBProcess::GetState () 41330fdc8d8SChris Lattner { 414ceb6b139SCaroline Tice 415ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 416af67cecdSGreg Clayton if (m_opaque_sp) 417af67cecdSGreg Clayton { 418af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 419ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 420af67cecdSGreg Clayton } 421ceb6b139SCaroline Tice 4222d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 423ceb6b139SCaroline Tice if (log) 424cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 42593aa84e8SGreg Clayton m_opaque_sp.get(), 426750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 427ceb6b139SCaroline Tice 428ceb6b139SCaroline Tice return ret_val; 42930fdc8d8SChris Lattner } 43030fdc8d8SChris Lattner 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner int 43330fdc8d8SChris Lattner SBProcess::GetExitStatus () 43430fdc8d8SChris Lattner { 4354838131bSGreg Clayton int exit_status = 0; 4364838131bSGreg Clayton if (m_opaque_sp) 437af67cecdSGreg Clayton { 438af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4394838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 440af67cecdSGreg Clayton } 4412d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4424838131bSGreg Clayton if (log) 4434838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 4444838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 4454838131bSGreg Clayton 4464838131bSGreg Clayton return exit_status; 44730fdc8d8SChris Lattner } 44830fdc8d8SChris Lattner 44930fdc8d8SChris Lattner const char * 45030fdc8d8SChris Lattner SBProcess::GetExitDescription () 45130fdc8d8SChris Lattner { 4524838131bSGreg Clayton const char *exit_desc = NULL; 453af67cecdSGreg Clayton if (m_opaque_sp) 454af67cecdSGreg Clayton { 455af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4564838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 457af67cecdSGreg Clayton } 4582d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4594838131bSGreg Clayton if (log) 4604838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 4614838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 4624838131bSGreg Clayton return exit_desc; 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner 46530fdc8d8SChris Lattner lldb::pid_t 46630fdc8d8SChris Lattner SBProcess::GetProcessID () 46730fdc8d8SChris Lattner { 468ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 4696611103cSGreg Clayton if (m_opaque_sp) 470ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 471ceb6b139SCaroline Tice 4722d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 473ceb6b139SCaroline Tice if (log) 47461e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", m_opaque_sp.get(), ret_val); 475ceb6b139SCaroline Tice 476ceb6b139SCaroline Tice return ret_val; 47730fdc8d8SChris Lattner } 47830fdc8d8SChris Lattner 479cf386e24SJohnny Chen ByteOrder 480cf386e24SJohnny Chen SBProcess::GetByteOrder () const 481cf386e24SJohnny Chen { 482cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 483cf386e24SJohnny Chen if (m_opaque_sp) 484cf386e24SJohnny Chen byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder(); 485cf386e24SJohnny Chen 486cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 487cf386e24SJohnny Chen if (log) 488cf386e24SJohnny Chen log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder); 489cf386e24SJohnny Chen 490cf386e24SJohnny Chen return byteOrder; 491cf386e24SJohnny Chen } 492cf386e24SJohnny Chen 49330fdc8d8SChris Lattner uint32_t 49430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 49530fdc8d8SChris Lattner { 496ceb6b139SCaroline Tice uint32_t size = 0; 4976611103cSGreg Clayton if (m_opaque_sp) 498514487e8SGreg Clayton size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 499ceb6b139SCaroline Tice 5002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 501ceb6b139SCaroline Tice if (log) 50293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 503ceb6b139SCaroline Tice 504ceb6b139SCaroline Tice return size; 50530fdc8d8SChris Lattner } 50630fdc8d8SChris Lattner 50730fdc8d8SChris Lattner SBError 50830fdc8d8SChris Lattner SBProcess::Continue () 50930fdc8d8SChris Lattner { 5102d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5114838131bSGreg Clayton if (log) 5124838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 513ceb6b139SCaroline Tice 51430fdc8d8SChris Lattner SBError sb_error; 5150c74e78dSGreg Clayton if (m_opaque_sp) 5165d5028b5SGreg Clayton { 5170c74e78dSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5180c74e78dSGreg Clayton 5195d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 5205d5028b5SGreg Clayton if (error.Success()) 5215d5028b5SGreg Clayton { 5225d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5234838131bSGreg Clayton { 5244838131bSGreg Clayton if (log) 5254838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 5265d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 5275d5028b5SGreg Clayton } 5284838131bSGreg Clayton } 5295d5028b5SGreg Clayton sb_error.SetError(error); 5305d5028b5SGreg Clayton } 53130fdc8d8SChris Lattner else 53230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 53330fdc8d8SChris Lattner 534ceb6b139SCaroline Tice if (log) 535ceb6b139SCaroline Tice { 536ceb6b139SCaroline Tice SBStream sstr; 537ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 53893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 539ceb6b139SCaroline Tice } 540ceb6b139SCaroline Tice 54130fdc8d8SChris Lattner return sb_error; 54230fdc8d8SChris Lattner } 54330fdc8d8SChris Lattner 54430fdc8d8SChris Lattner 54530fdc8d8SChris Lattner SBError 54630fdc8d8SChris Lattner SBProcess::Destroy () 54730fdc8d8SChris Lattner { 54830fdc8d8SChris Lattner SBError sb_error; 5496611103cSGreg Clayton if (m_opaque_sp) 5506779606aSGreg Clayton { 5516779606aSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5526611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 5536779606aSGreg Clayton } 55430fdc8d8SChris Lattner else 55530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 55630fdc8d8SChris Lattner 5572d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5584838131bSGreg Clayton if (log) 5594838131bSGreg Clayton { 5604838131bSGreg Clayton SBStream sstr; 5614838131bSGreg Clayton sb_error.GetDescription (sstr); 5626779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 5636779606aSGreg Clayton m_opaque_sp.get(), 5646779606aSGreg Clayton sb_error.get(), 5656779606aSGreg Clayton sstr.GetData()); 5664838131bSGreg Clayton } 5674838131bSGreg Clayton 56830fdc8d8SChris Lattner return sb_error; 56930fdc8d8SChris Lattner } 57030fdc8d8SChris Lattner 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner SBError 57330fdc8d8SChris Lattner SBProcess::Stop () 57430fdc8d8SChris Lattner { 57530fdc8d8SChris Lattner SBError sb_error; 5760c74e78dSGreg Clayton if (m_opaque_sp) 577af67cecdSGreg Clayton { 578af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5796611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 580af67cecdSGreg Clayton } 58130fdc8d8SChris Lattner else 58230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 583ceb6b139SCaroline Tice 5842d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 585ceb6b139SCaroline Tice if (log) 586ceb6b139SCaroline Tice { 587ceb6b139SCaroline Tice SBStream sstr; 588ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 58993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 59093aa84e8SGreg Clayton m_opaque_sp.get(), 59193aa84e8SGreg Clayton sb_error.get(), 592750cd175SCaroline Tice sstr.GetData()); 593ceb6b139SCaroline Tice } 594ceb6b139SCaroline Tice 59530fdc8d8SChris Lattner return sb_error; 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 59830fdc8d8SChris Lattner SBError 59930fdc8d8SChris Lattner SBProcess::Kill () 60030fdc8d8SChris Lattner { 60130fdc8d8SChris Lattner SBError sb_error; 6026611103cSGreg Clayton if (m_opaque_sp) 603af67cecdSGreg Clayton { 604af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6056611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 606af67cecdSGreg Clayton } 60730fdc8d8SChris Lattner else 60830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 609ceb6b139SCaroline Tice 6102d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 611ceb6b139SCaroline Tice if (log) 612ceb6b139SCaroline Tice { 613ceb6b139SCaroline Tice SBStream sstr; 614ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 61593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 61693aa84e8SGreg Clayton m_opaque_sp.get(), 61793aa84e8SGreg Clayton sb_error.get(), 618750cd175SCaroline Tice sstr.GetData()); 619ceb6b139SCaroline Tice } 620ceb6b139SCaroline Tice 62130fdc8d8SChris Lattner return sb_error; 62230fdc8d8SChris Lattner } 62330fdc8d8SChris Lattner 62430fdc8d8SChris Lattner SBError 62530fdc8d8SChris Lattner SBProcess::Detach () 62630fdc8d8SChris Lattner { 62730fdc8d8SChris Lattner SBError sb_error; 6286611103cSGreg Clayton if (m_opaque_sp) 629af67cecdSGreg Clayton { 630af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6316611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 632af67cecdSGreg Clayton } 63330fdc8d8SChris Lattner else 63430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 63530fdc8d8SChris Lattner 63630fdc8d8SChris Lattner return sb_error; 63730fdc8d8SChris Lattner } 63830fdc8d8SChris Lattner 63930fdc8d8SChris Lattner SBError 6404838131bSGreg Clayton SBProcess::Signal (int signo) 64130fdc8d8SChris Lattner { 64230fdc8d8SChris Lattner SBError sb_error; 6436611103cSGreg Clayton if (m_opaque_sp) 644af67cecdSGreg Clayton { 645af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6464838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 647af67cecdSGreg Clayton } 64830fdc8d8SChris Lattner else 64930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 6502d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6514838131bSGreg Clayton if (log) 6524838131bSGreg Clayton { 6534838131bSGreg Clayton SBStream sstr; 6544838131bSGreg Clayton sb_error.GetDescription (sstr); 6554838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 6564838131bSGreg Clayton m_opaque_sp.get(), 6574838131bSGreg Clayton signo, 6584838131bSGreg Clayton sb_error.get(), 6594838131bSGreg Clayton sstr.GetData()); 6604838131bSGreg Clayton } 66130fdc8d8SChris Lattner return sb_error; 66230fdc8d8SChris Lattner } 66330fdc8d8SChris Lattner 66430fdc8d8SChris Lattner SBThread 6654838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 66630fdc8d8SChris Lattner { 6674838131bSGreg Clayton SBThread sb_thread; 66817a6ad05SGreg Clayton ThreadSP thread_sp; 6696611103cSGreg Clayton if (m_opaque_sp) 670af67cecdSGreg Clayton { 671af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 67217a6ad05SGreg Clayton thread_sp = m_opaque_sp->GetThreadList().FindThreadByID (tid); 67317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 674af67cecdSGreg Clayton } 6754838131bSGreg Clayton 6762d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6774838131bSGreg Clayton if (log) 6784838131bSGreg Clayton { 67961e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 6804838131bSGreg Clayton m_opaque_sp.get(), 6814838131bSGreg Clayton tid, 68217a6ad05SGreg Clayton thread_sp.get()); 6834838131bSGreg Clayton } 6844838131bSGreg Clayton 6854838131bSGreg Clayton return sb_thread; 68630fdc8d8SChris Lattner } 68730fdc8d8SChris Lattner 68830fdc8d8SChris Lattner StateType 68930fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 69030fdc8d8SChris Lattner { 6912d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 692ceb6b139SCaroline Tice 693ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 694ceb6b139SCaroline Tice 695ceb6b139SCaroline Tice if (log) 696cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 697750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 698ceb6b139SCaroline Tice 699ceb6b139SCaroline Tice return ret_val; 70030fdc8d8SChris Lattner } 70130fdc8d8SChris Lattner 70230fdc8d8SChris Lattner bool 70330fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 70430fdc8d8SChris Lattner { 7056611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 70630fdc8d8SChris Lattner } 70730fdc8d8SChris Lattner 70830fdc8d8SChris Lattner SBProcess 70930fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 71030fdc8d8SChris Lattner { 7116611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 71230fdc8d8SChris Lattner return process; 71330fdc8d8SChris Lattner } 71430fdc8d8SChris Lattner 71530fdc8d8SChris Lattner 71630fdc8d8SChris Lattner SBBroadcaster 71730fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 71830fdc8d8SChris Lattner { 7192d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 720ceb6b139SCaroline Tice 7216611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 722ceb6b139SCaroline Tice 723ceb6b139SCaroline Tice if (log) 72493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 725750cd175SCaroline Tice broadcaster.get()); 726ceb6b139SCaroline Tice 72730fdc8d8SChris Lattner return broadcaster; 72830fdc8d8SChris Lattner } 72930fdc8d8SChris Lattner 73030fdc8d8SChris Lattner size_t 73130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 73230fdc8d8SChris Lattner { 7332d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 734ceb6b139SCaroline Tice 73530fdc8d8SChris Lattner size_t bytes_read = 0; 73630fdc8d8SChris Lattner 7374838131bSGreg Clayton if (log) 7384838131bSGreg Clayton { 7394838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 7404838131bSGreg Clayton m_opaque_sp.get(), 7414838131bSGreg Clayton addr, 7424838131bSGreg Clayton dst, 743c91d804aSGreg Clayton dst_len, 7444838131bSGreg Clayton sb_error.get()); 7454838131bSGreg Clayton } 7464838131bSGreg Clayton 747af67cecdSGreg Clayton if (m_opaque_sp) 74830fdc8d8SChris Lattner { 74930fdc8d8SChris Lattner Error error; 750af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7516611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 75230fdc8d8SChris Lattner sb_error.SetError (error); 75330fdc8d8SChris Lattner } 75430fdc8d8SChris Lattner else 75530fdc8d8SChris Lattner { 75630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 75730fdc8d8SChris Lattner } 75830fdc8d8SChris Lattner 759ceb6b139SCaroline Tice if (log) 76093aa84e8SGreg Clayton { 76193aa84e8SGreg Clayton SBStream sstr; 76293aa84e8SGreg Clayton sb_error.GetDescription (sstr); 763c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu", 76493aa84e8SGreg Clayton m_opaque_sp.get(), 76593aa84e8SGreg Clayton addr, 76693aa84e8SGreg Clayton dst, 767c91d804aSGreg Clayton dst_len, 76893aa84e8SGreg Clayton sb_error.get(), 76993aa84e8SGreg Clayton sstr.GetData(), 770c91d804aSGreg Clayton bytes_read); 77193aa84e8SGreg Clayton } 772ceb6b139SCaroline Tice 77330fdc8d8SChris Lattner return bytes_read; 77430fdc8d8SChris Lattner } 77530fdc8d8SChris Lattner 77630fdc8d8SChris Lattner size_t 777e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 778e91b7957SGreg Clayton { 779e91b7957SGreg Clayton size_t bytes_read = 0; 780e91b7957SGreg Clayton if (m_opaque_sp) 781e91b7957SGreg Clayton { 782e91b7957SGreg Clayton Error error; 783e91b7957SGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 784e91b7957SGreg Clayton bytes_read = m_opaque_sp->ReadCStringFromMemory (addr, (char *)buf, size, error); 785e91b7957SGreg Clayton sb_error.SetError (error); 786e91b7957SGreg Clayton } 787e91b7957SGreg Clayton else 788e91b7957SGreg Clayton { 789e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 790e91b7957SGreg Clayton } 791e91b7957SGreg Clayton return bytes_read; 792e91b7957SGreg Clayton } 793e91b7957SGreg Clayton 794e91b7957SGreg Clayton uint64_t 795e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 796e91b7957SGreg Clayton { 797e91b7957SGreg Clayton if (m_opaque_sp) 798e91b7957SGreg Clayton { 799e91b7957SGreg Clayton Error error; 800e91b7957SGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 801e91b7957SGreg Clayton uint64_t value = m_opaque_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error); 802e91b7957SGreg Clayton sb_error.SetError (error); 803e91b7957SGreg Clayton return value; 804e91b7957SGreg Clayton } 805e91b7957SGreg Clayton else 806e91b7957SGreg Clayton { 807e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 808e91b7957SGreg Clayton } 809e91b7957SGreg Clayton return 0; 810e91b7957SGreg Clayton } 811e91b7957SGreg Clayton 812e91b7957SGreg Clayton lldb::addr_t 813e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 814e91b7957SGreg Clayton { 815e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 816e91b7957SGreg Clayton if (m_opaque_sp) 817e91b7957SGreg Clayton { 818e91b7957SGreg Clayton Error error; 819e91b7957SGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 820e91b7957SGreg Clayton ptr = m_opaque_sp->ReadPointerFromMemory (addr, error); 821e91b7957SGreg Clayton sb_error.SetError (error); 822e91b7957SGreg Clayton } 823e91b7957SGreg Clayton else 824e91b7957SGreg Clayton { 825e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 826e91b7957SGreg Clayton } 827e91b7957SGreg Clayton return ptr; 828e91b7957SGreg Clayton } 829e91b7957SGreg Clayton 830e91b7957SGreg Clayton size_t 83130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 83230fdc8d8SChris Lattner { 83330fdc8d8SChris Lattner size_t bytes_written = 0; 83430fdc8d8SChris Lattner 8352d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8364838131bSGreg Clayton if (log) 8374838131bSGreg Clayton { 8384838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 8394838131bSGreg Clayton m_opaque_sp.get(), 8404838131bSGreg Clayton addr, 8414838131bSGreg Clayton src, 842c91d804aSGreg Clayton src_len, 8434838131bSGreg Clayton sb_error.get()); 8444838131bSGreg Clayton } 8454838131bSGreg Clayton 846af67cecdSGreg Clayton if (m_opaque_sp) 84730fdc8d8SChris Lattner { 84830fdc8d8SChris Lattner Error error; 849af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 8506611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 85130fdc8d8SChris Lattner sb_error.SetError (error); 85230fdc8d8SChris Lattner } 85330fdc8d8SChris Lattner 8544838131bSGreg Clayton if (log) 8554838131bSGreg Clayton { 8564838131bSGreg Clayton SBStream sstr; 8574838131bSGreg Clayton sb_error.GetDescription (sstr); 858c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu", 8594838131bSGreg Clayton m_opaque_sp.get(), 8604838131bSGreg Clayton addr, 8614838131bSGreg Clayton src, 862c91d804aSGreg Clayton src_len, 8634838131bSGreg Clayton sb_error.get(), 8644838131bSGreg Clayton sstr.GetData(), 865c91d804aSGreg Clayton bytes_written); 8664838131bSGreg Clayton } 8674838131bSGreg Clayton 86830fdc8d8SChris Lattner return bytes_written; 86930fdc8d8SChris Lattner } 87030fdc8d8SChris Lattner 871dde9cff3SCaroline Tice bool 872dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 873dde9cff3SCaroline Tice { 874da7bc7d0SGreg Clayton Stream &strm = description.ref(); 875da7bc7d0SGreg Clayton 876dde9cff3SCaroline Tice if (m_opaque_sp) 877dde9cff3SCaroline Tice { 878dde9cff3SCaroline Tice char path[PATH_MAX]; 879dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 880aa149cbdSGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 8811d273166SGreg Clayton const char *exe_name = NULL; 8821d273166SGreg Clayton if (exe_module) 8831d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 8841d273166SGreg Clayton 885da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 8861d273166SGreg Clayton m_opaque_sp->GetID(), 887ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 8881d273166SGreg Clayton GetNumThreads(), 88905faeb71SGreg Clayton exe_name ? ", executable = " : "", 8901d273166SGreg Clayton exe_name ? exe_name : ""); 891dde9cff3SCaroline Tice } 892dde9cff3SCaroline Tice else 893da7bc7d0SGreg Clayton strm.PutCString ("No value"); 894dde9cff3SCaroline Tice 895dde9cff3SCaroline Tice return true; 896dde9cff3SCaroline Tice } 8978f343b09SGreg Clayton 8988f343b09SGreg Clayton uint32_t 8998f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 9008f343b09SGreg Clayton { 9018f343b09SGreg Clayton if (m_opaque_sp) 902af67cecdSGreg Clayton { 903af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 904c5f57830SGreg Clayton return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref()); 905af67cecdSGreg Clayton } 9068f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 9078f343b09SGreg Clayton } 9088f343b09SGreg Clayton 9098f343b09SGreg Clayton lldb::SBError 9108f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 9118f343b09SGreg Clayton { 9128f343b09SGreg Clayton lldb::SBError sb_error; 9138f343b09SGreg Clayton if (m_opaque_sp) 914af67cecdSGreg Clayton { 915af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 9168f343b09SGreg Clayton sb_error.SetError (m_opaque_sp->UnloadImage (image_token)); 917af67cecdSGreg Clayton } 9188f343b09SGreg Clayton else 9198f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 9208f343b09SGreg Clayton return sb_error; 9218f343b09SGreg Clayton } 922