//===-- MIDriver.h ----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// //++ // File: MIDriver.h // // Overview: CMIDriver interface. // // Environment: Compilers: Visual C++ 12. // gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 // Libraries: See MIReadmetxt. // // Copyright: None. //-- #pragma once // Third party headers #include // In-house headers: #include "MICmnConfig.h" #include "MICmnBase.h" #include "MIDriverBase.h" #include "MIDriverMgr.h" #include "MICmnStreamStdin.h" #include "MICmdData.h" #include "MIUtilSingletonBase.h" // Declarations: class CMICmnLLDBDebugger; class CMICmnStreamStdout; //++ ============================================================================ // Details: MI driver implementation class. A singleton class derived from // LLDB SBBroadcaster class. Register the instance of *this class with // the CMIDriverMgr. The CMIDriverMgr sets the driver(s) of to start // work depending on the one selected to work. A driver can if not able // to handle an instruction or 'command' can pass that command onto // another driver object registered with the Driver Manager. // Gotchas: None. // Authors: Illya Rudkin 29/01/2014. // Changes: None. //-- class CMIDriver : public CMICmnBase, public CMIDriverMgr::IDriver, public CMIDriverBase, public CMICmnStreamStdin::IStreamStdin, public MI::ISingleton { friend class MI::ISingleton; // Enumerations: public: //++ ---------------------------------------------------------------------- // Details: The MI Driver has a running state which is used to help determin // which specific action(s) it should take or not allow. // The driver when operational and not shutting down alternates // between eDriverState_RunningNotDebugging and // eDriverState_RunningDebugging. eDriverState_RunningNotDebugging // is normally set when a breakpoint is hit or halted. // eDriverState_RunningDebugging is normally set when "exec-continue" // or "exec-run" is issued. //-- enum DriverState_e { eDriverState_NotRunning = 0, // The MI Driver is not operating eDriverState_Initialising, // The MI Driver is setting itself up eDriverState_RunningNotDebugging, // The MI Driver is operational acting on any MI commands sent to it eDriverState_RunningDebugging, // The MI Driver is currently overseeing an inferior program that is running eDriverState_ShuttingDown, // The MI Driver is tearing down resources and about exit eDriverState_count // Always last }; // Methods: public: // MI system bool Initialize(void); bool Shutdown(void); // MI state bool GetExitApplicationFlag(void) const; DriverState_e GetCurrentDriverState(void) const; bool SetDriverStateRunningNotDebugging(void); bool SetDriverStateRunningDebugging(void); void SetDriverDebuggingArgExecutable(void); bool IsDriverDebuggingArgExecutable(void) const; // MI information about itself const CMIUtilString &GetAppNameShort(void) const; const CMIUtilString &GetAppNameLong(void) const; const CMIUtilString &GetVersionDescription(void) const; // MI do work bool WriteMessageToLog(const CMIUtilString &vMessage); bool SetEnableFallThru(const bool vbYes); bool GetEnableFallThru(void) const; bool InjectMICommand(const CMIUtilString &vMICmd); bool HaveExecutableFileNamePathOnCmdLine(void) const; const CMIUtilString &GetExecutableFileNamePathOnCmdLine(void) const; // Overridden: public: // From CMIDriverMgr::IDriver virtual bool DoInitialize(void); virtual bool DoShutdown(void); virtual bool DoMainLoop(void); virtual void DoResizeWindow(const uint32_t vWindowSizeWsCol); virtual lldb::SBError DoParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting); virtual CMIUtilString GetError(void) const; virtual const CMIUtilString &GetName(void) const; virtual lldb::SBDebugger &GetTheDebugger(void); virtual bool GetDriverIsGDBMICompatibleDriver(void) const; virtual bool SetId(const CMIUtilString &vId); virtual const CMIUtilString &GetId(void) const; // From CMIDriverBase virtual void SetExitApplicationFlag(const bool vbForceExit); virtual bool DoFallThruToAnotherDriver(const CMIUtilString &vCmd, CMIUtilString &vwErrMsg); virtual bool SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver); virtual FILE *GetStdin(void) const; virtual FILE *GetStdout(void) const; virtual FILE *GetStderr(void) const; virtual const CMIUtilString &GetDriverName(void) const; virtual const CMIUtilString &GetDriverId(void) const; // From CMICmnStreamStdin virtual bool ReadLine(const CMIUtilString &vStdInBuffer, bool &vrbYesExit); // Typedefs: private: typedef std::queue QueueStdinLine_t; // Methods: private: /* ctor */ CMIDriver(void); /* ctor */ CMIDriver(const CMIDriver &); void operator=(const CMIDriver &); lldb::SBError ParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting); bool ReadStdinLineQueue(void); bool DoAppQuit(void); bool InterpretCommand(const CMIUtilString &vTextLine); bool InterpretCommandThisDriver(const CMIUtilString &vTextLine, bool &vwbCmdYesValid); bool InterpretCommandFallThruDriver(const CMIUtilString &vTextLine, bool &vwbCmdYesValid); bool ExecuteCommand(const SMICmdData &vCmdData); bool StartWorkerThreads(void); bool StopWorkerThreads(void); bool InitClientIDEToMIDriver(void) const; bool InitClientIDEEclipse(void) const; bool QueueMICommand(const CMIUtilString &vMICmd); bool LocalDebugSessionStartupInjectCommands(void); // Overridden: private: // From CMICmnBase /* dtor */ virtual ~CMIDriver(void); // Attributes: private: static const CMIUtilString ms_constAppNameShort; static const CMIUtilString ms_constAppNameLong; static const CMIUtilString ms_constMIVersion; // bool m_bFallThruToOtherDriverEnabled; // True = yes fall through, false = do not pass on command CMIUtilThreadMutex m_threadMutex; QueueStdinLine_t m_queueStdinLine; // Producer = stdin monitor, consumer = *this driver bool m_bDriverIsExiting; // True = yes, driver told to quit, false = continue working void *m_handleMainThread; // *this driver is run by the main thread CMICmnStreamStdin &m_rStdin; CMICmnLLDBDebugger &m_rLldbDebugger; CMICmnStreamStdout &m_rStdOut; DriverState_e m_eCurrentDriverState; bool m_bHaveExecutableFileNamePathOnCmdLine; // True = Yes executable given as one of the parameters to the MI Driver, false = not found CMIUtilString m_strCmdLineArgExecuteableFileNamePath; bool m_bDriverDebuggingArgExecutable; // True = The MI Driver (MI mode) is debugging executable passed as argument, false = running via // a client i.e Eclipse };