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" 1630fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h" 1730fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h" 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/State.h" 2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 256611103cSGreg Clayton #include "lldb/Target/Target.h" 266611103cSGreg Clayton #include "lldb/Target/Thread.h" 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner // Project includes 2930fdc8d8SChris Lattner 304c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 314c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 324c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 334c5de699SEli Friedman #include "lldb/API/SBEvent.h" 344c5de699SEli Friedman #include "lldb/API/SBThread.h" 35dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 364c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner SBProcess::SBProcess () : 446611103cSGreg Clayton m_opaque_sp() 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner // SBProcess constructor 5130fdc8d8SChris Lattner //---------------------------------------------------------------------- 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 546611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 5530fdc8d8SChris Lattner { 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 606611103cSGreg Clayton m_opaque_sp (process_sp) 6130fdc8d8SChris Lattner { 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 64efabb123SGreg Clayton const SBProcess& 65efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 66efabb123SGreg Clayton { 67efabb123SGreg Clayton if (this != &rhs) 68efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 69efabb123SGreg Clayton return *this; 70efabb123SGreg Clayton } 71efabb123SGreg Clayton 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner // Destructor 7430fdc8d8SChris Lattner //---------------------------------------------------------------------- 7530fdc8d8SChris Lattner SBProcess::~SBProcess() 7630fdc8d8SChris Lattner { 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner void 8030fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton m_opaque_sp = process_sp; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8630fdc8d8SChris Lattner SBProcess::Clear () 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton m_opaque_sp.reset(); 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner bool 9330fdc8d8SChris Lattner SBProcess::IsValid() const 9430fdc8d8SChris Lattner { 956611103cSGreg Clayton return m_opaque_sp.get() != NULL; 9630fdc8d8SChris Lattner } 9730fdc8d8SChris Lattner 989631aae2SJames McIlree bool 999631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1009631aae2SJames McIlree char const **envp, 1019631aae2SJames McIlree const char *stdin_path, 1029631aae2SJames McIlree const char *stdout_path, 1039631aae2SJames McIlree const char *stderr_path, 1049631aae2SJames McIlree const char *working_directory, 1059631aae2SJames McIlree uint32_t launch_flags, 1069631aae2SJames McIlree bool stop_at_entry, 1079631aae2SJames McIlree lldb::SBError& error) 1089631aae2SJames McIlree { 1099631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1109631aae2SJames McIlree if (log) { 1119631aae2SJames 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))...", 1129631aae2SJames McIlree m_opaque_sp.get(), 1139631aae2SJames McIlree argv, 1149631aae2SJames McIlree envp, 1159631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1169631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1179631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1189631aae2SJames McIlree working_directory ? working_directory : "NULL", 1199631aae2SJames McIlree launch_flags, 1209631aae2SJames McIlree stop_at_entry, 1219631aae2SJames McIlree error.get()); 1229631aae2SJames McIlree } 1239631aae2SJames McIlree 1249631aae2SJames McIlree if (m_opaque_sp) 1259631aae2SJames McIlree { 1269631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1279631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1289631aae2SJames McIlree { 129982c9762SGreg Clayton if (stop_at_entry) 130982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 131982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 132982c9762SGreg Clayton stdout_path, 133982c9762SGreg Clayton stderr_path, 134982c9762SGreg Clayton working_directory, 135982c9762SGreg Clayton launch_flags); 136982c9762SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 137982c9762SGreg Clayton if (exe_module) 138982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 139982c9762SGreg Clayton if (argv) 140982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 141982c9762SGreg Clayton if (envp) 142982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 143982c9762SGreg Clayton error.SetError (m_opaque_sp->Launch (launch_info)); 1449631aae2SJames McIlree } 1459631aae2SJames McIlree else 1469631aae2SJames McIlree { 1479631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1489631aae2SJames McIlree } 1499631aae2SJames McIlree } 1509631aae2SJames McIlree else 1519631aae2SJames McIlree { 1529631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1539631aae2SJames McIlree } 1549631aae2SJames McIlree 1559631aae2SJames McIlree if (log) { 1569631aae2SJames McIlree SBStream sstr; 1579631aae2SJames McIlree error.GetDescription (sstr); 158930e3ad5SJohnny Chen log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData()); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree 1619631aae2SJames McIlree return error.Success(); 1629631aae2SJames McIlree } 1639631aae2SJames McIlree 1649631aae2SJames McIlree bool 1659631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1669631aae2SJames McIlree { 1679631aae2SJames McIlree if (m_opaque_sp) 1689631aae2SJames McIlree { 1699631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1709631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1719631aae2SJames McIlree { 172c9ed478aSGreg Clayton error.SetError (m_opaque_sp->Attach (pid, 0)); 1739631aae2SJames McIlree } 1749631aae2SJames McIlree else 1759631aae2SJames McIlree { 1769631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1779631aae2SJames McIlree } 1789631aae2SJames McIlree } 1799631aae2SJames McIlree else 1809631aae2SJames McIlree { 1819631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1829631aae2SJames McIlree } 1839631aae2SJames McIlree 1849631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1859631aae2SJames McIlree if (log) { 1869631aae2SJames McIlree SBStream sstr; 1879631aae2SJames McIlree error.GetDescription (sstr); 188930e3ad5SJohnny Chen log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%d) => SBError (%p): %s", m_opaque_sp.get(), pid, error.get(), sstr.GetData()); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree 1919631aae2SJames McIlree return error.Success(); 1929631aae2SJames McIlree } 1939631aae2SJames McIlree 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner uint32_t 19630fdc8d8SChris Lattner SBProcess::GetNumThreads () 19730fdc8d8SChris Lattner { 1982d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 199ceb6b139SCaroline Tice 200ceb6b139SCaroline Tice uint32_t num_threads = 0; 2016611103cSGreg Clayton if (m_opaque_sp) 20230fdc8d8SChris Lattner { 203af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 20430fdc8d8SChris Lattner const bool can_update = true; 205ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 20630fdc8d8SChris Lattner } 207ceb6b139SCaroline Tice 208ceb6b139SCaroline Tice if (log) 20993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 210ceb6b139SCaroline Tice 211ceb6b139SCaroline Tice return num_threads; 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 21430fdc8d8SChris Lattner SBThread 2152976d00aSJim Ingham SBProcess::GetSelectedThread () const 21630fdc8d8SChris Lattner { 2172d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 218ceb6b139SCaroline Tice 21930fdc8d8SChris Lattner SBThread sb_thread; 2206611103cSGreg Clayton if (m_opaque_sp) 221af67cecdSGreg Clayton { 222af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2232976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 224af67cecdSGreg Clayton } 225ceb6b139SCaroline Tice 226ceb6b139SCaroline Tice if (log) 227ceb6b139SCaroline Tice { 2284838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get()); 229ceb6b139SCaroline Tice } 230ceb6b139SCaroline Tice 23130fdc8d8SChris Lattner return sb_thread; 23230fdc8d8SChris Lattner } 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner SBTarget 23530fdc8d8SChris Lattner SBProcess::GetTarget() const 23630fdc8d8SChris Lattner { 2372d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 238ceb6b139SCaroline Tice 23930fdc8d8SChris Lattner SBTarget sb_target; 2406611103cSGreg Clayton if (m_opaque_sp) 2416611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 242ceb6b139SCaroline Tice 243ceb6b139SCaroline Tice if (log) 24493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get()); 245ceb6b139SCaroline Tice 24630fdc8d8SChris Lattner return sb_target; 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner 24930fdc8d8SChris Lattner 25030fdc8d8SChris Lattner size_t 25130fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 25230fdc8d8SChris Lattner { 2532d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice size_t ret_val = 0; 256af67cecdSGreg Clayton if (m_opaque_sp) 25730fdc8d8SChris Lattner { 25830fdc8d8SChris Lattner Error error; 259ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 26030fdc8d8SChris Lattner } 261ceb6b139SCaroline Tice 262ceb6b139SCaroline Tice if (log) 263fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 26493aa84e8SGreg Clayton m_opaque_sp.get(), 26593aa84e8SGreg Clayton src, 26693aa84e8SGreg Clayton (uint32_t) src_len, 26793aa84e8SGreg Clayton ret_val); 268ceb6b139SCaroline Tice 269ceb6b139SCaroline Tice return ret_val; 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner 27230fdc8d8SChris Lattner size_t 27330fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 27430fdc8d8SChris Lattner { 275cfd1acedSGreg Clayton size_t bytes_read = 0; 276af67cecdSGreg Clayton if (m_opaque_sp) 27730fdc8d8SChris Lattner { 27830fdc8d8SChris Lattner Error error; 279cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 28030fdc8d8SChris Lattner } 281ceb6b139SCaroline Tice 2822d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 283ceb6b139SCaroline Tice if (log) 284cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 285cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 286ceb6b139SCaroline Tice 287cfd1acedSGreg Clayton return bytes_read; 28830fdc8d8SChris Lattner } 28930fdc8d8SChris Lattner 29030fdc8d8SChris Lattner size_t 29130fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 29230fdc8d8SChris Lattner { 293cfd1acedSGreg Clayton size_t bytes_read = 0; 294af67cecdSGreg Clayton if (m_opaque_sp) 29530fdc8d8SChris Lattner { 29630fdc8d8SChris Lattner Error error; 297cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 29830fdc8d8SChris Lattner } 299ceb6b139SCaroline Tice 3002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 301ceb6b139SCaroline Tice if (log) 302cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 303cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 304ceb6b139SCaroline Tice 305cfd1acedSGreg Clayton return bytes_read; 30630fdc8d8SChris Lattner } 30730fdc8d8SChris Lattner 30830fdc8d8SChris Lattner void 3092976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 31030fdc8d8SChris Lattner { 31130fdc8d8SChris Lattner if (out == NULL) 31230fdc8d8SChris Lattner return; 31330fdc8d8SChris Lattner 314af67cecdSGreg Clayton if (m_opaque_sp) 31530fdc8d8SChris Lattner { 31630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 31730fdc8d8SChris Lattner char message[1024]; 31830fdc8d8SChris Lattner int message_len = ::snprintf (message, 31930fdc8d8SChris Lattner sizeof (message), 32081c22f61SGreg Clayton "Process %llu %s\n", 3216611103cSGreg Clayton m_opaque_sp->GetID(), 32230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 32330fdc8d8SChris Lattner 32430fdc8d8SChris Lattner if (message_len > 0) 32530fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 32630fdc8d8SChris Lattner } 32730fdc8d8SChris Lattner } 32830fdc8d8SChris Lattner 32930fdc8d8SChris Lattner void 3302976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 33130fdc8d8SChris Lattner { 332af67cecdSGreg Clayton if (m_opaque_sp) 33330fdc8d8SChris Lattner { 33430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 33530fdc8d8SChris Lattner char message[1024]; 33630fdc8d8SChris Lattner ::snprintf (message, 33730fdc8d8SChris Lattner sizeof (message), 33881c22f61SGreg Clayton "Process %llu %s\n", 3396611103cSGreg Clayton m_opaque_sp->GetID(), 34030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 34130fdc8d8SChris Lattner 34230fdc8d8SChris Lattner result.AppendMessage (message); 34330fdc8d8SChris Lattner } 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner bool 3472976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 34830fdc8d8SChris Lattner { 349af67cecdSGreg Clayton if (m_opaque_sp) 350af67cecdSGreg Clayton { 351af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3522976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 353af67cecdSGreg Clayton } 35430fdc8d8SChris Lattner return false; 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner 35730fdc8d8SChris Lattner bool 3582976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 35930fdc8d8SChris Lattner { 3602d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 361ceb6b139SCaroline Tice 362ceb6b139SCaroline Tice bool ret_val = false; 363af67cecdSGreg Clayton if (m_opaque_sp) 364af67cecdSGreg Clayton { 365af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 366ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 367af67cecdSGreg Clayton } 368ceb6b139SCaroline Tice 369ceb6b139SCaroline Tice if (log) 370cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 37193aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 372ceb6b139SCaroline Tice 373ceb6b139SCaroline Tice return ret_val; 37430fdc8d8SChris Lattner } 37530fdc8d8SChris Lattner 37630fdc8d8SChris Lattner SBThread 37730fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 37830fdc8d8SChris Lattner { 3792d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 380ceb6b139SCaroline Tice 38130fdc8d8SChris Lattner SBThread thread; 3826611103cSGreg Clayton if (m_opaque_sp) 383af67cecdSGreg Clayton { 384af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3856611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 386af67cecdSGreg Clayton } 387ceb6b139SCaroline Tice 388ceb6b139SCaroline Tice if (log) 389ceb6b139SCaroline Tice { 39093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 3914838131bSGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.get()); 392ceb6b139SCaroline Tice } 393ceb6b139SCaroline Tice 39430fdc8d8SChris Lattner return thread; 39530fdc8d8SChris Lattner } 39630fdc8d8SChris Lattner 39730fdc8d8SChris Lattner StateType 39830fdc8d8SChris Lattner SBProcess::GetState () 39930fdc8d8SChris Lattner { 400ceb6b139SCaroline Tice 401ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 402af67cecdSGreg Clayton if (m_opaque_sp) 403af67cecdSGreg Clayton { 404af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 405ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 406af67cecdSGreg Clayton } 407ceb6b139SCaroline Tice 4082d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 409ceb6b139SCaroline Tice if (log) 410cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 41193aa84e8SGreg Clayton m_opaque_sp.get(), 412750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 413ceb6b139SCaroline Tice 414ceb6b139SCaroline Tice return ret_val; 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner 41830fdc8d8SChris Lattner int 41930fdc8d8SChris Lattner SBProcess::GetExitStatus () 42030fdc8d8SChris Lattner { 4214838131bSGreg Clayton int exit_status = 0; 4224838131bSGreg Clayton if (m_opaque_sp) 423af67cecdSGreg Clayton { 424af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4254838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 426af67cecdSGreg Clayton } 4272d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4284838131bSGreg Clayton if (log) 4294838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 4304838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 4314838131bSGreg Clayton 4324838131bSGreg Clayton return exit_status; 43330fdc8d8SChris Lattner } 43430fdc8d8SChris Lattner 43530fdc8d8SChris Lattner const char * 43630fdc8d8SChris Lattner SBProcess::GetExitDescription () 43730fdc8d8SChris Lattner { 4384838131bSGreg Clayton const char *exit_desc = NULL; 439af67cecdSGreg Clayton if (m_opaque_sp) 440af67cecdSGreg Clayton { 441af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4424838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 443af67cecdSGreg Clayton } 4442d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4454838131bSGreg Clayton if (log) 4464838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 4474838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 4484838131bSGreg Clayton return exit_desc; 44930fdc8d8SChris Lattner } 45030fdc8d8SChris Lattner 45130fdc8d8SChris Lattner lldb::pid_t 45230fdc8d8SChris Lattner SBProcess::GetProcessID () 45330fdc8d8SChris Lattner { 454ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 4556611103cSGreg Clayton if (m_opaque_sp) 456ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 457ceb6b139SCaroline Tice 4582d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 459ceb6b139SCaroline Tice if (log) 46093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val); 461ceb6b139SCaroline Tice 462ceb6b139SCaroline Tice return ret_val; 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner 465cf386e24SJohnny Chen ByteOrder 466cf386e24SJohnny Chen SBProcess::GetByteOrder () const 467cf386e24SJohnny Chen { 468cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 469cf386e24SJohnny Chen if (m_opaque_sp) 470cf386e24SJohnny Chen byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder(); 471cf386e24SJohnny Chen 472cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 473cf386e24SJohnny Chen if (log) 474cf386e24SJohnny Chen log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder); 475cf386e24SJohnny Chen 476cf386e24SJohnny Chen return byteOrder; 477cf386e24SJohnny Chen } 478cf386e24SJohnny Chen 47930fdc8d8SChris Lattner uint32_t 48030fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 48130fdc8d8SChris Lattner { 482ceb6b139SCaroline Tice uint32_t size = 0; 4836611103cSGreg Clayton if (m_opaque_sp) 484514487e8SGreg Clayton size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 485ceb6b139SCaroline Tice 4862d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 487ceb6b139SCaroline Tice if (log) 48893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 489ceb6b139SCaroline Tice 490ceb6b139SCaroline Tice return size; 49130fdc8d8SChris Lattner } 49230fdc8d8SChris Lattner 49330fdc8d8SChris Lattner SBError 49430fdc8d8SChris Lattner SBProcess::Continue () 49530fdc8d8SChris Lattner { 4962d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4974838131bSGreg Clayton if (log) 4984838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 499ceb6b139SCaroline Tice 50030fdc8d8SChris Lattner SBError sb_error; 5010c74e78dSGreg Clayton if (m_opaque_sp) 5025d5028b5SGreg Clayton { 5030c74e78dSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5040c74e78dSGreg Clayton 5055d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 5065d5028b5SGreg Clayton if (error.Success()) 5075d5028b5SGreg Clayton { 5085d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5094838131bSGreg Clayton { 5104838131bSGreg Clayton if (log) 5114838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 5125d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 5135d5028b5SGreg Clayton } 5144838131bSGreg Clayton } 5155d5028b5SGreg Clayton sb_error.SetError(error); 5165d5028b5SGreg Clayton } 51730fdc8d8SChris Lattner else 51830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 51930fdc8d8SChris Lattner 520ceb6b139SCaroline Tice if (log) 521ceb6b139SCaroline Tice { 522ceb6b139SCaroline Tice SBStream sstr; 523ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 52493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 525ceb6b139SCaroline Tice } 526ceb6b139SCaroline Tice 52730fdc8d8SChris Lattner return sb_error; 52830fdc8d8SChris Lattner } 52930fdc8d8SChris Lattner 53030fdc8d8SChris Lattner 53130fdc8d8SChris Lattner SBError 53230fdc8d8SChris Lattner SBProcess::Destroy () 53330fdc8d8SChris Lattner { 53430fdc8d8SChris Lattner SBError sb_error; 5356611103cSGreg Clayton if (m_opaque_sp) 5366779606aSGreg Clayton { 5376779606aSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5386611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 5396779606aSGreg Clayton } 54030fdc8d8SChris Lattner else 54130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 54230fdc8d8SChris Lattner 5432d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5444838131bSGreg Clayton if (log) 5454838131bSGreg Clayton { 5464838131bSGreg Clayton SBStream sstr; 5474838131bSGreg Clayton sb_error.GetDescription (sstr); 5486779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 5496779606aSGreg Clayton m_opaque_sp.get(), 5506779606aSGreg Clayton sb_error.get(), 5516779606aSGreg Clayton sstr.GetData()); 5524838131bSGreg Clayton } 5534838131bSGreg Clayton 55430fdc8d8SChris Lattner return sb_error; 55530fdc8d8SChris Lattner } 55630fdc8d8SChris Lattner 55730fdc8d8SChris Lattner 55830fdc8d8SChris Lattner SBError 55930fdc8d8SChris Lattner SBProcess::Stop () 56030fdc8d8SChris Lattner { 56130fdc8d8SChris Lattner SBError sb_error; 5620c74e78dSGreg Clayton if (m_opaque_sp) 563af67cecdSGreg Clayton { 564af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5656611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 566af67cecdSGreg Clayton } 56730fdc8d8SChris Lattner else 56830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 569ceb6b139SCaroline Tice 5702d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 571ceb6b139SCaroline Tice if (log) 572ceb6b139SCaroline Tice { 573ceb6b139SCaroline Tice SBStream sstr; 574ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 57593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 57693aa84e8SGreg Clayton m_opaque_sp.get(), 57793aa84e8SGreg Clayton sb_error.get(), 578750cd175SCaroline Tice sstr.GetData()); 579ceb6b139SCaroline Tice } 580ceb6b139SCaroline Tice 58130fdc8d8SChris Lattner return sb_error; 58230fdc8d8SChris Lattner } 58330fdc8d8SChris Lattner 58430fdc8d8SChris Lattner SBError 58530fdc8d8SChris Lattner SBProcess::Kill () 58630fdc8d8SChris Lattner { 58730fdc8d8SChris Lattner SBError sb_error; 5886611103cSGreg Clayton if (m_opaque_sp) 589af67cecdSGreg Clayton { 590af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5916611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 592af67cecdSGreg Clayton } 59330fdc8d8SChris Lattner else 59430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 595ceb6b139SCaroline Tice 5962d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 597ceb6b139SCaroline Tice if (log) 598ceb6b139SCaroline Tice { 599ceb6b139SCaroline Tice SBStream sstr; 600ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 60193aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 60293aa84e8SGreg Clayton m_opaque_sp.get(), 60393aa84e8SGreg Clayton sb_error.get(), 604750cd175SCaroline Tice sstr.GetData()); 605ceb6b139SCaroline Tice } 606ceb6b139SCaroline Tice 60730fdc8d8SChris Lattner return sb_error; 60830fdc8d8SChris Lattner } 60930fdc8d8SChris Lattner 61030fdc8d8SChris Lattner SBError 61130fdc8d8SChris Lattner SBProcess::Detach () 61230fdc8d8SChris Lattner { 61330fdc8d8SChris Lattner SBError sb_error; 6146611103cSGreg Clayton if (m_opaque_sp) 615af67cecdSGreg Clayton { 616af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6176611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 618af67cecdSGreg Clayton } 61930fdc8d8SChris Lattner else 62030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 62130fdc8d8SChris Lattner 62230fdc8d8SChris Lattner return sb_error; 62330fdc8d8SChris Lattner } 62430fdc8d8SChris Lattner 62530fdc8d8SChris Lattner SBError 6264838131bSGreg Clayton SBProcess::Signal (int signo) 62730fdc8d8SChris Lattner { 62830fdc8d8SChris Lattner SBError sb_error; 6296611103cSGreg Clayton if (m_opaque_sp) 630af67cecdSGreg Clayton { 631af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6324838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 633af67cecdSGreg Clayton } 63430fdc8d8SChris Lattner else 63530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 6362d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6374838131bSGreg Clayton if (log) 6384838131bSGreg Clayton { 6394838131bSGreg Clayton SBStream sstr; 6404838131bSGreg Clayton sb_error.GetDescription (sstr); 6414838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 6424838131bSGreg Clayton m_opaque_sp.get(), 6434838131bSGreg Clayton signo, 6444838131bSGreg Clayton sb_error.get(), 6454838131bSGreg Clayton sstr.GetData()); 6464838131bSGreg Clayton } 64730fdc8d8SChris Lattner return sb_error; 64830fdc8d8SChris Lattner } 64930fdc8d8SChris Lattner 65030fdc8d8SChris Lattner SBThread 6514838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 65230fdc8d8SChris Lattner { 6534838131bSGreg Clayton SBThread sb_thread; 6546611103cSGreg Clayton if (m_opaque_sp) 655af67cecdSGreg Clayton { 656af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6574838131bSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid)); 658af67cecdSGreg Clayton } 6594838131bSGreg Clayton 6602d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6614838131bSGreg Clayton if (log) 6624838131bSGreg Clayton { 6634838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)", 6644838131bSGreg Clayton m_opaque_sp.get(), 6654838131bSGreg Clayton tid, 6664838131bSGreg Clayton sb_thread.get()); 6674838131bSGreg Clayton } 6684838131bSGreg Clayton 6694838131bSGreg Clayton return sb_thread; 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner 67230fdc8d8SChris Lattner StateType 67330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 67430fdc8d8SChris Lattner { 6752d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 676ceb6b139SCaroline Tice 677ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 678ceb6b139SCaroline Tice 679ceb6b139SCaroline Tice if (log) 680cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 681750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 682ceb6b139SCaroline Tice 683ceb6b139SCaroline Tice return ret_val; 68430fdc8d8SChris Lattner } 68530fdc8d8SChris Lattner 68630fdc8d8SChris Lattner bool 68730fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 68830fdc8d8SChris Lattner { 6896611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 69030fdc8d8SChris Lattner } 69130fdc8d8SChris Lattner 69230fdc8d8SChris Lattner SBProcess 69330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 69430fdc8d8SChris Lattner { 6956611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 69630fdc8d8SChris Lattner return process; 69730fdc8d8SChris Lattner } 69830fdc8d8SChris Lattner 69930fdc8d8SChris Lattner 70030fdc8d8SChris Lattner SBBroadcaster 70130fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 70230fdc8d8SChris Lattner { 7032d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 704ceb6b139SCaroline Tice 7056611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 706ceb6b139SCaroline Tice 707ceb6b139SCaroline Tice if (log) 70893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 709750cd175SCaroline Tice broadcaster.get()); 710ceb6b139SCaroline Tice 71130fdc8d8SChris Lattner return broadcaster; 71230fdc8d8SChris Lattner } 71330fdc8d8SChris Lattner 71430fdc8d8SChris Lattner lldb_private::Process * 71530fdc8d8SChris Lattner SBProcess::operator->() const 71630fdc8d8SChris Lattner { 7176611103cSGreg Clayton return m_opaque_sp.get(); 71830fdc8d8SChris Lattner } 71930fdc8d8SChris Lattner 72030fdc8d8SChris Lattner size_t 72130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 72230fdc8d8SChris Lattner { 7232d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 724ceb6b139SCaroline Tice 72530fdc8d8SChris Lattner size_t bytes_read = 0; 72630fdc8d8SChris Lattner 7274838131bSGreg Clayton if (log) 7284838131bSGreg Clayton { 7294838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 7304838131bSGreg Clayton m_opaque_sp.get(), 7314838131bSGreg Clayton addr, 7324838131bSGreg Clayton dst, 7334838131bSGreg Clayton (uint32_t) dst_len, 7344838131bSGreg Clayton sb_error.get()); 7354838131bSGreg Clayton } 7364838131bSGreg Clayton 737af67cecdSGreg Clayton if (m_opaque_sp) 73830fdc8d8SChris Lattner { 73930fdc8d8SChris Lattner Error error; 740af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7416611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 74230fdc8d8SChris Lattner sb_error.SetError (error); 74330fdc8d8SChris Lattner } 74430fdc8d8SChris Lattner else 74530fdc8d8SChris Lattner { 74630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 74730fdc8d8SChris Lattner } 74830fdc8d8SChris Lattner 749ceb6b139SCaroline Tice if (log) 75093aa84e8SGreg Clayton { 75193aa84e8SGreg Clayton SBStream sstr; 75293aa84e8SGreg Clayton sb_error.GetDescription (sstr); 7534838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d", 75493aa84e8SGreg Clayton m_opaque_sp.get(), 75593aa84e8SGreg Clayton addr, 75693aa84e8SGreg Clayton dst, 75793aa84e8SGreg Clayton (uint32_t) dst_len, 75893aa84e8SGreg Clayton sb_error.get(), 75993aa84e8SGreg Clayton sstr.GetData(), 76093aa84e8SGreg Clayton (uint32_t) bytes_read); 76193aa84e8SGreg Clayton } 762ceb6b139SCaroline Tice 76330fdc8d8SChris Lattner return bytes_read; 76430fdc8d8SChris Lattner } 76530fdc8d8SChris Lattner 76630fdc8d8SChris Lattner size_t 76730fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 76830fdc8d8SChris Lattner { 76930fdc8d8SChris Lattner size_t bytes_written = 0; 77030fdc8d8SChris Lattner 7712d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7724838131bSGreg Clayton if (log) 7734838131bSGreg Clayton { 7744838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 7754838131bSGreg Clayton m_opaque_sp.get(), 7764838131bSGreg Clayton addr, 7774838131bSGreg Clayton src, 7784838131bSGreg Clayton (uint32_t) src_len, 7794838131bSGreg Clayton sb_error.get()); 7804838131bSGreg Clayton } 7814838131bSGreg Clayton 782af67cecdSGreg Clayton if (m_opaque_sp) 78330fdc8d8SChris Lattner { 78430fdc8d8SChris Lattner Error error; 785af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7866611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 78730fdc8d8SChris Lattner sb_error.SetError (error); 78830fdc8d8SChris Lattner } 78930fdc8d8SChris Lattner 7904838131bSGreg Clayton if (log) 7914838131bSGreg Clayton { 7924838131bSGreg Clayton SBStream sstr; 7934838131bSGreg Clayton sb_error.GetDescription (sstr); 7944838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d", 7954838131bSGreg Clayton m_opaque_sp.get(), 7964838131bSGreg Clayton addr, 7974838131bSGreg Clayton src, 7984838131bSGreg Clayton (uint32_t) src_len, 7994838131bSGreg Clayton sb_error.get(), 8004838131bSGreg Clayton sstr.GetData(), 8014838131bSGreg Clayton (uint32_t) bytes_written); 8024838131bSGreg Clayton } 8034838131bSGreg Clayton 80430fdc8d8SChris Lattner return bytes_written; 80530fdc8d8SChris Lattner } 80630fdc8d8SChris Lattner 80730fdc8d8SChris Lattner // Mimic shared pointer... 80830fdc8d8SChris Lattner lldb_private::Process * 80930fdc8d8SChris Lattner SBProcess::get() const 81030fdc8d8SChris Lattner { 8116611103cSGreg Clayton return m_opaque_sp.get(); 81230fdc8d8SChris Lattner } 81330fdc8d8SChris Lattner 814dde9cff3SCaroline Tice bool 815dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 816dde9cff3SCaroline Tice { 817*da7bc7d0SGreg Clayton Stream &strm = description.ref(); 818*da7bc7d0SGreg Clayton 819dde9cff3SCaroline Tice if (m_opaque_sp) 820dde9cff3SCaroline Tice { 821dde9cff3SCaroline Tice char path[PATH_MAX]; 822dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 823aa149cbdSGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 8241d273166SGreg Clayton const char *exe_name = NULL; 8251d273166SGreg Clayton if (exe_module) 8261d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 8271d273166SGreg Clayton 828*da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 8291d273166SGreg Clayton m_opaque_sp->GetID(), 830ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 8311d273166SGreg Clayton GetNumThreads(), 83205faeb71SGreg Clayton exe_name ? ", executable = " : "", 8331d273166SGreg Clayton exe_name ? exe_name : ""); 834dde9cff3SCaroline Tice } 835dde9cff3SCaroline Tice else 836*da7bc7d0SGreg Clayton strm.PutCString ("No value"); 837dde9cff3SCaroline Tice 838dde9cff3SCaroline Tice return true; 839dde9cff3SCaroline Tice } 8408f343b09SGreg Clayton 8418f343b09SGreg Clayton uint32_t 8428f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 8438f343b09SGreg Clayton { 8448f343b09SGreg Clayton if (m_opaque_sp) 845af67cecdSGreg Clayton { 846af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 847c5f57830SGreg Clayton return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref()); 848af67cecdSGreg Clayton } 8498f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 8508f343b09SGreg Clayton } 8518f343b09SGreg Clayton 8528f343b09SGreg Clayton lldb::SBError 8538f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 8548f343b09SGreg Clayton { 8558f343b09SGreg Clayton lldb::SBError sb_error; 8568f343b09SGreg Clayton if (m_opaque_sp) 857af67cecdSGreg Clayton { 858af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 8598f343b09SGreg Clayton sb_error.SetError (m_opaque_sp->UnloadImage (image_token)); 860af67cecdSGreg Clayton } 8618f343b09SGreg Clayton else 8628f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 8638f343b09SGreg Clayton return sb_error; 8648f343b09SGreg Clayton } 8658f343b09SGreg Clayton 8668f343b09SGreg Clayton 867