ProcessLinux.h revision 92241efe8ab5c5cd8d685e86dde28807549fcaf0
1//===-- ProcessLinux.h ------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_ProcessLinux_H_
11#define liblldb_ProcessLinux_H_
12
13// C Includes
14
15// C++ Includes
16#include <queue>
17
18// Other libraries and framework includes
19#include "lldb/Target/Process.h"
20#include "ProcessMessage.h"
21
22class ProcessMonitor;
23
24class ProcessLinux :
25    public lldb_private::Process
26{
27public:
28    //------------------------------------------------------------------
29    // Static functions.
30    //------------------------------------------------------------------
31    static Process*
32    CreateInstance(lldb_private::Target& target,
33                   lldb_private::Listener &listener);
34
35    static void
36    Initialize();
37
38    static void
39    Terminate();
40
41    static const char *
42    GetPluginNameStatic();
43
44    static const char *
45    GetPluginDescriptionStatic();
46
47    //------------------------------------------------------------------
48    // Constructors and destructors
49    //------------------------------------------------------------------
50    ProcessLinux(lldb_private::Target& target,
51                 lldb_private::Listener &listener);
52
53    virtual
54    ~ProcessLinux();
55
56    //------------------------------------------------------------------
57    // Process protocol.
58    //------------------------------------------------------------------
59    virtual bool
60    CanDebug(lldb_private::Target &target);
61
62    virtual lldb_private::Error
63    WillLaunch(lldb_private::Module *module);
64
65    virtual lldb_private::Error
66    DoAttachToProcessWithID(lldb::pid_t pid);
67
68    virtual lldb_private::Error
69    DoLaunch(lldb_private::Module *module,
70             char const *argv[],
71             char const *envp[],
72             uint32_t launch_flags,
73             const char *stdin_path,
74             const char *stdout_path,
75             const char *stderr_path);
76
77    virtual void
78    DidLaunch();
79
80    virtual lldb_private::Error
81    DoResume();
82
83    virtual lldb_private::Error
84    DoHalt(bool &caused_stop);
85
86    virtual lldb_private::Error
87    DoDetach();
88
89    virtual lldb_private::Error
90    DoSignal(int signal);
91
92    virtual lldb_private::Error
93    DoDestroy();
94
95    virtual void
96    RefreshStateAfterStop();
97
98    virtual bool
99    IsAlive();
100
101    virtual size_t
102    DoReadMemory(lldb::addr_t vm_addr,
103                 void *buf,
104                 size_t size,
105                 lldb_private::Error &error);
106
107    virtual size_t
108    DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
109                  lldb_private::Error &error);
110
111    virtual lldb::addr_t
112    DoAllocateMemory(size_t size, uint32_t permissions,
113                     lldb_private::Error &error);
114
115    lldb::addr_t
116    AllocateMemory(size_t size, uint32_t permissions,
117                   lldb_private::Error &error);
118
119    virtual lldb_private::Error
120    DoDeallocateMemory(lldb::addr_t ptr);
121
122    virtual size_t
123    GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site);
124
125    virtual lldb_private::Error
126    EnableBreakpoint(lldb_private::BreakpointSite *bp_site);
127
128    virtual lldb_private::Error
129    DisableBreakpoint(lldb_private::BreakpointSite *bp_site);
130
131    virtual uint32_t
132    UpdateThreadListIfNeeded();
133
134    virtual lldb::ByteOrder
135    GetByteOrder() const;
136
137    virtual lldb::addr_t
138    GetImageInfoAddress();
139
140    virtual lldb_private::DynamicLoader *
141    GetDynamicLoader();
142
143    //------------------------------------------------------------------
144    // PluginInterface protocol
145    //------------------------------------------------------------------
146    virtual const char *
147    GetPluginName();
148
149    virtual const char *
150    GetShortPluginName();
151
152    virtual uint32_t
153    GetPluginVersion();
154
155    virtual void
156    GetPluginCommandHelp(const char *command, lldb_private::Stream *strm);
157
158    virtual lldb_private::Error
159    ExecutePluginCommand(lldb_private::Args &command,
160                         lldb_private::Stream *strm);
161
162    virtual lldb_private::Log *
163    EnablePluginLogging(lldb_private::Stream *strm,
164                        lldb_private::Args &command);
165
166    //--------------------------------------------------------------------------
167    // ProcessLinux internal API.
168
169    /// Registers the given message with this process.
170    void SendMessage(const ProcessMessage &message);
171
172    ProcessMonitor &GetMonitor() { return *m_monitor; }
173
174private:
175    /// Target byte order.
176    lldb::ByteOrder m_byte_order;
177
178    /// Process monitor;
179    ProcessMonitor *m_monitor;
180
181    /// The module we are executing.
182    lldb_private::Module *m_module;
183
184    /// Message queue notifying this instance of inferior process state changes.
185    lldb_private::Mutex m_message_mutex;
186    std::queue<ProcessMessage> m_message_queue;
187
188    /// Dynamic loader plugin associated with this process.
189    std::auto_ptr<lldb_private::DynamicLoader> m_dyld_ap;
190
191    /// Updates the loaded sections provided by the executable.
192    ///
193    /// FIXME:  It would probably be better to delegate this task to the
194    /// DynamicLoader plugin, when we have one.
195    void UpdateLoadedSections();
196
197    /// Returns true if the process has exited.
198    bool HasExited();
199};
200
201#endif  // liblldb_MacOSXProcess_H_
202