ProcessPOSIX.h revision 3bd2ebd670677dae45010bf53084ff85da7c6a5e
12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- ProcessPOSIX.h ------------------------------------------*- C++ -*-===//
22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//                     The LLVM Compiler Infrastructure
42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source
62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details.
72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===//
92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_ProcessPOSIX_H_
112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_ProcessPOSIX_H_
122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes
142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes
162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <queue>
172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes
192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Process.h"
202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/UnixSignals.h"
212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessMessage.h"
222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMonitor;
242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessPOSIX :
262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    public lldb_private::Process
272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic:
292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //------------------------------------------------------------------
312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // Constructors and destructors
322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //------------------------------------------------------------------
332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessPOSIX(lldb_private::Target& target,
342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                 lldb_private::Listener &listener);
352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual
372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ~ProcessPOSIX();
382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //------------------------------------------------------------------
402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // Process protocol.
412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //------------------------------------------------------------------
422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual bool
432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    CanDebug(lldb_private::Target &target, bool plugin_specified_by_name);
442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    WillLaunch(lldb_private::Module *module);
472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoAttachToProcessWithID(lldb::pid_t pid);
502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
52c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton    DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
53c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton
54c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton    virtual lldb_private::Error
552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoLaunch (lldb_private::Module *exe_module,
562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen              const lldb_private::ProcessLaunchInfo &launch_info);
572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual void
592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DidLaunch();
602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoResume();
632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoHalt(bool &caused_stop);
662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
68761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    DoDetach(bool keep_stopped);
692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoSignal(int signal);
722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoDestroy();
752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual void
772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    RefreshStateAfterStop();
782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual bool
802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    IsAlive();
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual size_t
832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoReadMemory(lldb::addr_t vm_addr,
842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                 void *buf,
852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                 size_t size,
862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                 lldb_private::Error &error);
872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual size_t
892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                  lldb_private::Error &error);
912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::addr_t
932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoAllocateMemory(size_t size, uint32_t permissions,
942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                     lldb_private::Error &error);
952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DoDeallocateMemory(lldb::addr_t ptr);
982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    virtual lldb::addr_t
1004f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    ResolveIndirectFunction(const lldb_private::Address *address, lldb_private::Error &error);
1014f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual size_t
1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site);
1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
10652d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel Malea    EnableBreakpointSite(lldb_private::BreakpointSite *bp_site);
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb_private::Error
10952d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel Malea    DisableBreakpointSite(lldb_private::BreakpointSite *bp_site);
1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1113d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    virtual lldb_private::Error
1123d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true);
1133d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
1143d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    virtual lldb_private::Error
1153d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true);
1163d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
1173d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    virtual lldb_private::Error
1183d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    GetWatchpointSupportInfo(uint32_t &num);
1193d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
1203d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    virtual lldb_private::Error
1213d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    GetWatchpointSupportInfo(uint32_t &num, bool &after);
1223d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual uint32_t
1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    UpdateThreadListIfNeeded();
1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
126c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton    virtual bool
1272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    UpdateThreadList(lldb_private::ThreadList &old_thread_list,
1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                     lldb_private::ThreadList &new_thread_list) = 0;
1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::ByteOrder
1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetByteOrder() const;
1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::addr_t
1342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetImageInfoAddress();
1352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual size_t
1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    PutSTDIN(const char *buf, size_t len, lldb_private::Error &error);
1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //--------------------------------------------------------------------------
1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // ProcessPOSIX internal API.
1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Registers the given message with this process.
1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SendMessage(const ProcessMessage &message);
1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessMonitor &
1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetMonitor() { assert(m_monitor); return *m_monitor; }
1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::UnixSignals &
1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetUnixSignals();
1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *
1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action,
1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                const char *default_path);
1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1553bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    /// Stops all threads in the process.
1563bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    /// The \p stop_tid parameter indicates the thread which initiated the stop.
1573bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    virtual void
1583bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    StopAllThreads(lldb::tid_t stop_tid);
1593bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
1602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected:
1612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Target byte order.
1622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::ByteOrder m_byte_order;
1632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Process monitor;
1652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessMonitor *m_monitor;
1662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// The module we are executing.
1682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::Module *m_module;
1692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Message queue notifying this instance of inferior process state changes.
1712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::Mutex m_message_mutex;
1722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    std::queue<ProcessMessage> m_message_queue;
1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// True when the process has entered a state of "limbo".
1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// This flag qualifies eStateStopped.  It lets us know that when we
1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// continue from this state the process will exit.  Also, when true,
1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Process::m_exit_status is set.
1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool m_in_limbo;
1802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Drive any exit events to completion.
1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool m_exit_now;
1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// OS-specific signal set.
1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::UnixSignals m_signals;
1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Returns true if the process has exited.
1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool HasExited();
1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Returns true if the process is stopped.
1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool IsStopped();
1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    MMapMap m_addr_to_mmap_size;
1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen};
1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif  // liblldb_MacOSXProcess_H_
198