1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
//===-- Driver.h ------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef lldb_Driver_h_
#define lldb_Driver_h_
#include "Platform.h"
#include "lldb/Utility/PseudoTerminal.h"
#include <set>
#include <bitset>
#include <string>
#include <vector>
#include "lldb/API/SBDefines.h"
#include "lldb/API/SBBroadcaster.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBError.h"
#include "lldb/API/SBInputReader.h"
#define ASYNC true
#define NO_ASYNC false
class IOChannel;
namespace lldb
{
class SBInputReader;
}
class Driver : public lldb::SBBroadcaster
{
public:
enum {
eBroadcastBitReadyForInput = (1 << 0),
eBroadcastBitThreadShouldExit = (1 << 1)
};
Driver ();
virtual
~Driver ();
void
MainLoop ();
void
PutSTDIN (const char *src, size_t src_len);
void
GetFromMaster (const char *src, size_t src_len);
bool
HandleIOEvent (const lldb::SBEvent &event);
void
HandleProcessEvent (const lldb::SBEvent &event);
void
HandleBreakpointEvent (const lldb::SBEvent &event);
void
HandleThreadEvent (const lldb::SBEvent &event);
lldb::SBError
ParseArgs (int argc, const char *argv[], FILE *out_fh, bool &do_exit);
const char *
GetFilename() const;
const char *
GetCrashLogFilename() const;
const char *
GetArchName() const;
lldb::ScriptLanguage
GetScriptLanguage() const;
void
ExecuteInitialCommands (bool before_file);
bool
GetDebugMode() const;
class OptionData
{
public:
OptionData ();
~OptionData ();
void
Clear();
void
AddInitialCommand (const char *command, bool before_file, bool is_file, lldb::SBError &error);
//static OptionDefinition m_cmd_option_table[];
std::vector<std::string> m_args;
lldb::ScriptLanguage m_script_lang;
std::string m_core_file;
std::string m_crash_log;
std::vector<std::pair<bool,std::string> > m_initial_commands;
std::vector<std::pair<bool,std::string> > m_after_file_commands;
bool m_debug_mode;
bool m_source_quietly;
bool m_print_version;
bool m_print_python_path;
bool m_print_help;
bool m_wait_for;
std::string m_process_name;
lldb::pid_t m_process_pid;
bool m_use_external_editor; // FIXME: When we have set/show variables we can remove this from here.
typedef std::set<char> OptionSet;
OptionSet m_seen_options;
};
static lldb::SBError
SetOptionValue (int option_idx,
const char *option_arg,
Driver::OptionData &data);
lldb::SBDebugger &
GetDebugger()
{
return m_debugger;
}
bool
EditlineReaderIsTop ()
{
return m_debugger.InputReaderIsTopReader (m_editline_reader);
}
bool
GetIsDone () const
{
return m_done;
}
void
SetIsDone ()
{
m_done = true;
}
void
ResizeWindow (unsigned short col);
private:
lldb::SBDebugger m_debugger;
lldb_utility::PseudoTerminal m_editline_pty;
FILE *m_editline_slave_fh;
lldb::SBInputReader m_editline_reader;
std::unique_ptr<IOChannel> m_io_channel_ap;
OptionData m_option_data;
bool m_executing_user_command;
bool m_waiting_for_command;
bool m_done;
void
ResetOptionValues ();
size_t
GetProcessSTDOUT ();
size_t
GetProcessSTDERR ();
void
UpdateSelectedThread ();
void
CloseIOChannelFile ();
static size_t
EditLineInputReaderCallback (void *baton,
lldb::SBInputReader *reader,
lldb::InputReaderAction notification,
const char *bytes,
size_t bytes_len);
static void
ReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
static void
MasterThreadBytesReceived (void *baton, const void *src, size_t src_len);
void
ReadyForCommand ();
};
#endif // lldb_Driver_h_
|