1254721Semaste//===-- ProcessPOSIX.h ------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_ProcessPOSIX_H_ 11254721Semaste#define liblldb_ProcessPOSIX_H_ 12254721Semaste 13254721Semaste// C Includes 14254721Semaste 15254721Semaste// C++ Includes 16254721Semaste#include <queue> 17254721Semaste#include <set> 18254721Semaste 19254721Semaste// Other libraries and framework includes 20254721Semaste#include "lldb/Target/Process.h" 21254721Semaste#include "lldb/Target/UnixSignals.h" 22254721Semaste#include "ProcessMessage.h" 23254721Semaste 24254721Semasteclass ProcessMonitor; 25254721Semasteclass POSIXThread; 26254721Semaste 27254721Semasteclass ProcessPOSIX : 28254721Semaste public lldb_private::Process 29254721Semaste{ 30254721Semastepublic: 31254721Semaste 32254721Semaste //------------------------------------------------------------------ 33254721Semaste // Constructors and destructors 34254721Semaste //------------------------------------------------------------------ 35254721Semaste ProcessPOSIX(lldb_private::Target& target, 36254721Semaste lldb_private::Listener &listener); 37254721Semaste 38254721Semaste virtual 39254721Semaste ~ProcessPOSIX(); 40254721Semaste 41254721Semaste //------------------------------------------------------------------ 42254721Semaste // Process protocol. 43254721Semaste //------------------------------------------------------------------ 44254721Semaste virtual void 45254721Semaste Finalize(); 46254721Semaste 47254721Semaste virtual bool 48254721Semaste CanDebug(lldb_private::Target &target, bool plugin_specified_by_name); 49254721Semaste 50254721Semaste virtual lldb_private::Error 51254721Semaste WillLaunch(lldb_private::Module *module); 52254721Semaste 53254721Semaste virtual lldb_private::Error 54254721Semaste DoAttachToProcessWithID(lldb::pid_t pid); 55254721Semaste 56254721Semaste virtual lldb_private::Error 57254721Semaste DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 58254721Semaste 59254721Semaste virtual lldb_private::Error 60254721Semaste DoLaunch (lldb_private::Module *exe_module, 61269024Semaste lldb_private::ProcessLaunchInfo &launch_info); 62254721Semaste 63254721Semaste virtual void 64254721Semaste DidLaunch(); 65254721Semaste 66254721Semaste virtual lldb_private::Error 67269024Semaste DoResume(); 68254721Semaste 69254721Semaste virtual lldb_private::Error 70254721Semaste DoHalt(bool &caused_stop); 71254721Semaste 72254721Semaste virtual lldb_private::Error 73263363Semaste DoDetach(bool keep_stopped) = 0; 74254721Semaste 75254721Semaste virtual lldb_private::Error 76254721Semaste DoSignal(int signal); 77254721Semaste 78254721Semaste virtual lldb_private::Error 79254721Semaste DoDestroy(); 80254721Semaste 81254721Semaste virtual void 82263363Semaste DoDidExec(); 83263363Semaste 84263363Semaste virtual void 85254721Semaste RefreshStateAfterStop(); 86254721Semaste 87254721Semaste virtual bool 88254721Semaste IsAlive(); 89254721Semaste 90254721Semaste virtual size_t 91254721Semaste DoReadMemory(lldb::addr_t vm_addr, 92254721Semaste void *buf, 93254721Semaste size_t size, 94254721Semaste lldb_private::Error &error); 95254721Semaste 96254721Semaste virtual size_t 97254721Semaste DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 98254721Semaste lldb_private::Error &error); 99254721Semaste 100254721Semaste virtual lldb::addr_t 101254721Semaste DoAllocateMemory(size_t size, uint32_t permissions, 102254721Semaste lldb_private::Error &error); 103254721Semaste 104254721Semaste virtual lldb_private::Error 105254721Semaste DoDeallocateMemory(lldb::addr_t ptr); 106254721Semaste 107254721Semaste virtual size_t 108254721Semaste GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site); 109254721Semaste 110254721Semaste virtual lldb_private::Error 111254721Semaste EnableBreakpointSite(lldb_private::BreakpointSite *bp_site); 112254721Semaste 113254721Semaste virtual lldb_private::Error 114254721Semaste DisableBreakpointSite(lldb_private::BreakpointSite *bp_site); 115254721Semaste 116254721Semaste virtual lldb_private::Error 117254721Semaste EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 118254721Semaste 119254721Semaste virtual lldb_private::Error 120254721Semaste DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 121254721Semaste 122254721Semaste virtual lldb_private::Error 123254721Semaste GetWatchpointSupportInfo(uint32_t &num); 124254721Semaste 125254721Semaste virtual lldb_private::Error 126254721Semaste GetWatchpointSupportInfo(uint32_t &num, bool &after); 127254721Semaste 128254721Semaste virtual uint32_t 129254721Semaste UpdateThreadListIfNeeded(); 130254721Semaste 131254721Semaste virtual bool 132254721Semaste UpdateThreadList(lldb_private::ThreadList &old_thread_list, 133254721Semaste lldb_private::ThreadList &new_thread_list) = 0; 134254721Semaste 135254721Semaste virtual lldb::ByteOrder 136254721Semaste GetByteOrder() const; 137254721Semaste 138254721Semaste virtual lldb::addr_t 139254721Semaste GetImageInfoAddress(); 140254721Semaste 141254721Semaste virtual size_t 142254721Semaste PutSTDIN(const char *buf, size_t len, lldb_private::Error &error); 143254721Semaste 144254721Semaste //-------------------------------------------------------------------------- 145254721Semaste // ProcessPOSIX internal API. 146254721Semaste 147254721Semaste /// Registers the given message with this process. 148263368Semaste virtual void 149269024Semaste SendMessage(const ProcessMessage &message); 150254721Semaste 151254721Semaste ProcessMonitor & 152254721Semaste GetMonitor() { assert(m_monitor); return *m_monitor; } 153254721Semaste 154254721Semaste lldb_private::UnixSignals & 155254721Semaste GetUnixSignals(); 156254721Semaste 157254721Semaste const char * 158254721Semaste GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action, 159254721Semaste const char *default_path); 160254721Semaste 161254721Semaste /// Stops all threads in the process. 162254721Semaste /// The \p stop_tid parameter indicates the thread which initiated the stop. 163254721Semaste virtual void 164254721Semaste StopAllThreads(lldb::tid_t stop_tid); 165254721Semaste 166254721Semaste /// Adds the thread to the list of threads for which we have received the initial stopping signal. 167254721Semaste /// The \p stop_tid paramter indicates the thread which the stop happened for. 168254721Semaste bool 169254721Semaste AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid); 170254721Semaste 171263363Semaste bool 172263363Semaste WaitingForInitialStop(lldb::tid_t stop_tid); 173263363Semaste 174254721Semaste virtual POSIXThread * 175254721Semaste CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid); 176254721Semaste 177254721Semasteprotected: 178254721Semaste /// Target byte order. 179254721Semaste lldb::ByteOrder m_byte_order; 180254721Semaste 181254721Semaste /// Process monitor; 182254721Semaste ProcessMonitor *m_monitor; 183254721Semaste 184254721Semaste /// The module we are executing. 185254721Semaste lldb_private::Module *m_module; 186254721Semaste 187254721Semaste /// Message queue notifying this instance of inferior process state changes. 188254721Semaste lldb_private::Mutex m_message_mutex; 189254721Semaste std::queue<ProcessMessage> m_message_queue; 190254721Semaste 191254721Semaste /// Drive any exit events to completion. 192254721Semaste bool m_exit_now; 193254721Semaste 194254721Semaste /// OS-specific signal set. 195254721Semaste lldb_private::UnixSignals m_signals; 196254721Semaste 197254721Semaste /// Returns true if the process has exited. 198254721Semaste bool HasExited(); 199254721Semaste 200254721Semaste /// Returns true if the process is stopped. 201254721Semaste bool IsStopped(); 202254721Semaste 203254721Semaste /// Returns true if at least one running is currently running 204254721Semaste bool IsAThreadRunning(); 205254721Semaste 206254721Semaste typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 207254721Semaste MMapMap m_addr_to_mmap_size; 208254721Semaste 209254721Semaste typedef std::set<lldb::tid_t> ThreadStopSet; 210254721Semaste /// Every thread begins with a stop signal. This keeps track 211254721Semaste /// of the threads for which we have received the stop signal. 212254721Semaste ThreadStopSet m_seen_initial_stop; 213254721Semaste}; 214254721Semaste 215254721Semaste#endif // liblldb_MacOSXProcess_H_ 216