summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-mi/MIDriverMgr.h
blob: d9449277b063162facf5a0117653bd981b12c3cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//===-- MIDriverMgr.h -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

//++
// File:        MIDriverMgr.h
//
// Overview:    CMIImplCmn interface.
//
// Environment: Compilers:  Visual C++ 12.
//                          gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
//              Libraries:  See MIReadme.txt.
//
// Copyright:   None.
//--

#pragma once

// Third party headers:
#include <map>
#include <lldb/API/SBDebugger.h>

// In-house headers:
#include "MICmnBase.h"
#include "MIUtilString.h"
#include "MICmnLog.h"
#include "MIUtilSingletonBase.h"

//++ ============================================================================
// Details: MI Driver Manager. Register lldb::SBBroadcaster derived Driver type
//          objects with *this manager. The manager does not own driver objects
//          registered with it and so will not delete when this manager is
//          shutdown. The Driver flagged as "use this one" will be set as current
//          driver and will be the one that is used. Other drivers are not
//          operated. A Driver can call another Driver should it not handle a
//          command.
//          It also initializes other resources as part it's setup such as the
//          Logger and Resources objects (explicit indicate *this object requires
//          those objects (modules/components) to support it's own functionality).
//          The Driver manager is the first object instantiated as part of the
//          MI code base. It is also the first thing to interpret the command
//          line arguments passed to the executeable. Bases on options it
//          understands the manage will set up the appropriate driver or give
//          help information. Other options are passed on to the driver chosen
//          to do work.
//          Each driver instance (the CMIDriver, LLDB::Driver) has its own
//          LLDB::SBDebugger.
//          Singleton class.
// Gotchas: None.
// Authors: Illya Rudkin 28/02/2014.
// Changes: None.
//--
class CMIDriverMgr : public CMICmnBase, public MI::ISingleton<CMIDriverMgr>
{
    friend MI::ISingleton<CMIDriverMgr>;

    // Class:
  public:
    //++
    // Description: Driver deriver objects need this interface to work with
    //              *this manager.
    //--
    class IDriver
    {
      public:
        virtual bool DoInitialize(void) = 0;
        virtual bool DoShutdown(void) = 0;
        virtual bool DoMainLoop(void) = 0;
        virtual void DoResizeWindow(const uint32_t vWindowSizeWsCol) = 0;
        virtual lldb::SBError DoParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting) = 0;
        virtual CMIUtilString GetError(void) const = 0;
        virtual const CMIUtilString &GetName(void) const = 0;
        virtual lldb::SBDebugger &GetTheDebugger(void) = 0;
        virtual bool GetDriverIsGDBMICompatibleDriver(void) const = 0;
        virtual bool SetId(const CMIUtilString &vId) = 0;
        virtual const CMIUtilString &GetId(void) const = 0;

        // Not part of the interface, ignore
        /* dtor */ virtual ~IDriver(void) {}
    };

    // Methods:
  public:
    // MI system
    bool Initialize(void);
    bool Shutdown(void);
    //
    CMIUtilString GetAppVersion(void) const;
    bool RegisterDriver(const IDriver &vrADriver, const CMIUtilString &vrDriverID);
    bool UnregisterDriver(const IDriver &vrADriver);
    bool
    SetUseThisDriverToDoWork(const IDriver &vrADriver); // Specify working main driver
    IDriver *GetUseThisDriverToDoWork(void) const;
    bool ParseArgs(const int argc, const char *argv[], bool &vwbExiting);
    IDriver *GetDriver(const CMIUtilString &vrDriverId) const;
    //
    // MI Proxy fn to current specified working driver
    bool DriverMainLoop(void);
    void DriverResizeWindow(const uint32_t vWindowSizeWsCol);
    bool DriverParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting);
    CMIUtilString DriverGetError(void) const;
    CMIUtilString DriverGetName(void) const;
    lldb::SBDebugger *DriverGetTheDebugger(void);

    // Typedef:
  private:
    typedef std::map<CMIUtilString, IDriver *> MapDriverIdToDriver_t;
    typedef std::pair<CMIUtilString, IDriver *> MapPairDriverIdToDriver_t;

    // Methods:
  private:
    /* ctor */ CMIDriverMgr(void);
    /* ctor */ CMIDriverMgr(const CMIDriverMgr &);
    void operator=(const CMIDriverMgr &);
    //
    bool HaveDriverAlready(const IDriver &vrMedium) const;
    bool UnregisterDriverAll(void);
    IDriver *GetFirstMIDriver(void) const;
    IDriver *GetFirstNonMIDriver(void) const;
    CMIUtilString GetHelpOnCmdLineArgOptions(void) const;

    // Overridden:
  private:
    // From CMICmnBase
    /* dtor */ virtual ~CMIDriverMgr(void);

    // Attributes:
  private:
    MapDriverIdToDriver_t m_mapDriverIdToDriver;
    IDriver *m_pDriverCurrent; // This driver is used by this manager to do work. It is the main driver.
    bool m_bInMi2Mode;         // True = --interpreter entered on the cmd line, false = operate LLDB driver (non GDB)
};
OpenPOWER on IntegriCloud