124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Driver.h ------------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef lldb_Driver_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define lldb_Driver_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13dea5ea78ef9bf371a0d19590c6b7c6989cba9a89Jason Molenda#include "lldb/Utility/PseudoTerminal.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <bitset> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector> 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBDefines.h" 21fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBBroadcaster.h" 2263094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/API/SBDebugger.h" 23fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBError.h" 24fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBInputReader.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264a348081030cdd2af758fddc869518357d9befd3Caroline Tice#define ASYNC true 274a348081030cdd2af758fddc869518357d9befd3Caroline Tice#define NO_ASYNC false 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass IOChannel; 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class SBInputReader; 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Driver : public lldb::SBBroadcaster 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum { 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitReadyForInput = (1 << 0), 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitThreadShouldExit = (1 << 1) 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Driver (); 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~Driver (); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MainLoop (); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutSTDIN (const char *src, size_t src_len); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetFromMaster (const char *src, size_t src_len); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandleIOEvent (const lldb::SBEvent &event); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandleProcessEvent (const lldb::SBEvent &event); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham void 6628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham HandleBreakpointEvent (const lldb::SBEvent &event); 6728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham 6894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham void 6994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham HandleThreadEvent (const lldb::SBEvent &event); 7094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 7163094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb::SBError 7263094e0bb161580564954dee512955c1c79d3476Greg Clayton ParseArgs (int argc, const char *argv[], FILE *out_fh, bool &do_exit); 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetFilename() const; 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCrashLogFilename() const; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetArchName() const; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ScriptLanguage 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetScriptLanguage() const; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetNumSourceCommandFiles () const; 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetSourceCommandFileAtIndex (uint32_t idx) const; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDebugMode() const; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class OptionData 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionData (); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~OptionData (); 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton //static OptionDefinition m_cmd_option_table[]; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1074dc1892eefc8ccaceec79c09b63fa198b40b4ab9Greg Clayton std::vector<std::string> m_args; 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ScriptLanguage m_script_lang; 1096c061beb3f9b60380b9638a4eacb3bc46ad38fc5Johnny Chen std::string m_core_file; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string m_crash_log; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<std::string> m_source_command_files; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_debug_mode; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_print_version; 114aa93c931a4c1275b2fecec23ef34f231afda4773Jim Ingham bool m_print_python_path; 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_print_help; 11683dd2039d86b79e9cd5cf320bdb50c838fcb7b9cJim Ingham bool m_wait_for; 11783dd2039d86b79e9cd5cf320bdb50c838fcb7b9cJim Ingham std::string m_process_name; 11883dd2039d86b79e9cd5cf320bdb50c838fcb7b9cJim Ingham lldb::pid_t m_process_pid; 11974989e88af7e04f3fe0bb3a800163113d7e0ca12Jim Ingham bool m_use_external_editor; // FIXME: When we have set/show variables we can remove this from here. 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::set<char> OptionSet; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionSet m_seen_options; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::SBError 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOptionValue (int option_idx, 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *option_arg, 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Driver::OptionData &data); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13163094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb::SBDebugger & 13263094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebugger() 13363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 13463094e0bb161580564954dee512955c1c79d3476Greg Clayton return m_debugger; 13563094e0bb161580564954dee512955c1c79d3476Greg Clayton } 136b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 137b38df1e945846a5d956974ec157902a6ad748868Caroline Tice bool 138b38df1e945846a5d956974ec157902a6ad748868Caroline Tice EditlineReaderIsTop () 139b38df1e945846a5d956974ec157902a6ad748868Caroline Tice { 140b38df1e945846a5d956974ec157902a6ad748868Caroline Tice return m_debugger.InputReaderIsTopReader (m_editline_reader); 141b38df1e945846a5d956974ec157902a6ad748868Caroline Tice } 14263094e0bb161580564954dee512955c1c79d3476Greg Clayton 143f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton bool 144f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton GetIsDone () const 145f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton { 146f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton return m_done; 147f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton } 148f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton 149f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton void 150f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton SetIsDone () 151f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton { 152f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton m_done = true; 153f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton } 1542eaca13a907b3c2ce41602b646d073851dc696ebJim Ingham 1552eaca13a907b3c2ce41602b646d073851dc696ebJim Ingham void 1562eaca13a907b3c2ce41602b646d073851dc696ebJim Ingham ResizeWindow (unsigned short col); 157f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 15963094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb::SBDebugger m_debugger; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_utility::PseudoTerminal m_editline_pty; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FILE *m_editline_slave_fh; 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::SBInputReader m_editline_reader; 163102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<IOChannel> m_io_channel_ap; 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionData m_option_data; 1654084fe70b71aef8d9d90186f9f54cd8a4d4c6861Greg Clayton bool m_executing_user_command; 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_waiting_for_command; 167f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton bool m_done; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues (); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 172757500e29b7856823f2f4aedd30f206ec009147eCaroline Tice size_t 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetProcessSTDOUT (); 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175757500e29b7856823f2f4aedd30f206ec009147eCaroline Tice size_t 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetProcessSTDERR (); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 179c833295baeec641086f536e78050388af36784f8Jim Ingham UpdateSelectedThread (); 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CloseIOChannelFile (); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static size_t 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EditLineInputReaderCallback (void *baton, 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::SBInputReader *reader, 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::InputReaderAction notification, 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *bytes, 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_len); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadThreadBytesReceived (void *baton, const void *src, size_t src_len); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MasterThreadBytesReceived (void *baton, const void *src, size_t src_len); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadyForCommand (); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201f2f321d826c21c674ca5787b18e8b3e0edaa214bEli Friedman#endif // lldb_Driver_h_ 202