forked from OSchip/llvm-project
182 lines
7.2 KiB
C++
182 lines
7.2 KiB
C++
//===-- 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 <queue>
|
|
|
|
// 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<CMIDriver> {
|
|
friend class MI::ISingleton<CMIDriver>;
|
|
|
|
// 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<CMIUtilString> 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;
|
|
};
|