| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 1 | //===-- MICmnLLDBDebugSessionInfo.h -----------------------------*- C++ -*-===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 |  | 
|  | 10 | //++ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 11 | // File:        MICmnLLDBDebugSessionInfo.h | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 12 | // | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 13 | // Overview:    CMICmnLLDBDebugSessionInfo interface. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 14 | // | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 15 | // Environment: Compilers:  Visual C++ 12. | 
|  | 16 | //                          gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 | 
|  | 17 | //              Libraries:  See MIReadmetxt. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 18 | // | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 19 | // Copyright:   None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 20 | //-- | 
|  | 21 |  | 
|  | 22 | #pragma once | 
|  | 23 |  | 
|  | 24 | // Third party headers: | 
|  | 25 | #include <map> | 
|  | 26 | #include <vector> | 
|  | 27 | #include <lldb/API/SBDebugger.h> | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 28 | #include <lldb/API/SBListener.h> | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 29 | #include <lldb/API/SBProcess.h> | 
|  | 30 | #include <lldb/API/SBTarget.h> | 
|  | 31 |  | 
|  | 32 | // In-house headers: | 
|  | 33 | #include "MICmnBase.h" | 
|  | 34 | #include "MIUtilSingletonBase.h" | 
|  | 35 | #include "MICmnLLDBDebugSessionInfoVarObj.h" | 
|  | 36 | #include "MICmnMIValueTuple.h" | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 37 | #include "MIUtilMapIdToVariant.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 38 |  | 
|  | 39 | // Declarations: | 
|  | 40 | class CMICmnLLDBDebugger; | 
|  | 41 | struct SMICmdData; | 
|  | 42 | class CMICmnMIValueTuple; | 
|  | 43 | class CMICmnMIValueList; | 
|  | 44 |  | 
|  | 45 | //++ ============================================================================ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 46 | // Details: MI debug session object that holds debugging information between | 
|  | 47 | //          instances of MI commands executing their work and producing MI | 
|  | 48 | //          result records. Information/data is set by one or many commands then | 
|  | 49 | //          retrieved by the same or other sebsequent commands. | 
|  | 50 | //          It primarily to hold LLDB type objects. | 
|  | 51 | //          A singleton class. | 
|  | 52 | // Gotchas: None. | 
|  | 53 | // Authors: Illya Rudkin 04/03/2014. | 
|  | 54 | // Changes: None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 55 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 56 | class CMICmnLLDBDebugSessionInfo : public CMICmnBase, public MI::ISingleton<CMICmnLLDBDebugSessionInfo> | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 57 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 58 | friend class MI::ISingleton<CMICmnLLDBDebugSessionInfo>; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 59 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 60 | // Structs: | 
|  | 61 | public: | 
|  | 62 | //++ ============================================================================ | 
|  | 63 | // Details: Break point information object. Used to easily pass information about | 
|  | 64 | //          a break around and record break point information to be recalled by | 
|  | 65 | //          other commands or LLDB event handling functions. | 
|  | 66 | //-- | 
|  | 67 | struct SBrkPtInfo | 
|  | 68 | { | 
|  | 69 | SBrkPtInfo(void) | 
|  | 70 | : m_id(0) | 
|  | 71 | , m_bDisp(false) | 
|  | 72 | , m_bEnabled(false) | 
|  | 73 | , m_pc(0) | 
|  | 74 | , m_nLine(0) | 
|  | 75 | , m_bHaveArgOptionThreadGrp(false) | 
|  | 76 | , m_nTimes(0) | 
|  | 77 | , m_bPending(false) | 
|  | 78 | , m_nIgnore(0) | 
|  | 79 | , m_bCondition(false) | 
|  | 80 | , m_bBrkPtThreadId(false) | 
|  | 81 | , m_nBrkPtThreadId(0) | 
|  | 82 | { | 
|  | 83 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 84 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 85 | MIuint m_id;                    // LLDB break point ID. | 
|  | 86 | CMIUtilString m_strType;        // Break point type. | 
|  | 87 | bool m_bDisp;                   // True = "del", false = "keep". | 
|  | 88 | bool m_bEnabled;                // True = enabled, false = disabled break point. | 
|  | 89 | MIuint m_pc;                    // Address number. | 
|  | 90 | CMIUtilString m_fnName;         // Function name. | 
|  | 91 | CMIUtilString m_fileName;       // File name text. | 
|  | 92 | CMIUtilString m_path;           // Full file name and path text. | 
|  | 93 | MIuint m_nLine;                 // File line number. | 
|  | 94 | bool m_bHaveArgOptionThreadGrp; // True = include MI field, false = do not include "thread-groups". | 
|  | 95 | CMIUtilString m_strOptThrdGrp;  // Thread group number. | 
|  | 96 | MIuint m_nTimes;                // The count of the breakpoint existence. | 
|  | 97 | CMIUtilString m_strOrigLoc;     // The name of the break point. | 
|  | 98 | bool m_bPending;                // True = the breakpoint has not been established yet, false = location found | 
|  | 99 | MIuint m_nIgnore;               // The number of time the breakpoint is run over before it is stopped on a hit | 
|  | 100 | bool m_bCondition;              // True = break point is conditional, use condition expression, false = no condition | 
|  | 101 | CMIUtilString m_strCondition;   // Break point condition expression | 
|  | 102 | bool m_bBrkPtThreadId;          // True = break point is specified to work with a specific thread, false = no specified thread given | 
|  | 103 | MIuint m_nBrkPtThreadId;        // Restrict the breakpoint to the specified thread-id | 
|  | 104 | }; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 105 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 106 | // Typedefs: | 
|  | 107 | public: | 
|  | 108 | typedef std::vector<uint32_t> VecActiveThreadId_t; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 109 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 110 | // Methods: | 
|  | 111 | public: | 
|  | 112 | bool Initialize(void); | 
|  | 113 | bool Shutdown(void); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 114 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 115 | // Variant type data which can be assigned and retrieved across all command instances | 
|  | 116 | template <typename T> bool SharedDataAdd(const CMIUtilString &vKey, const T &vData); | 
|  | 117 | template <typename T> bool SharedDataRetrieve(const CMIUtilString &vKey, T &vwData); | 
|  | 118 | bool SharedDataDestroy(void); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 119 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 120 | //  Common command required functionality | 
|  | 121 | bool AccessPath(const CMIUtilString &vPath, bool &vwbYesAccessible); | 
|  | 122 | bool GetFrameInfo(const lldb::SBFrame &vrFrame, lldb::addr_t &vwPc, CMIUtilString &vwFnName, CMIUtilString &vwFileName, | 
|  | 123 | CMIUtilString &vwPath, MIuint &vwnLine); | 
|  | 124 | bool GetThreadFrames(const SMICmdData &vCmdData, const MIuint vThreadIdx, CMIUtilString &vwrThreadFrames); | 
|  | 125 | bool GetThreadFrames2(const SMICmdData &vCmdData, const MIuint vThreadIdx, CMIUtilString &vwrThreadFrames); | 
|  | 126 | bool ResolvePath(const SMICmdData &vCmdData, const CMIUtilString &vPath, CMIUtilString &vwrResolvedPath); | 
|  | 127 | bool ResolvePath(const CMIUtilString &vstrUnknown, CMIUtilString &vwrResolvedPath); | 
|  | 128 | bool MIResponseFormFrameInfo(const lldb::SBThread &vrThread, const MIuint vnLevel, CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 129 | bool MIResponseFormFrameInfo(const lldb::addr_t vPc, const CMIUtilString &vFnName, const CMIUtilString &vFileName, | 
|  | 130 | const CMIUtilString &vPath, const MIuint vnLine, CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 131 | bool MIResponseFormFrameInfo2(const lldb::addr_t vPc, const CMIUtilString &vArgInfo, const CMIUtilString &vFnName, | 
|  | 132 | const CMIUtilString &vFileName, const CMIUtilString &vPath, const MIuint vnLine, | 
|  | 133 | CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 134 | bool MIResponseFormThreadInfo(const SMICmdData &vCmdData, const lldb::SBThread &vrThread, CMICmnMIValueTuple &vwrMIValueTuple); | 
|  | 135 | bool MIResponseFormThreadInfo2(const SMICmdData &vCmdData, const lldb::SBThread &vrThread, CMICmnMIValueTuple &vwrMIValueTuple); | 
|  | 136 | bool MIResponseFormThreadInfo3(const SMICmdData &vCmdData, const lldb::SBThread &vrThread, CMICmnMIValueTuple &vwrMIValueTuple); | 
|  | 137 | bool MIResponseFormVariableInfo(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes, CMICmnMIValueList &vwrMiValueList); | 
|  | 138 | bool MIResponseFormVariableInfo2(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes, CMICmnMIValueList &vwrMiValueList); | 
|  | 139 | bool MIResponseFormVariableInfo3(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes, CMICmnMIValueList &vwrMiValueList); | 
|  | 140 | bool MIResponseFormBrkPtFrameInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 141 | bool MIResponseFormBrkPtInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 142 | bool GetBrkPtInfo(const lldb::SBBreakpoint &vBrkPt, SBrkPtInfo &vrwBrkPtInfo) const; | 
|  | 143 | bool RecordBrkPtInfo(const MIuint vnBrkPtId, const SBrkPtInfo &vrBrkPtInfo); | 
|  | 144 | bool RecordBrkPtInfoGet(const MIuint vnBrkPtId, SBrkPtInfo &vrwBrkPtInfo) const; | 
|  | 145 | bool RecordBrkPtInfoDelete(const MIuint vnBrkPtId); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 146 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 147 | // Attributes: | 
|  | 148 | public: | 
|  | 149 | // The following are available to all command instances | 
|  | 150 | lldb::SBDebugger &m_rLldbDebugger; | 
|  | 151 | lldb::SBListener &m_rLlldbListener; | 
|  | 152 | lldb::SBTarget m_lldbTarget; | 
|  | 153 | lldb::SBProcess m_lldbProcess; | 
|  | 154 | const MIuint m_nBrkPointCntMax; | 
|  | 155 | VecActiveThreadId_t m_vecActiveThreadId; | 
|  | 156 | lldb::tid_t m_currentSelectedThread; | 
|  | 157 |  | 
|  | 158 | // These are keys that can be used to access the shared data map | 
|  | 159 | // Note: This list is expected to grow and will be moved and abstracted in the future. | 
|  | 160 | const CMIUtilString m_constStrSharedDataKeyWkDir; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 161 | const CMIUtilString m_constStrSharedDataSolibPath; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 162 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 163 | // Typedefs: | 
|  | 164 | private: | 
|  | 165 | typedef std::vector<CMICmnLLDBDebugSessionInfoVarObj> VecVarObj_t; | 
|  | 166 | typedef std::map<MIuint, SBrkPtInfo> MapBrkPtIdToBrkPtInfo_t; | 
|  | 167 | typedef std::pair<MIuint, SBrkPtInfo> MapPairBrkPtIdToBrkPtInfo_t; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 168 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 169 | // Methods: | 
|  | 170 | private: | 
|  | 171 | /* ctor */ CMICmnLLDBDebugSessionInfo(void); | 
|  | 172 | /* ctor */ CMICmnLLDBDebugSessionInfo(const CMICmnLLDBDebugSessionInfo &); | 
|  | 173 | void operator=(const CMICmnLLDBDebugSessionInfo &); | 
|  | 174 | // | 
|  | 175 | bool GetVariableInfo(const MIuint vnMaxDepth, const lldb::SBValue &vrValue, const bool vbIsChildValue, | 
|  | 176 | CMICmnMIValueList &vwrMiValueList, MIuint &vrwnDepth); | 
|  | 177 | bool GetVariableInfo2(const MIuint vnMaxDepth, const lldb::SBValue &vrValue, const bool vbIsChildValue, | 
|  | 178 | CMICmnMIValueList &vwrMiValueList, MIuint &vrwnDepth); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 179 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 180 | // Overridden: | 
|  | 181 | private: | 
|  | 182 | // From CMICmnBase | 
|  | 183 | /* dtor */ virtual ~CMICmnLLDBDebugSessionInfo(void); | 
|  | 184 |  | 
|  | 185 | // Attributes: | 
|  | 186 | private: | 
|  | 187 | CMIUtilMapIdToVariant m_mapIdToSessionData; // Hold and retrieve key to value data available across all commands | 
|  | 188 | VecVarObj_t m_vecVarObj;                    // Vector of session variable objects | 
|  | 189 | MapBrkPtIdToBrkPtInfo_t m_mapBrkPtIdToBrkPtInfo; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 190 | }; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 191 |  | 
|  | 192 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 193 | // Details: Command instances can create and share data between other instances of commands. | 
|  | 194 | //          This function adds new data to the shared data. Using the same ID more than | 
|  | 195 | //          once replaces any previous matching data keys. | 
|  | 196 | // Type:    Template method. | 
|  | 197 | // Args:    T       - The type of the object to be stored. | 
|  | 198 | //          vKey    - (R) A non empty unique data key to retrieve the data by. | 
|  | 199 | //          vData   - (R) Data to be added to the share. | 
|  | 200 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 201 | //          MIstatus::failure - Functional failed. | 
|  | 202 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 203 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 204 | template <typename T> | 
|  | 205 | bool | 
|  | 206 | CMICmnLLDBDebugSessionInfo::SharedDataAdd(const CMIUtilString &vKey, const T &vData) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 207 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 208 | if (!m_mapIdToSessionData.Add<T>(vKey, vData)) | 
|  | 209 | { | 
|  | 210 | SetErrorDescription(m_mapIdToSessionData.GetErrorDescription()); | 
|  | 211 | return MIstatus::failure; | 
|  | 212 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 213 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 214 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 215 | } | 
|  | 216 |  | 
|  | 217 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 218 | // Details: Command instances can create and share data between other instances of commands. | 
|  | 219 | //          This function retrieves data from the shared data container. | 
|  | 220 | // Type:    Method. | 
|  | 221 | // Args:    T     - The type of the object being retrieved. | 
|  | 222 | //          vKey  - (R) A non empty unique data key to retrieve the data by. | 
|  | 223 | //          vData - (W) The data. | 
|  | 224 | // Return:  bool  - True = data found, false = data not found or an error occurred trying to fetch. | 
|  | 225 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 226 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 227 | template <typename T> | 
|  | 228 | bool | 
|  | 229 | CMICmnLLDBDebugSessionInfo::SharedDataRetrieve(const CMIUtilString &vKey, T &vwData) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 230 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 231 | bool bDataFound = false; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 232 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 233 | if (!m_mapIdToSessionData.Get<T>(vKey, vwData, bDataFound)) | 
|  | 234 | { | 
|  | 235 | SetErrorDescription(m_mapIdToSessionData.GetErrorDescription()); | 
|  | 236 | return MIstatus::failure; | 
|  | 237 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 238 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame^] | 239 | return bDataFound; | 
|  | 240 | } |