//===-- 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 "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;
size_t
GetNumSourceCommandFiles () const;
const char *
GetSourceCommandFileAtIndex (uint32_t idx) const;
bool
GetDebugMode() const;
class OptionData
{
public:
OptionData ();
~OptionData ();
void
Clear();
//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::string> m_source_command_files;
bool m_debug_mode;
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_