//===-- MIDriver.h ----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #pragma once // Third party headers #include // In-house headers: #include "MICmdData.h" #include "MICmnBase.h" #include "MICmnConfig.h" #include "MICmnStreamStdin.h" #include "MIDriverBase.h" #include "MIDriverMgr.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. //-- class CMIDriver : public CMICmnBase, public CMIDriverMgr::IDriver, public CMIDriverBase, public MI::ISingleton { friend class MI::ISingleton; // Enumerations: public: //++ ---------------------------------------------------------------------- // Details: The MI Driver has a running state which is used to help determine // 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() override; bool Shutdown() override; // MI state bool GetExitApplicationFlag() const; DriverState_e GetCurrentDriverState() const; bool SetDriverStateRunningNotDebugging(); bool SetDriverStateRunningDebugging(); void SetDriverDebuggingArgExecutable(); bool IsDriverDebuggingArgExecutable() const; // MI information about itself const CMIUtilString &GetAppNameShort() const; const CMIUtilString &GetAppNameLong() const; const CMIUtilString &GetVersionDescription() const; // MI do work bool WriteMessageToLog(const CMIUtilString &vMessage); bool SetEnableFallThru(const bool vbYes); bool GetEnableFallThru() const; bool HaveExecutableFileNamePathOnCmdLine() const; const CMIUtilString &GetExecutableFileNamePathOnCmdLine() const; // Overridden: public: // From CMIDriverMgr::IDriver bool DoInitialize() override; bool DoShutdown() override; bool DoMainLoop() override; lldb::SBError DoParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting) override; CMIUtilString GetError() const override; const CMIUtilString &GetName() const override; lldb::SBDebugger &GetTheDebugger() override; bool GetDriverIsGDBMICompatibleDriver() const override; bool SetId(const CMIUtilString &vId) override; const CMIUtilString &GetId() const override; // From CMIDriverBase void SetExitApplicationFlag(const bool vbForceExit) override; bool DoFallThruToAnotherDriver(const CMIUtilString &vCmd, CMIUtilString &vwErrMsg) override; bool SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver) override; FILE *GetStdin() const override; FILE *GetStdout() const override; FILE *GetStderr() const override; const CMIUtilString &GetDriverName() const override; const CMIUtilString &GetDriverId() const override; void DeliverSignal(int signal) override; // Typedefs: private: typedef std::queue QueueStdinLine_t; // Methods: private: /* ctor */ CMIDriver(); /* ctor */ CMIDriver(const CMIDriver &); void operator=(const CMIDriver &); lldb::SBError ParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting); bool DoAppQuit(); bool InterpretCommand(const CMIUtilString &vTextLine); bool InterpretCommandThisDriver(const CMIUtilString &vTextLine, bool &vwbCmdYesValid); CMIUtilString WrapCLICommandIntoMICommand(const CMIUtilString &vTextLine) const; bool InterpretCommandFallThruDriver(const CMIUtilString &vTextLine, bool &vwbCmdYesValid); bool ExecuteCommand(const SMICmdData &vCmdData); bool StartWorkerThreads(); bool StopWorkerThreads(); bool InitClientIDEToMIDriver() const; bool InitClientIDEEclipse() const; bool LocalDebugSessionStartupExecuteCommands(); bool ExecuteCommandFile(const bool vbAsyncMode); // Overridden: private: // From CMICmnBase /* dtor */ ~CMIDriver() override; // 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; 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 (e.g. Eclipse) bool m_bHaveCommandFileNamePathOnCmdLine; // True = file with initial commands // given as one of the parameters to // the MI Driver, false = not found CMIUtilString m_strCmdLineArgCommandFileNamePath; };