aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MIDriver.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MIDriver.h')
-rw-r--r--tools/lldb-mi/MIDriver.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/tools/lldb-mi/MIDriver.h b/tools/lldb-mi/MIDriver.h
new file mode 100644
index 000000000000..c565e825096e
--- /dev/null
+++ b/tools/lldb-mi/MIDriver.h
@@ -0,0 +1,182 @@
+//===-- 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 <queue>
+
+// 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< CMIDriver >
+{
+ friend class MI::ISingleton< CMIDriver >;
+
+// 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< CMIUtilString > 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
+};