| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 1 | //===-- MICmdCmdData.cpp ----------------------------------------*- 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:        MICmdCmdData.cpp | 
| 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:    CMICmdCmdDataEvaluateExpression     implementation. | 
|  | 14 | //              CMICmdCmdDataDisassemble            implementation. | 
|  | 15 | //              CMICmdCmdDataReadMemoryBytes        implementation. | 
|  | 16 | //              CMICmdCmdDataReadMemory             implementation. | 
|  | 17 | //              CMICmdCmdDataListRegisterNames      implementation. | 
|  | 18 | //              CMICmdCmdDataListRegisterValues     implementation. | 
|  | 19 | //              CMICmdCmdDataListRegisterChanged    implementation. | 
|  | 20 | //              CMICmdCmdDataWriteMemoryBytes       implementation. | 
|  | 21 | //              CMICmdCmdDataWriteMemory            implementation. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 22 | // | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 23 | // Environment: Compilers:  Visual C++ 12. | 
|  | 24 | //                          gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 | 
|  | 25 | //              Libraries:  See MIReadmetxt. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 26 | // | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 27 | // Copyright:   None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 28 | //-- | 
|  | 29 |  | 
|  | 30 | // Third Party Headers: | 
| Greg Clayton | ee3626e | 2015-01-20 00:04:26 +0000 | [diff] [blame] | 31 | #include "lldb/API/SBThread.h" | 
|  | 32 | #include "lldb/API/SBInstruction.h" | 
|  | 33 | #include "lldb/API/SBInstructionList.h" | 
|  | 34 | #include "lldb/API/SBStream.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 35 |  | 
|  | 36 | // In-house headers: | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 37 | #include "MICmdCmdData.h" | 
|  | 38 | #include "MICmnMIResultRecord.h" | 
|  | 39 | #include "MICmnMIValueConst.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 40 | #include "MICmnLLDBDebugger.h" | 
|  | 41 | #include "MICmnLLDBDebugSessionInfo.h" | 
|  | 42 | #include "MICmnLLDBProxySBValue.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 43 | #include "MICmdArgValNumber.h" | 
|  | 44 | #include "MICmdArgValString.h" | 
|  | 45 | #include "MICmdArgValThreadGrp.h" | 
|  | 46 | #include "MICmdArgValOptionLong.h" | 
|  | 47 | #include "MICmdArgValOptionShort.h" | 
|  | 48 | #include "MICmdArgValListOfN.h" | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 49 | #include "MICmdArgValConsume.h" | 
|  | 50 | #include "MICmnLLDBDebugSessionInfoVarObj.h" | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 51 | #include "MICmnLLDBUtilSBValue.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 52 |  | 
|  | 53 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 54 | // Details: CMICmdCmdDataEvaluateExpression constructor. | 
|  | 55 | // Type:    Method. | 
|  | 56 | // Args:    None. | 
|  | 57 | // Return:  None. | 
|  | 58 | // Throws:  None. | 
| 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 | CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression(void) | 
|  | 61 | : m_bExpressionValid(true) | 
|  | 62 | , m_bEvaluatedExpression(true) | 
|  | 63 | , m_strValue("??") | 
|  | 64 | , m_bCompositeVarType(false) | 
|  | 65 | , m_bFoundInvalidChar(false) | 
|  | 66 | , m_cExpressionInvalidChar(0x00) | 
|  | 67 | , m_constStrArgThread("thread") | 
|  | 68 | , m_constStrArgFrame("frame") | 
|  | 69 | , m_constStrArgExpr("expr") | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 70 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 71 | // Command factory matches this name with that received from the stdin stream | 
|  | 72 | m_strMiCmd = "data-evaluate-expression"; | 
|  | 73 |  | 
|  | 74 | // Required by the CMICmdFactory when registering *this command | 
|  | 75 | m_pSelfCreatorFn = &CMICmdCmdDataEvaluateExpression::CreateSelf; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 76 | } | 
|  | 77 |  | 
|  | 78 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 79 | // Details: CMICmdCmdDataEvaluateExpression destructor. | 
|  | 80 | // Type:    Overrideable. | 
|  | 81 | // Args:    None. | 
|  | 82 | // Return:  None. | 
|  | 83 | // Throws:  None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 84 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 85 | CMICmdCmdDataEvaluateExpression::~CMICmdCmdDataEvaluateExpression(void) | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 86 | { | 
|  | 87 | } | 
|  | 88 |  | 
|  | 89 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 90 | // Details: The invoker requires this function. The parses the command line options | 
|  | 91 | //          arguments to extract values for each of those arguments. | 
|  | 92 | // Type:    Overridden. | 
|  | 93 | // Args:    None. | 
|  | 94 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 95 | //          MIstatus::failure - Functional failed. | 
|  | 96 | // Throws:  None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 97 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 98 | bool | 
|  | 99 | CMICmdCmdDataEvaluateExpression::ParseArgs(void) | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 100 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 101 | bool bOk = | 
|  | 102 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 103 | bOk = bOk && | 
|  | 104 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgFrame, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 105 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgExpr, true, true, true, true))); | 
|  | 106 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 107 | } | 
|  | 108 |  | 
|  | 109 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 110 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 111 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 112 | // Type:    Overridden. | 
|  | 113 | // Args:    None. | 
|  | 114 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 115 | //          MIstatus::failure - Functional failed. | 
|  | 116 | // Throws:  None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 117 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 118 | bool | 
|  | 119 | CMICmdCmdDataEvaluateExpression::Execute(void) | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 120 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 121 | CMICMDBASE_GETOPTION(pArgExpr, String, m_constStrArgExpr); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 122 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 123 | const CMIUtilString &rExpression(pArgExpr->GetValue()); | 
|  | 124 | CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 125 | lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); | 
|  | 126 | lldb::SBThread thread = sbProcess.GetSelectedThread(); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 127 | m_bExpressionValid = (thread.GetNumFrames() > 0); | 
|  | 128 | if (!m_bExpressionValid) | 
|  | 129 | return MIstatus::success; | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 130 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 131 | lldb::SBFrame frame = thread.GetSelectedFrame(); | 
|  | 132 | lldb::SBValue value = frame.EvaluateExpression(rExpression.c_str()); | 
|  | 133 | if (!value.IsValid()) | 
|  | 134 | value = frame.FindVariable(rExpression.c_str()); | 
|  | 135 | if (!value.IsValid()) | 
|  | 136 | { | 
|  | 137 | m_bEvaluatedExpression = false; | 
|  | 138 | return MIstatus::success; | 
|  | 139 | } | 
|  | 140 | const CMICmnLLDBUtilSBValue utilValue(value); | 
|  | 141 | if (!utilValue.HasName()) | 
|  | 142 | { | 
|  | 143 | if (HaveInvalidCharacterInExpression(rExpression, m_cExpressionInvalidChar)) | 
|  | 144 | { | 
|  | 145 | m_bFoundInvalidChar = true; | 
|  | 146 | return MIstatus::success; | 
|  | 147 | } | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 148 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 149 | m_strValue = rExpression; | 
|  | 150 | return MIstatus::success; | 
|  | 151 | } | 
|  | 152 | if (rExpression.IsQuoted()) | 
|  | 153 | { | 
|  | 154 | m_strValue = rExpression.Trim('\"'); | 
|  | 155 | return MIstatus::success; | 
|  | 156 | } | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 157 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 158 | MIuint64 nNumber = 0; | 
|  | 159 | if (CMICmnLLDBProxySBValue::GetValueAsUnsigned(value, nNumber) == MIstatus::success) | 
|  | 160 | { | 
|  | 161 | const lldb::ValueType eValueType = value.GetValueType(); | 
|  | 162 | MIunused(eValueType); | 
|  | 163 | m_strValue = utilValue.GetValue(); | 
|  | 164 | CMIUtilString strCString; | 
|  | 165 | if (CMICmnLLDBProxySBValue::GetCString(value, strCString)) | 
|  | 166 | { | 
|  | 167 | m_strValue += CMIUtilString::Format(" '%s'", strCString.c_str()); | 
|  | 168 | } | 
|  | 169 | return MIstatus::success; | 
|  | 170 | } | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 171 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 172 | // Composite type i.e. struct | 
|  | 173 | m_bCompositeVarType = true; | 
|  | 174 | const MIuint nChild = value.GetNumChildren(); | 
|  | 175 | for (MIuint i = 0; i < nChild; i++) | 
|  | 176 | { | 
|  | 177 | lldb::SBValue member = value.GetChildAtIndex(i); | 
|  | 178 | const bool bValid = member.IsValid(); | 
|  | 179 | CMIUtilString strType(MIRSRC(IDS_WORD_UNKNOWNTYPE_BRKTS)); | 
|  | 180 | if (bValid) | 
|  | 181 | { | 
|  | 182 | const CMIUtilString strValue( | 
|  | 183 | CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(member, CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural)); | 
|  | 184 | const char *pTypeName = member.GetName(); | 
|  | 185 | if (pTypeName != nullptr) | 
|  | 186 | strType = pTypeName; | 
|  | 187 |  | 
|  | 188 | // MI print "{variable = 1, variable2 = 3, variable3 = 5}" | 
|  | 189 | const bool bNoQuotes = true; | 
|  | 190 | const CMICmnMIValueConst miValueConst(strValue, bNoQuotes); | 
|  | 191 | const bool bUseSpaces = true; | 
|  | 192 | const CMICmnMIValueResult miValueResult(strType, miValueConst, bUseSpaces); | 
|  | 193 | m_miValueTuple.Add(miValueResult, bUseSpaces); | 
|  | 194 | } | 
|  | 195 | } | 
|  | 196 |  | 
|  | 197 | return MIstatus::success; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 198 | } | 
|  | 199 |  | 
|  | 200 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 201 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 202 | //          for the work carried out in the Execute(). | 
|  | 203 | // Type:    Overridden. | 
|  | 204 | // Args:    None. | 
|  | 205 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 206 | //          MIstatus::failure - Functional failed. | 
|  | 207 | // Throws:  None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 208 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 209 | bool | 
|  | 210 | CMICmdCmdDataEvaluateExpression::Acknowledge(void) | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 211 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 212 | if (m_bExpressionValid) | 
|  | 213 | { | 
|  | 214 | if (m_bEvaluatedExpression) | 
|  | 215 | { | 
|  | 216 | if (m_bCompositeVarType) | 
|  | 217 | { | 
|  | 218 | const CMICmnMIValueConst miValueConst(m_miValueTuple.GetString()); | 
|  | 219 | const CMICmnMIValueResult miValueResult("value", miValueConst); | 
|  | 220 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); | 
|  | 221 | m_miResultRecord = miRecordResult; | 
|  | 222 | return MIstatus::success; | 
|  | 223 | } | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 224 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 225 | if (m_bFoundInvalidChar) | 
|  | 226 | { | 
|  | 227 | const CMICmnMIValueConst miValueConst( | 
|  | 228 | CMIUtilString::Format("Invalid character '%c' in expression", m_cExpressionInvalidChar)); | 
|  | 229 | const CMICmnMIValueResult miValueResult("msg", miValueConst); | 
|  | 230 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult); | 
|  | 231 | m_miResultRecord = miRecordResult; | 
|  | 232 | return MIstatus::success; | 
|  | 233 | } | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 234 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 235 | const CMICmnMIValueConst miValueConst(m_strValue); | 
|  | 236 | const CMICmnMIValueResult miValueResult("value", miValueConst); | 
|  | 237 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); | 
|  | 238 | m_miResultRecord = miRecordResult; | 
|  | 239 | return MIstatus::success; | 
|  | 240 | } | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 241 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 242 | const CMICmnMIValueConst miValueConst("Could not evaluate expression"); | 
|  | 243 | const CMICmnMIValueResult miValueResult("msg", miValueConst); | 
|  | 244 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult); | 
|  | 245 | m_miResultRecord = miRecordResult; | 
|  | 246 | return MIstatus::success; | 
|  | 247 | } | 
|  | 248 |  | 
|  | 249 | const CMICmnMIValueConst miValueConst("Invalid expression"); | 
|  | 250 | const CMICmnMIValueResult miValueResult("msg", miValueConst); | 
|  | 251 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult); | 
|  | 252 | m_miResultRecord = miRecordResult; | 
|  | 253 |  | 
|  | 254 | return MIstatus::success; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 255 | } | 
|  | 256 |  | 
|  | 257 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 258 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 259 | //          calls this function to create an instance of *this command. | 
|  | 260 | // Type:    Static method. | 
|  | 261 | // Args:    None. | 
|  | 262 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 263 | // Throws:  None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 264 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 265 | CMICmdBase * | 
|  | 266 | CMICmdCmdDataEvaluateExpression::CreateSelf(void) | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 267 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 268 | return new CMICmdCmdDataEvaluateExpression(); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 269 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 270 |  | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 271 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 272 | // Details: Examine the expression string to see if it contains invalid characters. | 
|  | 273 | // Type:    Method. | 
|  | 274 | // Args:    vrExpr          - (R) Expression string given to *this command. | 
|  | 275 | //          vrwInvalidChar  - (W) True = Invalid character found, false = nothing found. | 
|  | 276 | // Return:  bool - True = Invalid character found, false = nothing found. | 
|  | 277 | // Throws:  None. | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 278 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 279 | bool | 
|  | 280 | CMICmdCmdDataEvaluateExpression::HaveInvalidCharacterInExpression(const CMIUtilString &vrExpr, MIchar &vrwInvalidChar) | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 281 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 282 | bool bFoundInvalidCharInExpression = false; | 
|  | 283 | vrwInvalidChar = 0x00; | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 284 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 285 | if (vrExpr.at(0) == '\\') | 
|  | 286 | { | 
|  | 287 | // Example: Mouse hover over "%5d" expression has \"%5d\" in it | 
|  | 288 | bFoundInvalidCharInExpression = true; | 
|  | 289 | vrwInvalidChar = '\\'; | 
|  | 290 | } | 
|  | 291 |  | 
|  | 292 | return bFoundInvalidCharInExpression; | 
| Deepak Panickal | d249928 | 2014-08-08 16:47:42 +0000 | [diff] [blame] | 293 | } | 
|  | 294 |  | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 295 | //--------------------------------------------------------------------------------------- | 
|  | 296 | //--------------------------------------------------------------------------------------- | 
|  | 297 | //--------------------------------------------------------------------------------------- | 
|  | 298 |  | 
|  | 299 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 300 | // Details: CMICmdCmdDataDisassemble constructor. | 
|  | 301 | // Type:    Method. | 
|  | 302 | // Args:    None. | 
|  | 303 | // Return:  None. | 
|  | 304 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 305 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 306 | CMICmdCmdDataDisassemble::CMICmdCmdDataDisassemble(void) | 
|  | 307 | : m_constStrArgThread("thread") | 
|  | 308 | , m_constStrArgAddrStart("s") | 
|  | 309 | , m_constStrArgAddrEnd("e") | 
|  | 310 | , m_constStrArgConsume("--") | 
|  | 311 | , m_constStrArgMode("mode") | 
|  | 312 | , m_miValueList(true) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 313 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 314 | // Command factory matches this name with that received from the stdin stream | 
|  | 315 | m_strMiCmd = "data-disassemble"; | 
|  | 316 |  | 
|  | 317 | // Required by the CMICmdFactory when registering *this command | 
|  | 318 | m_pSelfCreatorFn = &CMICmdCmdDataDisassemble::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 319 | } | 
|  | 320 |  | 
|  | 321 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 322 | // Details: CMICmdCmdDataDisassemble destructor. | 
|  | 323 | // Type:    Overrideable. | 
|  | 324 | // Args:    None. | 
|  | 325 | // Return:  None. | 
|  | 326 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 327 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 328 | CMICmdCmdDataDisassemble::~CMICmdCmdDataDisassemble(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 329 | { | 
|  | 330 | } | 
|  | 331 |  | 
|  | 332 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 333 | // Details: The invoker requires this function. The parses the command line options | 
|  | 334 | //          arguments to extract values for each of those arguments. | 
|  | 335 | // Type:    Overridden. | 
|  | 336 | // Args:    None. | 
|  | 337 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 338 | //          MIstatus::failure - Functional failed. | 
|  | 339 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 340 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 341 | bool | 
|  | 342 | CMICmdCmdDataDisassemble::ParseArgs(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 343 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 344 | bool bOk = | 
| Hafiz Abid Qadeer | 54ba124 | 2015-02-02 12:17:33 +0000 | [diff] [blame] | 345 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 346 | bOk = bOk && | 
|  | 347 | m_setCmdArgs.Add( | 
|  | 348 | *(new CMICmdArgValOptionShort(m_constStrArgAddrStart, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1))); | 
|  | 349 | bOk = bOk && | 
|  | 350 | m_setCmdArgs.Add( | 
|  | 351 | *(new CMICmdArgValOptionShort(m_constStrArgAddrEnd, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1))); | 
|  | 352 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValConsume(m_constStrArgConsume, true))); | 
|  | 353 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgMode, true, true))); | 
|  | 354 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 355 | } | 
|  | 356 |  | 
|  | 357 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 358 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 359 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 360 | // Type:    Overridden. | 
|  | 361 | // Args:    None. | 
|  | 362 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 363 | //          MIstatus::failure - Functional failed. | 
|  | 364 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 365 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 366 | bool | 
|  | 367 | CMICmdCmdDataDisassemble::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 368 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 369 | CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); | 
|  | 370 | CMICMDBASE_GETOPTION(pArgAddrStart, OptionShort, m_constStrArgAddrStart); | 
|  | 371 | CMICMDBASE_GETOPTION(pArgAddrEnd, OptionShort, m_constStrArgAddrEnd); | 
|  | 372 | CMICMDBASE_GETOPTION(pArgMode, Number, m_constStrArgMode); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 373 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 374 | // Retrieve the --thread option's thread ID (only 1) | 
|  | 375 | MIuint64 nThreadId = UINT64_MAX; | 
| Hafiz Abid Qadeer | 54ba124 | 2015-02-02 12:17:33 +0000 | [diff] [blame] | 376 | if (pArgThread->GetFound() && !pArgThread->GetExpectedOption<CMICmdArgValNumber, MIuint64>(nThreadId)) | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 377 | { | 
|  | 378 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), m_cmdData.strMiCmd.c_str(), m_constStrArgThread.c_str())); | 
|  | 379 | return MIstatus::failure; | 
|  | 380 | } | 
|  | 381 | CMIUtilString strAddrStart; | 
|  | 382 | if (!pArgAddrStart->GetExpectedOption<CMICmdArgValString, CMIUtilString>(strAddrStart)) | 
|  | 383 | { | 
|  | 384 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_DISASM_ADDR_START_INVALID), m_cmdData.strMiCmd.c_str(), | 
|  | 385 | m_constStrArgAddrStart.c_str())); | 
|  | 386 | return MIstatus::failure; | 
|  | 387 | } | 
|  | 388 | MIint64 nAddrStart = 0; | 
|  | 389 | if (!strAddrStart.ExtractNumber(nAddrStart)) | 
|  | 390 | { | 
|  | 391 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_DISASM_ADDR_START_INVALID), m_cmdData.strMiCmd.c_str(), | 
|  | 392 | m_constStrArgAddrStart.c_str())); | 
|  | 393 | return MIstatus::failure; | 
|  | 394 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 395 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 396 | CMIUtilString strAddrEnd; | 
|  | 397 | if (!pArgAddrEnd->GetExpectedOption<CMICmdArgValString, CMIUtilString>(strAddrEnd)) | 
|  | 398 | { | 
|  | 399 | SetError( | 
|  | 400 | CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_DISASM_ADDR_END_INVALID), m_cmdData.strMiCmd.c_str(), m_constStrArgAddrEnd.c_str())); | 
|  | 401 | return MIstatus::failure; | 
|  | 402 | } | 
|  | 403 | MIint64 nAddrEnd = 0; | 
|  | 404 | if (!strAddrEnd.ExtractNumber(nAddrEnd)) | 
|  | 405 | { | 
|  | 406 | SetError( | 
|  | 407 | CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_DISASM_ADDR_END_INVALID), m_cmdData.strMiCmd.c_str(), m_constStrArgAddrEnd.c_str())); | 
|  | 408 | return MIstatus::failure; | 
|  | 409 | } | 
|  | 410 | const MIuint nDisasmMode = pArgMode->GetValue(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 411 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 412 | CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 413 | lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 414 | lldb::addr_t lldbStartAddr = static_cast<lldb::addr_t>(nAddrStart); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 415 | lldb::SBInstructionList instructions = sbTarget.ReadInstructions(lldb::SBAddress(lldbStartAddr, sbTarget), nAddrEnd - nAddrStart); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 416 | const MIuint nInstructions = instructions.GetSize(); | 
|  | 417 | for (size_t i = 0; i < nInstructions; i++) | 
|  | 418 | { | 
|  | 419 | const MIchar *pUnknown = "??"; | 
|  | 420 | lldb::SBInstruction instrt = instructions.GetInstructionAtIndex(i); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 421 | const MIchar *pStrMnemonic = instrt.GetMnemonic(sbTarget); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 422 | pStrMnemonic = (pStrMnemonic != nullptr) ? pStrMnemonic : pUnknown; | 
|  | 423 | lldb::SBAddress address = instrt.GetAddress(); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 424 | lldb::addr_t addr = address.GetLoadAddress(sbTarget); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 425 | const MIchar *pFnName = address.GetFunction().GetName(); | 
|  | 426 | pFnName = (pFnName != nullptr) ? pFnName : pUnknown; | 
|  | 427 | lldb::addr_t addrOffSet = address.GetOffset(); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 428 | const MIchar *pStrOperands = instrt.GetOperands(sbTarget); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 429 | pStrOperands = (pStrOperands != nullptr) ? pStrOperands : pUnknown; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 430 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 431 | // MI "{address=\"0x%08llx\",func-name=\"%s\",offset=\"%lld\",inst=\"%s %s\"}" | 
|  | 432 | const CMICmnMIValueConst miValueConst(CMIUtilString::Format("0x%08llx", addr)); | 
|  | 433 | const CMICmnMIValueResult miValueResult("address", miValueConst); | 
|  | 434 | CMICmnMIValueTuple miValueTuple(miValueResult); | 
|  | 435 | const CMICmnMIValueConst miValueConst2(pFnName); | 
|  | 436 | const CMICmnMIValueResult miValueResult2("func-name", miValueConst2); | 
|  | 437 | miValueTuple.Add(miValueResult2); | 
|  | 438 | const CMICmnMIValueConst miValueConst3(CMIUtilString::Format("0x%lld", addrOffSet)); | 
|  | 439 | const CMICmnMIValueResult miValueResult3("offset", miValueConst3); | 
|  | 440 | miValueTuple.Add(miValueResult3); | 
|  | 441 | const CMICmnMIValueConst miValueConst4(CMIUtilString::Format("%s %s", pStrMnemonic, pStrOperands)); | 
|  | 442 | const CMICmnMIValueResult miValueResult4("inst", miValueConst4); | 
|  | 443 | miValueTuple.Add(miValueResult4); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 444 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 445 | if (nDisasmMode == 1) | 
|  | 446 | { | 
|  | 447 | lldb::SBLineEntry lineEntry = address.GetLineEntry(); | 
|  | 448 | const MIuint nLine = lineEntry.GetLine(); | 
|  | 449 | const MIchar *pFileName = lineEntry.GetFileSpec().GetFilename(); | 
|  | 450 | pFileName = (pFileName != nullptr) ? pFileName : pUnknown; | 
|  | 451 |  | 
|  | 452 | // MI "src_and_asm_line={line=\"%u\",file=\"%s\",line_asm_insn=[ ]}" | 
|  | 453 | const CMICmnMIValueConst miValueConst(CMIUtilString::Format("0x%u", nLine)); | 
|  | 454 | const CMICmnMIValueResult miValueResult("line", miValueConst); | 
|  | 455 | CMICmnMIValueTuple miValueTuple2(miValueResult); | 
|  | 456 | const CMICmnMIValueConst miValueConst2(pFileName); | 
|  | 457 | const CMICmnMIValueResult miValueResult2("file", miValueConst2); | 
|  | 458 | miValueTuple2.Add(miValueResult2); | 
|  | 459 | const CMICmnMIValueList miValueList(miValueTuple); | 
|  | 460 | const CMICmnMIValueResult miValueResult3("line_asm_insn", miValueList); | 
|  | 461 | miValueTuple2.Add(miValueResult3); | 
|  | 462 | const CMICmnMIValueResult miValueResult4("src_and_asm_line", miValueTuple2); | 
|  | 463 | m_miValueList.Add(miValueResult4); | 
|  | 464 | } | 
|  | 465 | else | 
|  | 466 | { | 
|  | 467 | m_miValueList.Add(miValueTuple); | 
|  | 468 | } | 
|  | 469 | } | 
|  | 470 |  | 
|  | 471 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 472 | } | 
|  | 473 |  | 
|  | 474 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 475 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 476 | //          for the work carried out in the Execute(). | 
|  | 477 | // Type:    Overridden. | 
|  | 478 | // Args:    None. | 
|  | 479 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 480 | //          MIstatus::failure - Functional failed. | 
|  | 481 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 482 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 483 | bool | 
|  | 484 | CMICmdCmdDataDisassemble::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 485 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 486 | const CMICmnMIValueResult miValueResult("asm_insns", m_miValueList); | 
|  | 487 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); | 
|  | 488 | m_miResultRecord = miRecordResult; | 
|  | 489 |  | 
|  | 490 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 491 | } | 
|  | 492 |  | 
|  | 493 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 494 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 495 | //          calls this function to create an instance of *this command. | 
|  | 496 | // Type:    Static method. | 
|  | 497 | // Args:    None. | 
|  | 498 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 499 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 500 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 501 | CMICmdBase * | 
|  | 502 | CMICmdCmdDataDisassemble::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 503 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 504 | return new CMICmdCmdDataDisassemble(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 505 | } | 
|  | 506 |  | 
|  | 507 | //--------------------------------------------------------------------------------------- | 
|  | 508 | //--------------------------------------------------------------------------------------- | 
|  | 509 | //--------------------------------------------------------------------------------------- | 
|  | 510 |  | 
|  | 511 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 512 | // Details: CMICmdCmdDataReadMemoryBytes constructor. | 
|  | 513 | // Type:    Method. | 
|  | 514 | // Args:    None. | 
|  | 515 | // Return:  None. | 
|  | 516 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 517 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 518 | CMICmdCmdDataReadMemoryBytes::CMICmdCmdDataReadMemoryBytes(void) | 
|  | 519 | : m_constStrArgThread("thread") | 
|  | 520 | , m_constStrArgByteOffset("o") | 
|  | 521 | , m_constStrArgAddrStart("address") | 
|  | 522 | , m_constStrArgNumBytes("count") | 
|  | 523 | , m_pBufferMemory(nullptr) | 
|  | 524 | , m_nAddrStart(0) | 
|  | 525 | , m_nAddrNumBytesToRead(0) | 
|  | 526 | , m_nAddrOffset(0) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 527 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 528 | // Command factory matches this name with that received from the stdin stream | 
|  | 529 | m_strMiCmd = "data-read-memory-bytes"; | 
|  | 530 |  | 
|  | 531 | // Required by the CMICmdFactory when registering *this command | 
|  | 532 | m_pSelfCreatorFn = &CMICmdCmdDataReadMemoryBytes::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 533 | } | 
|  | 534 |  | 
|  | 535 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 536 | // Details: CMICmdCmdDataReadMemoryBytes destructor. | 
|  | 537 | // Type:    Overrideable. | 
|  | 538 | // Args:    None. | 
|  | 539 | // Return:  None. | 
|  | 540 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 541 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 542 | CMICmdCmdDataReadMemoryBytes::~CMICmdCmdDataReadMemoryBytes(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 543 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 544 | if (m_pBufferMemory != nullptr) | 
|  | 545 | { | 
|  | 546 | delete[] m_pBufferMemory; | 
|  | 547 | m_pBufferMemory = nullptr; | 
|  | 548 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 549 | } | 
|  | 550 |  | 
|  | 551 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 552 | // Details: The invoker requires this function. The parses the command line options | 
|  | 553 | //          arguments to extract values for each of those arguments. | 
|  | 554 | // Type:    Overridden. | 
|  | 555 | // Args:    None. | 
|  | 556 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 557 | //          MIstatus::failure - Functional failed. | 
|  | 558 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 559 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 560 | bool | 
|  | 561 | CMICmdCmdDataReadMemoryBytes::ParseArgs(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 562 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 563 | bool bOk = | 
|  | 564 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 565 | bOk = | 
|  | 566 | bOk && | 
|  | 567 | m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgByteOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 568 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgAddrStart, true, true))); | 
|  | 569 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgNumBytes, true, true))); | 
|  | 570 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 571 | } | 
|  | 572 |  | 
|  | 573 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 574 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 575 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 576 | // Type:    Overridden. | 
|  | 577 | // Args:    None. | 
|  | 578 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 579 | //          MIstatus::failure - Functional failed. | 
|  | 580 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 581 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 582 | bool | 
|  | 583 | CMICmdCmdDataReadMemoryBytes::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 584 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 585 | CMICMDBASE_GETOPTION(pArgAddrStart, Number, m_constStrArgAddrStart); | 
|  | 586 | CMICMDBASE_GETOPTION(pArgAddrOffset, Number, m_constStrArgByteOffset); | 
|  | 587 | CMICMDBASE_GETOPTION(pArgNumBytes, Number, m_constStrArgNumBytes); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 588 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 589 | const MIuint64 nAddrStart = pArgAddrStart->GetValue(); | 
|  | 590 | const MIuint64 nAddrNumBytes = pArgNumBytes->GetValue(); | 
|  | 591 | if (pArgAddrOffset->GetFound()) | 
|  | 592 | m_nAddrOffset = pArgAddrOffset->GetValue(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 593 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 594 | m_pBufferMemory = new MIuchar[nAddrNumBytes]; | 
|  | 595 | if (m_pBufferMemory == nullptr) | 
|  | 596 | { | 
|  | 597 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_MEMORY_ALLOC_FAILURE), m_cmdData.strMiCmd.c_str(), nAddrNumBytes)); | 
|  | 598 | return MIstatus::failure; | 
|  | 599 | } | 
|  | 600 |  | 
|  | 601 | CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 602 | lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 603 | lldb::SBError error; | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 604 | const MIuint64 nReadBytes = sbProcess.ReadMemory(static_cast<lldb::addr_t>(nAddrStart), (void *)m_pBufferMemory, nAddrNumBytes, error); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 605 | if (nReadBytes != nAddrNumBytes) | 
|  | 606 | { | 
|  | 607 | SetError( | 
|  | 608 | CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_NOT_READ_WHOLE_BLK), m_cmdData.strMiCmd.c_str(), nAddrNumBytes, nAddrStart)); | 
|  | 609 | return MIstatus::failure; | 
|  | 610 | } | 
|  | 611 | if (error.Fail()) | 
|  | 612 | { | 
|  | 613 | lldb::SBStream err; | 
|  | 614 | const bool bOk = error.GetDescription(err); | 
|  | 615 | MIunused(bOk); | 
|  | 616 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_READ_MEM_BYTES), m_cmdData.strMiCmd.c_str(), nAddrNumBytes, nAddrStart, | 
|  | 617 | err.GetData())); | 
|  | 618 | return MIstatus::failure; | 
|  | 619 | } | 
|  | 620 |  | 
|  | 621 | m_nAddrStart = nAddrStart; | 
|  | 622 | m_nAddrNumBytesToRead = nAddrNumBytes; | 
|  | 623 |  | 
|  | 624 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 625 | } | 
|  | 626 |  | 
|  | 627 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 628 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 629 | //          for the work carried out in the Execute(). | 
|  | 630 | // Type:    Overridden. | 
|  | 631 | // Args:    None. | 
|  | 632 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 633 | //          MIstatus::failure - Functional failed. | 
|  | 634 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 635 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 636 | bool | 
|  | 637 | CMICmdCmdDataReadMemoryBytes::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 638 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 639 | // MI: memory=[{begin=\"0x%08x\",offset=\"0x%08x\",end=\"0x%08x\",contents=\" \" }]" | 
|  | 640 | const CMICmnMIValueConst miValueConst(CMIUtilString::Format("0x%08x", m_nAddrStart)); | 
|  | 641 | const CMICmnMIValueResult miValueResult("begin", miValueConst); | 
|  | 642 | CMICmnMIValueTuple miValueTuple(miValueResult); | 
|  | 643 | const CMICmnMIValueConst miValueConst2(CMIUtilString::Format("0x%08x", m_nAddrOffset)); | 
|  | 644 | const CMICmnMIValueResult miValueResult2("offset", miValueConst2); | 
|  | 645 | miValueTuple.Add(miValueResult2); | 
|  | 646 | const CMICmnMIValueConst miValueConst3(CMIUtilString::Format("0x%08x", m_nAddrStart + m_nAddrNumBytesToRead)); | 
|  | 647 | const CMICmnMIValueResult miValueResult3("end", miValueConst3); | 
|  | 648 | miValueTuple.Add(miValueResult3); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 649 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 650 | // MI: contents=\" \" | 
|  | 651 | CMIUtilString strContent; | 
|  | 652 | strContent.reserve((m_nAddrNumBytesToRead << 1) + 1); | 
|  | 653 | for (MIuint64 i = 0; i < m_nAddrNumBytesToRead; i++) | 
|  | 654 | { | 
|  | 655 | strContent += CMIUtilString::Format("%02x", m_pBufferMemory[i]); | 
|  | 656 | } | 
|  | 657 | const CMICmnMIValueConst miValueConst4(strContent); | 
|  | 658 | const CMICmnMIValueResult miValueResult4("contents", miValueConst4); | 
|  | 659 | miValueTuple.Add(miValueResult4); | 
|  | 660 | const CMICmnMIValueList miValueList(miValueTuple); | 
|  | 661 | const CMICmnMIValueResult miValueResult5("memory", miValueList); | 
|  | 662 |  | 
|  | 663 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult5); | 
|  | 664 | m_miResultRecord = miRecordResult; | 
|  | 665 |  | 
|  | 666 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 667 | } | 
|  | 668 |  | 
|  | 669 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 670 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 671 | //          calls this function to create an instance of *this command. | 
|  | 672 | // Type:    Static method. | 
|  | 673 | // Args:    None. | 
|  | 674 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 675 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 676 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 677 | CMICmdBase * | 
|  | 678 | CMICmdCmdDataReadMemoryBytes::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 679 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 680 | return new CMICmdCmdDataReadMemoryBytes(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 681 | } | 
|  | 682 |  | 
|  | 683 | //--------------------------------------------------------------------------------------- | 
|  | 684 | //--------------------------------------------------------------------------------------- | 
|  | 685 | //--------------------------------------------------------------------------------------- | 
|  | 686 |  | 
|  | 687 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 688 | // Details: CMICmdCmdDataReadMemory constructor. | 
|  | 689 | // Type:    Method. | 
|  | 690 | // Args:    None. | 
|  | 691 | // Return:  None. | 
|  | 692 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 693 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 694 | CMICmdCmdDataReadMemory::CMICmdCmdDataReadMemory(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 695 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 696 | // Command factory matches this name with that received from the stdin stream | 
|  | 697 | m_strMiCmd = "data-read-memory"; | 
|  | 698 |  | 
|  | 699 | // Required by the CMICmdFactory when registering *this command | 
|  | 700 | m_pSelfCreatorFn = &CMICmdCmdDataReadMemory::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 701 | } | 
|  | 702 |  | 
|  | 703 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 704 | // Details: CMICmdCmdDataReadMemory destructor. | 
|  | 705 | // Type:    Overrideable. | 
|  | 706 | // Args:    None. | 
|  | 707 | // Return:  None. | 
|  | 708 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 709 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 710 | CMICmdCmdDataReadMemory::~CMICmdCmdDataReadMemory(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 711 | { | 
|  | 712 | } | 
|  | 713 |  | 
|  | 714 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 715 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 716 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 717 | // Type:    Overridden. | 
|  | 718 | // Args:    None. | 
|  | 719 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 720 | //          MIstatus::failure - Functional failed. | 
|  | 721 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 722 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 723 | bool | 
|  | 724 | CMICmdCmdDataReadMemory::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 725 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 726 | // Do nothing - command deprecated use "data-read-memory-bytes" command | 
|  | 727 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 728 | } | 
|  | 729 |  | 
|  | 730 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 731 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 732 | //          for the work carried out in the Execute(). | 
|  | 733 | // Type:    Overridden. | 
|  | 734 | // Args:    None. | 
|  | 735 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 736 | //          MIstatus::failure - Functional failed. | 
|  | 737 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 738 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 739 | bool | 
|  | 740 | CMICmdCmdDataReadMemory::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 741 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 742 | // Command CMICmdCmdSupportListFeatures sends "data-read-memory-bytes" which causes this command not to be called | 
|  | 743 | const CMICmnMIValueConst miValueConst(MIRSRC(IDS_CMD_ERR_NOT_IMPLEMENTED_DEPRECATED)); | 
|  | 744 | const CMICmnMIValueResult miValueResult("msg", miValueConst); | 
|  | 745 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult); | 
|  | 746 | m_miResultRecord = miRecordResult; | 
|  | 747 |  | 
|  | 748 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 749 | } | 
|  | 750 |  | 
|  | 751 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 752 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 753 | //          calls this function to create an instance of *this command. | 
|  | 754 | // Type:    Static method. | 
|  | 755 | // Args:    None. | 
|  | 756 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 757 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 758 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 759 | CMICmdBase * | 
|  | 760 | CMICmdCmdDataReadMemory::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 761 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 762 | return new CMICmdCmdDataReadMemory(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 763 | } | 
|  | 764 |  | 
|  | 765 | //--------------------------------------------------------------------------------------- | 
|  | 766 | //--------------------------------------------------------------------------------------- | 
|  | 767 | //--------------------------------------------------------------------------------------- | 
|  | 768 |  | 
|  | 769 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 770 | // Details: CMICmdCmdDataListRegisterNames constructor. | 
|  | 771 | // Type:    Method. | 
|  | 772 | // Args:    None. | 
|  | 773 | // Return:  None. | 
|  | 774 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 775 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 776 | CMICmdCmdDataListRegisterNames::CMICmdCmdDataListRegisterNames(void) | 
|  | 777 | : m_constStrArgThreadGroup("thread-group") | 
|  | 778 | , m_constStrArgRegNo("regno") | 
|  | 779 | , m_miValueList(true) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 780 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 781 | // Command factory matches this name with that received from the stdin stream | 
|  | 782 | m_strMiCmd = "data-list-register-names"; | 
|  | 783 |  | 
|  | 784 | // Required by the CMICmdFactory when registering *this command | 
|  | 785 | m_pSelfCreatorFn = &CMICmdCmdDataListRegisterNames::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 786 | } | 
|  | 787 |  | 
|  | 788 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 789 | // Details: CMICmdCmdDataReadMemoryBytes destructor. | 
|  | 790 | // Type:    Overrideable. | 
|  | 791 | // Args:    None. | 
|  | 792 | // Return:  None. | 
|  | 793 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 794 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 795 | CMICmdCmdDataListRegisterNames::~CMICmdCmdDataListRegisterNames(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 796 | { | 
|  | 797 | } | 
|  | 798 |  | 
|  | 799 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 800 | // Details: The invoker requires this function. The parses the command line options | 
|  | 801 | //          arguments to extract values for each of those arguments. | 
|  | 802 | // Type:    Overridden. | 
|  | 803 | // Args:    None. | 
|  | 804 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 805 | //          MIstatus::failure - Functional failed. | 
|  | 806 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 807 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 808 | bool | 
|  | 809 | CMICmdCmdDataListRegisterNames::ParseArgs(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 810 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 811 | bool bOk = m_setCmdArgs.Add( | 
|  | 812 | *(new CMICmdArgValOptionLong(m_constStrArgThreadGroup, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1))); | 
|  | 813 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValListOfN(m_constStrArgRegNo, false, false, CMICmdArgValListBase::eArgValType_Number))); | 
|  | 814 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 815 | } | 
|  | 816 |  | 
|  | 817 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 818 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 819 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 820 | // Type:    Overridden. | 
|  | 821 | // Args:    None. | 
|  | 822 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 823 | //          MIstatus::failure - Functional failed. | 
|  | 824 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 825 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 826 | bool | 
|  | 827 | CMICmdCmdDataListRegisterNames::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 828 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 829 | CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 830 | lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); | 
| Hafiz Abid Qadeer | 6a814ad | 2015-02-05 14:57:07 +0000 | [diff] [blame] | 831 | if (!sbProcess.IsValid()) | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 832 | { | 
|  | 833 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str())); | 
|  | 834 | return MIstatus::failure; | 
|  | 835 | } | 
|  | 836 |  | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 837 | lldb::SBThread thread = sbProcess.GetSelectedThread(); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 838 | lldb::SBFrame frame = thread.GetSelectedFrame(); | 
|  | 839 | lldb::SBValueList registers = frame.GetRegisters(); | 
|  | 840 | const MIuint nRegisters = registers.GetSize(); | 
|  | 841 | for (MIuint i = 0; i < nRegisters; i++) | 
|  | 842 | { | 
|  | 843 | lldb::SBValue value = registers.GetValueAtIndex(i); | 
|  | 844 | const MIuint nRegChildren = value.GetNumChildren(); | 
|  | 845 | for (MIuint j = 0; j < nRegChildren; j++) | 
|  | 846 | { | 
|  | 847 | lldb::SBValue value2 = value.GetChildAtIndex(j); | 
|  | 848 | if (value2.IsValid()) | 
|  | 849 | { | 
|  | 850 | const CMICmnMIValueConst miValueConst(CMICmnLLDBUtilSBValue(value2).GetName()); | 
|  | 851 | m_miValueList.Add(miValueConst); | 
|  | 852 | } | 
|  | 853 | } | 
|  | 854 | } | 
|  | 855 |  | 
|  | 856 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 857 | } | 
|  | 858 |  | 
|  | 859 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 860 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 861 | //          for the work carried out in the Execute(). | 
|  | 862 | // Type:    Overridden. | 
|  | 863 | // Args:    None. | 
|  | 864 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 865 | //          MIstatus::failure - Functional failed. | 
|  | 866 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 867 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 868 | bool | 
|  | 869 | CMICmdCmdDataListRegisterNames::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 870 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 871 | const CMICmnMIValueResult miValueResult("register-names", m_miValueList); | 
|  | 872 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); | 
|  | 873 | m_miResultRecord = miRecordResult; | 
|  | 874 |  | 
|  | 875 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 876 | } | 
|  | 877 |  | 
|  | 878 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 879 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 880 | //          calls this function to create an instance of *this command. | 
|  | 881 | // Type:    Static method. | 
|  | 882 | // Args:    None. | 
|  | 883 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 884 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 885 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 886 | CMICmdBase * | 
|  | 887 | CMICmdCmdDataListRegisterNames::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 888 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 889 | return new CMICmdCmdDataListRegisterNames(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 890 | } | 
|  | 891 |  | 
|  | 892 | //--------------------------------------------------------------------------------------- | 
|  | 893 | //--------------------------------------------------------------------------------------- | 
|  | 894 | //--------------------------------------------------------------------------------------- | 
|  | 895 |  | 
|  | 896 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 897 | // Details: CMICmdCmdDataListRegisterValues constructor. | 
|  | 898 | // Type:    Method. | 
|  | 899 | // Args:    None. | 
|  | 900 | // Return:  None. | 
|  | 901 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 902 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 903 | CMICmdCmdDataListRegisterValues::CMICmdCmdDataListRegisterValues(void) | 
|  | 904 | : m_constStrArgThread("thread") | 
|  | 905 | , m_constStrArgSkip("skip-unavailable") | 
|  | 906 | , m_constStrArgFormat("fmt") | 
|  | 907 | , m_constStrArgRegNo("regno") | 
|  | 908 | , m_miValueList(true) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 909 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 910 | // Command factory matches this name with that received from the stdin stream | 
|  | 911 | m_strMiCmd = "data-list-register-values"; | 
|  | 912 |  | 
|  | 913 | // Required by the CMICmdFactory when registering *this command | 
|  | 914 | m_pSelfCreatorFn = &CMICmdCmdDataListRegisterValues::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 915 | } | 
|  | 916 |  | 
|  | 917 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 918 | // Details: CMICmdCmdDataListRegisterValues destructor. | 
|  | 919 | // Type:    Overrideable. | 
|  | 920 | // Args:    None. | 
|  | 921 | // Return:  None. | 
|  | 922 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 923 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 924 | CMICmdCmdDataListRegisterValues::~CMICmdCmdDataListRegisterValues(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 925 | { | 
|  | 926 | } | 
|  | 927 |  | 
|  | 928 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 929 | // Details: The invoker requires this function. The parses the command line options | 
|  | 930 | //          arguments to extract values for each of those arguments. | 
|  | 931 | // Type:    Overridden. | 
|  | 932 | // Args:    None. | 
|  | 933 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 934 | //          MIstatus::failure - Functional failed. | 
|  | 935 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 936 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 937 | bool | 
|  | 938 | CMICmdCmdDataListRegisterValues::ParseArgs(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 939 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 940 | bool bOk = | 
|  | 941 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 942 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgSkip, false, false))); | 
|  | 943 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgFormat, true, true))); | 
|  | 944 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValListOfN(m_constStrArgRegNo, false, true, CMICmdArgValListBase::eArgValType_Number))); | 
|  | 945 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 946 | } | 
|  | 947 |  | 
|  | 948 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 949 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 950 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 951 | // Type:    Overridden. | 
|  | 952 | // Args:    None. | 
|  | 953 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 954 | //          MIstatus::failure - Functional failed. | 
|  | 955 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 956 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 957 | bool | 
|  | 958 | CMICmdCmdDataListRegisterValues::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 959 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 960 | CMICMDBASE_GETOPTION(pArgFormat, String, m_constStrArgFormat); | 
|  | 961 | CMICMDBASE_GETOPTION(pArgRegNo, ListOfN, m_constStrArgRegNo); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 962 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 963 | const CMIUtilString &rStrFormat(pArgFormat->GetValue()); | 
|  | 964 | if (rStrFormat.length() != 1) | 
|  | 965 | { | 
|  | 966 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_FORMAT_TYPE), m_cmdData.strMiCmd.c_str(), rStrFormat.c_str())); | 
|  | 967 | return MIstatus::failure; | 
|  | 968 | } | 
|  | 969 | const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e eFormat = CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForChar(rStrFormat[0]); | 
|  | 970 | if (eFormat == CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid) | 
|  | 971 | { | 
|  | 972 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_FORMAT_TYPE), m_cmdData.strMiCmd.c_str(), rStrFormat.c_str())); | 
|  | 973 | return MIstatus::failure; | 
|  | 974 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 975 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 976 | CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 977 | lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); | 
|  | 978 | if (!sbProcess.IsValid()) | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 979 | { | 
|  | 980 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str())); | 
|  | 981 | return MIstatus::failure; | 
|  | 982 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 983 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 984 | const CMICmdArgValListBase::VecArgObjPtr_t &rVecRegNo(pArgRegNo->GetExpectedOptions()); | 
|  | 985 | CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecRegNo.begin(); | 
|  | 986 | while (it != rVecRegNo.end()) | 
|  | 987 | { | 
|  | 988 | const CMICmdArgValNumber *pRegNo = static_cast<CMICmdArgValNumber *>(*it); | 
|  | 989 | const MIuint nReg = pRegNo->GetValue(); | 
|  | 990 | lldb::SBValue regValue = GetRegister(nReg); | 
|  | 991 | const CMIUtilString strRegValue(CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(regValue, eFormat)); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 992 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 993 | const CMICmnMIValueConst miValueConst(CMIUtilString::Format("%u", nReg)); | 
|  | 994 | const CMICmnMIValueResult miValueResult("number", miValueConst); | 
|  | 995 | CMICmnMIValueTuple miValueTuple(miValueResult); | 
|  | 996 | const CMICmnMIValueConst miValueConst2(strRegValue); | 
|  | 997 | const CMICmnMIValueResult miValueResult2("value", miValueConst2); | 
|  | 998 | miValueTuple.Add(miValueResult2); | 
|  | 999 | m_miValueList.Add(miValueTuple); | 
|  | 1000 |  | 
|  | 1001 | // Next | 
|  | 1002 | ++it; | 
|  | 1003 | } | 
|  | 1004 |  | 
|  | 1005 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1006 | } | 
|  | 1007 |  | 
|  | 1008 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1009 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 1010 | //          for the work carried out in the Execute(). | 
|  | 1011 | // Type:    Overridden. | 
|  | 1012 | // Args:    None. | 
|  | 1013 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1014 | //          MIstatus::failure - Functional failed. | 
|  | 1015 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1016 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1017 | bool | 
|  | 1018 | CMICmdCmdDataListRegisterValues::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1019 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1020 | const CMICmnMIValueResult miValueResult("register-values", m_miValueList); | 
|  | 1021 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); | 
|  | 1022 | m_miResultRecord = miRecordResult; | 
|  | 1023 |  | 
|  | 1024 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1025 | } | 
|  | 1026 |  | 
|  | 1027 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1028 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 1029 | //          calls this function to create an instance of *this command. | 
|  | 1030 | // Type:    Static method. | 
|  | 1031 | // Args:    None. | 
|  | 1032 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 1033 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1034 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1035 | CMICmdBase * | 
|  | 1036 | CMICmdCmdDataListRegisterValues::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1037 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1038 | return new CMICmdCmdDataListRegisterValues(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1039 | } | 
|  | 1040 |  | 
|  | 1041 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1042 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 1043 | //          calls this function to create an instance of *this command. | 
|  | 1044 | // Type:    Method. | 
|  | 1045 | // Args:    None. | 
|  | 1046 | // Return:  lldb::SBValue - LLDB SBValue object. | 
|  | 1047 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1048 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1049 | lldb::SBValue | 
|  | 1050 | CMICmdCmdDataListRegisterValues::GetRegister(const MIuint vRegisterIndex) const | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1051 | { | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 1052 | lldb::SBThread thread = CMICmnLLDBDebugSessionInfo::Instance().GetProcess().GetSelectedThread(); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1053 | lldb::SBFrame frame = thread.GetSelectedFrame(); | 
|  | 1054 | lldb::SBValueList registers = frame.GetRegisters(); | 
|  | 1055 | const MIuint nRegisters = registers.GetSize(); | 
|  | 1056 | for (MIuint i = 0; i < nRegisters; i++) | 
|  | 1057 | { | 
|  | 1058 | lldb::SBValue value = registers.GetValueAtIndex(i); | 
|  | 1059 | const MIuint nRegChildren = value.GetNumChildren(); | 
|  | 1060 | if (nRegChildren > 0) | 
|  | 1061 | { | 
|  | 1062 | lldb::SBValue value2 = value.GetChildAtIndex(vRegisterIndex); | 
|  | 1063 | if (value2.IsValid()) | 
|  | 1064 | { | 
|  | 1065 | return value2; | 
|  | 1066 | } | 
|  | 1067 | } | 
|  | 1068 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1069 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1070 | return lldb::SBValue(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1071 | } | 
|  | 1072 |  | 
|  | 1073 | //--------------------------------------------------------------------------------------- | 
|  | 1074 | //--------------------------------------------------------------------------------------- | 
|  | 1075 | //--------------------------------------------------------------------------------------- | 
|  | 1076 |  | 
|  | 1077 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1078 | // Details: CMICmdCmdDataListRegisterChanged constructor. | 
|  | 1079 | // Type:    Method. | 
|  | 1080 | // Args:    None. | 
|  | 1081 | // Return:  None. | 
|  | 1082 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1083 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1084 | CMICmdCmdDataListRegisterChanged::CMICmdCmdDataListRegisterChanged(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1085 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1086 | // Command factory matches this name with that received from the stdin stream | 
|  | 1087 | m_strMiCmd = "data-list-changed-registers"; | 
|  | 1088 |  | 
|  | 1089 | // Required by the CMICmdFactory when registering *this command | 
|  | 1090 | m_pSelfCreatorFn = &CMICmdCmdDataListRegisterChanged::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1091 | } | 
|  | 1092 |  | 
|  | 1093 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1094 | // Details: CMICmdCmdDataListRegisterChanged destructor. | 
|  | 1095 | // Type:    Overrideable. | 
|  | 1096 | // Args:    None. | 
|  | 1097 | // Return:  None. | 
|  | 1098 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1099 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1100 | CMICmdCmdDataListRegisterChanged::~CMICmdCmdDataListRegisterChanged(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1101 | { | 
|  | 1102 | } | 
|  | 1103 |  | 
|  | 1104 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1105 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 1106 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 1107 | // Type:    Overridden. | 
|  | 1108 | // Args:    None. | 
|  | 1109 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1110 | //          MIstatus::failure - Functional failed. | 
|  | 1111 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1112 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1113 | bool | 
|  | 1114 | CMICmdCmdDataListRegisterChanged::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1115 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1116 | // Do nothing | 
|  | 1117 |  | 
|  | 1118 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1119 | } | 
|  | 1120 |  | 
|  | 1121 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1122 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 1123 | //          for the work carried out in the Execute(). | 
|  | 1124 | // Type:    Overridden. | 
|  | 1125 | // Args:    None. | 
|  | 1126 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1127 | //          MIstatus::failure - Functional failed. | 
|  | 1128 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1129 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1130 | bool | 
|  | 1131 | CMICmdCmdDataListRegisterChanged::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1132 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1133 | const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); | 
|  | 1134 | const CMICmnMIValueResult miValueResult("msg", miValueConst); | 
|  | 1135 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult); | 
|  | 1136 | m_miResultRecord = miRecordResult; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1137 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1138 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1139 | } | 
|  | 1140 |  | 
|  | 1141 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1142 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 1143 | //          calls this function to create an instance of *this command. | 
|  | 1144 | // Type:    Static method. | 
|  | 1145 | // Args:    None. | 
|  | 1146 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 1147 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1148 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1149 | CMICmdBase * | 
|  | 1150 | CMICmdCmdDataListRegisterChanged::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1151 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1152 | return new CMICmdCmdDataListRegisterChanged(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1153 | } | 
|  | 1154 |  | 
|  | 1155 | //--------------------------------------------------------------------------------------- | 
|  | 1156 | //--------------------------------------------------------------------------------------- | 
|  | 1157 | //--------------------------------------------------------------------------------------- | 
|  | 1158 |  | 
|  | 1159 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1160 | // Details: CMICmdCmdDataWriteMemoryBytes constructor. | 
|  | 1161 | // Type:    Method. | 
|  | 1162 | // Args:    None. | 
|  | 1163 | // Return:  None. | 
|  | 1164 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1165 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1166 | CMICmdCmdDataWriteMemoryBytes::CMICmdCmdDataWriteMemoryBytes(void) | 
|  | 1167 | : m_constStrArgThread("thread") | 
|  | 1168 | , m_constStrArgAddr("address") | 
|  | 1169 | , m_constStrArgContents("contents") | 
|  | 1170 | , m_constStrArgCount("count") | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1171 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1172 | // Command factory matches this name with that received from the stdin stream | 
|  | 1173 | m_strMiCmd = "data-write-memory-bytes"; | 
|  | 1174 |  | 
|  | 1175 | // Required by the CMICmdFactory when registering *this command | 
|  | 1176 | m_pSelfCreatorFn = &CMICmdCmdDataWriteMemoryBytes::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1177 | } | 
|  | 1178 |  | 
|  | 1179 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1180 | // Details: CMICmdCmdDataWriteMemoryBytes destructor. | 
|  | 1181 | // Type:    Overrideable. | 
|  | 1182 | // Args:    None. | 
|  | 1183 | // Return:  None. | 
|  | 1184 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1185 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1186 | CMICmdCmdDataWriteMemoryBytes::~CMICmdCmdDataWriteMemoryBytes(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1187 | { | 
|  | 1188 | } | 
|  | 1189 |  | 
|  | 1190 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1191 | // Details: The invoker requires this function. The parses the command line options | 
|  | 1192 | //          arguments to extract values for each of those arguments. | 
|  | 1193 | // Type:    Overridden. | 
|  | 1194 | // Args:    None. | 
|  | 1195 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1196 | //          MIstatus::failure - Functional failed. | 
|  | 1197 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1198 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1199 | bool | 
|  | 1200 | CMICmdCmdDataWriteMemoryBytes::ParseArgs(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1201 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1202 | bool bOk = | 
|  | 1203 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 1204 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgAddr, true, true, false, true))); | 
|  | 1205 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgContents, true, true, true, true))); | 
|  | 1206 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgCount, false, true, false, true))); | 
|  | 1207 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1208 | } | 
|  | 1209 |  | 
|  | 1210 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1211 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 1212 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 1213 | // Type:    Overridden. | 
|  | 1214 | // Args:    None. | 
|  | 1215 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1216 | //          MIstatus::failure - Functional failed. | 
|  | 1217 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1218 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1219 | bool | 
|  | 1220 | CMICmdCmdDataWriteMemoryBytes::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1221 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1222 | // Do nothing - not reproduceable (yet) in Eclipse | 
|  | 1223 | // CMICMDBASE_GETOPTION( pArgOffset, OptionShort, m_constStrArgOffset ); | 
|  | 1224 | // CMICMDBASE_GETOPTION( pArgAddr, String, m_constStrArgAddr ); | 
|  | 1225 | // CMICMDBASE_GETOPTION( pArgNumber, String, m_constStrArgNumber ); | 
|  | 1226 | // CMICMDBASE_GETOPTION( pArgContents, String, m_constStrArgContents ); | 
|  | 1227 | // | 
|  | 1228 | // Numbers extracts as string types as they could be hex numbers | 
|  | 1229 | // '&' is not recognised and so has to be removed | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1230 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1231 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1232 | } | 
|  | 1233 |  | 
|  | 1234 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1235 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 1236 | //          for the work carried out in the Execute(). | 
|  | 1237 | // Type:    Overridden. | 
|  | 1238 | // Args:    None. | 
|  | 1239 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1240 | //          MIstatus::failure - Functional failed. | 
|  | 1241 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1242 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1243 | bool | 
|  | 1244 | CMICmdCmdDataWriteMemoryBytes::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1245 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1246 | const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); | 
|  | 1247 | const CMICmnMIValueResult miValueResult("msg", miValueConst); | 
|  | 1248 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult); | 
|  | 1249 | m_miResultRecord = miRecordResult; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1250 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1251 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1252 | } | 
|  | 1253 |  | 
|  | 1254 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1255 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 1256 | //          calls this function to create an instance of *this command. | 
|  | 1257 | // Type:    Static method. | 
|  | 1258 | // Args:    None. | 
|  | 1259 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 1260 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1261 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1262 | CMICmdBase * | 
|  | 1263 | CMICmdCmdDataWriteMemoryBytes::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1264 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1265 | return new CMICmdCmdDataWriteMemoryBytes(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1266 | } | 
|  | 1267 |  | 
|  | 1268 | //--------------------------------------------------------------------------------------- | 
|  | 1269 | //--------------------------------------------------------------------------------------- | 
|  | 1270 | //--------------------------------------------------------------------------------------- | 
|  | 1271 |  | 
|  | 1272 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1273 | // Details: CMICmdCmdDataWriteMemory constructor. | 
|  | 1274 | // Type:    Method. | 
|  | 1275 | // Args:    None. | 
|  | 1276 | // Return:  None. | 
|  | 1277 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1278 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1279 | CMICmdCmdDataWriteMemory::CMICmdCmdDataWriteMemory(void) | 
|  | 1280 | : m_constStrArgThread("thread") | 
|  | 1281 | , m_constStrArgOffset("o") | 
|  | 1282 | , m_constStrArgAddr("address") | 
|  | 1283 | , m_constStrArgD("d") | 
|  | 1284 | , m_constStrArgNumber("a number") | 
|  | 1285 | , m_constStrArgContents("contents") | 
|  | 1286 | , m_nAddr(0) | 
|  | 1287 | , m_nCount(0) | 
|  | 1288 | , m_pBufferMemory(nullptr) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1289 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1290 | // Command factory matches this name with that received from the stdin stream | 
|  | 1291 | m_strMiCmd = "data-write-memory"; | 
|  | 1292 |  | 
|  | 1293 | // Required by the CMICmdFactory when registering *this command | 
|  | 1294 | m_pSelfCreatorFn = &CMICmdCmdDataWriteMemory::CreateSelf; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1295 | } | 
|  | 1296 |  | 
|  | 1297 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1298 | // Details: CMICmdCmdDataWriteMemory destructor. | 
|  | 1299 | // Type:    Overrideable. | 
|  | 1300 | // Args:    None. | 
|  | 1301 | // Return:  None. | 
|  | 1302 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1303 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1304 | CMICmdCmdDataWriteMemory::~CMICmdCmdDataWriteMemory(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1305 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1306 | if (m_pBufferMemory != nullptr) | 
|  | 1307 | { | 
|  | 1308 | delete[] m_pBufferMemory; | 
|  | 1309 | m_pBufferMemory = nullptr; | 
|  | 1310 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1311 | } | 
|  | 1312 |  | 
|  | 1313 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1314 | // Details: The invoker requires this function. The parses the command line options | 
|  | 1315 | //          arguments to extract values for each of those arguments. | 
|  | 1316 | // Type:    Overridden. | 
|  | 1317 | // Args:    None. | 
|  | 1318 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1319 | //          MIstatus::failure - Functional failed. | 
|  | 1320 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1321 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1322 | bool | 
|  | 1323 | CMICmdCmdDataWriteMemory::ParseArgs(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1324 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1325 | bool bOk = | 
|  | 1326 | m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 1327 | bOk = bOk && | 
|  | 1328 | m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); | 
|  | 1329 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgAddr, true, true))); | 
|  | 1330 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgD, true, true))); | 
|  | 1331 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgNumber, true, true))); | 
|  | 1332 | bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgContents, true, true))); | 
|  | 1333 | return (bOk && ParseValidateCmdOptions()); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1334 | } | 
|  | 1335 |  | 
|  | 1336 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1337 | // Details: The invoker requires this function. The command does work in this function. | 
|  | 1338 | //          The command is likely to communicate with the LLDB SBDebugger in here. | 
|  | 1339 | // Type:    Overridden. | 
|  | 1340 | // Args:    None. | 
|  | 1341 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1342 | //          MIstatus::failure - Functional failed. | 
|  | 1343 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1344 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1345 | bool | 
|  | 1346 | CMICmdCmdDataWriteMemory::Execute(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1347 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1348 | CMICMDBASE_GETOPTION(pArgOffset, OptionShort, m_constStrArgOffset); | 
|  | 1349 | CMICMDBASE_GETOPTION(pArgAddr, Number, m_constStrArgAddr); | 
|  | 1350 | CMICMDBASE_GETOPTION(pArgNumber, Number, m_constStrArgNumber); | 
|  | 1351 | CMICMDBASE_GETOPTION(pArgContents, Number, m_constStrArgContents); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1352 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1353 | MIuint nAddrOffset = 0; | 
|  | 1354 | if (pArgOffset->GetFound() && !pArgOffset->GetExpectedOption<CMICmdArgValNumber, MIuint>(nAddrOffset)) | 
|  | 1355 | { | 
|  | 1356 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_INVALID), m_cmdData.strMiCmd.c_str(), m_constStrArgAddr.c_str())); | 
|  | 1357 | return MIstatus::failure; | 
|  | 1358 | } | 
|  | 1359 | m_nAddr = pArgAddr->GetValue(); | 
|  | 1360 | m_nCount = pArgNumber->GetValue(); | 
|  | 1361 | const MIuint64 nValue = pArgContents->GetValue(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1362 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1363 | m_pBufferMemory = new MIuchar[m_nCount]; | 
|  | 1364 | if (m_pBufferMemory == nullptr) | 
|  | 1365 | { | 
|  | 1366 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_MEMORY_ALLOC_FAILURE), m_cmdData.strMiCmd.c_str(), m_nCount)); | 
|  | 1367 | return MIstatus::failure; | 
|  | 1368 | } | 
|  | 1369 | *m_pBufferMemory = static_cast<MIchar>(nValue); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1370 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1371 | CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 1372 | lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1373 | lldb::SBError error; | 
|  | 1374 | lldb::addr_t addr = static_cast<lldb::addr_t>(m_nAddr + nAddrOffset); | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 1375 | const size_t nBytesWritten = sbProcess.WriteMemory(addr, (const void *)m_pBufferMemory, (size_t)m_nCount, error); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1376 | if (nBytesWritten != static_cast<size_t>(m_nCount)) | 
|  | 1377 | { | 
|  | 1378 | SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_NOT_WRITE_WHOLEBLK), m_cmdData.strMiCmd.c_str(), m_nCount, addr)); | 
|  | 1379 | return MIstatus::failure; | 
|  | 1380 | } | 
|  | 1381 | if (error.Fail()) | 
|  | 1382 | { | 
|  | 1383 | lldb::SBStream err; | 
|  | 1384 | const bool bOk = error.GetDescription(err); | 
|  | 1385 | MIunused(bOk); | 
|  | 1386 | SetError( | 
|  | 1387 | CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_WRITE_MEM_BYTES), m_cmdData.strMiCmd.c_str(), m_nCount, addr, err.GetData())); | 
|  | 1388 | return MIstatus::failure; | 
|  | 1389 | } | 
|  | 1390 |  | 
|  | 1391 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1392 | } | 
|  | 1393 |  | 
|  | 1394 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1395 | // Details: The invoker requires this function. The command prepares a MI Record Result | 
|  | 1396 | //          for the work carried out in the Execute(). | 
|  | 1397 | // Type:    Overridden. | 
|  | 1398 | // Args:    None. | 
|  | 1399 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 1400 | //          MIstatus::failure - Functional failed. | 
|  | 1401 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1402 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1403 | bool | 
|  | 1404 | CMICmdCmdDataWriteMemory::Acknowledge(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1405 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1406 | const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); | 
|  | 1407 | m_miResultRecord = miRecordResult; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1408 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1409 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1410 | } | 
|  | 1411 |  | 
|  | 1412 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1413 | // Details: Required by the CMICmdFactory when registering *this command. The factory | 
|  | 1414 | //          calls this function to create an instance of *this command. | 
|  | 1415 | // Type:    Static method. | 
|  | 1416 | // Args:    None. | 
|  | 1417 | // Return:  CMICmdBase * - Pointer to a new command. | 
|  | 1418 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1419 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1420 | CMICmdBase * | 
|  | 1421 | CMICmdCmdDataWriteMemory::CreateSelf(void) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1422 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 1423 | return new CMICmdCmdDataWriteMemory(); | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 1424 | } |