diff options
Diffstat (limited to 'tools/lldb-mi/MICmdCmdData.cpp')
-rw-r--r-- | tools/lldb-mi/MICmdCmdData.cpp | 406 |
1 files changed, 166 insertions, 240 deletions
diff --git a/tools/lldb-mi/MICmdCmdData.cpp b/tools/lldb-mi/MICmdCmdData.cpp index 21036f865d9e..0e0cf12b0080 100644 --- a/tools/lldb-mi/MICmdCmdData.cpp +++ b/tools/lldb-mi/MICmdCmdData.cpp @@ -42,6 +42,7 @@ #include "MICmdArgValConsume.h" #include "MICmnLLDBDebugSessionInfoVarObj.h" #include "MICmnLLDBUtilSBValue.h" +#include "MIUtilParse.h" //++ ------------------------------------------------------------------------------------ // Details: CMICmdCmdDataEvaluateExpression constructor. @@ -50,15 +51,12 @@ // Return: None. // Throws: None. //-- -CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression(void) +CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression() : m_bExpressionValid(true) , m_bEvaluatedExpression(true) , m_strValue("??") - , m_bCompositeVarType(false) , m_bFoundInvalidChar(false) , m_cExpressionInvalidChar(0x00) - , m_constStrArgThread("thread") - , m_constStrArgFrame("frame") , m_constStrArgExpr("expr") { // Command factory matches this name with that received from the stdin stream @@ -75,7 +73,7 @@ CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataEvaluateExpression::~CMICmdCmdDataEvaluateExpression(void) +CMICmdCmdDataEvaluateExpression::~CMICmdCmdDataEvaluateExpression() { } @@ -89,14 +87,10 @@ CMICmdCmdDataEvaluateExpression::~CMICmdCmdDataEvaluateExpression(void) // Throws: None. //-- bool -CMICmdCmdDataEvaluateExpression::ParseArgs(void) +CMICmdCmdDataEvaluateExpression::ParseArgs() { - bool bOk = - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgFrame, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgExpr, true, true, true, true))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgExpr, true, true, true, true)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -109,7 +103,7 @@ CMICmdCmdDataEvaluateExpression::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataEvaluateExpression::Execute(void) +CMICmdCmdDataEvaluateExpression::Execute() { CMICMDBASE_GETOPTION(pArgExpr, String, m_constStrArgExpr); @@ -147,41 +141,7 @@ CMICmdCmdDataEvaluateExpression::Execute(void) m_strValue = rExpression.Trim('\"'); return MIstatus::success; } - - MIuint64 nNumber = 0; - if (CMICmnLLDBProxySBValue::GetValueAsUnsigned(value, nNumber) == MIstatus::success) - { - const lldb::ValueType eValueType = value.GetValueType(); - MIunused(eValueType); - m_strValue = utilValue.GetValue().Escape().AddSlashes(); - return MIstatus::success; - } - - // Composite type i.e. struct - m_bCompositeVarType = true; - const MIuint nChild = value.GetNumChildren(); - for (MIuint i = 0; i < nChild; i++) - { - lldb::SBValue member = value.GetChildAtIndex(i); - const bool bValid = member.IsValid(); - CMIUtilString strType(MIRSRC(IDS_WORD_UNKNOWNTYPE_BRKTS)); - if (bValid) - { - const CMIUtilString strValue( - CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(member, CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural)); - const char *pTypeName = member.GetName(); - if (pTypeName != nullptr) - strType = pTypeName; - - // MI print "{variable = 1, variable2 = 3, variable3 = 5}" - const bool bNoQuotes = true; - const CMICmnMIValueConst miValueConst(strValue, bNoQuotes); - const bool bUseSpaces = true; - const CMICmnMIValueResult miValueResult(strType, miValueConst, bUseSpaces); - m_miValueTuple.Add(miValueResult, bUseSpaces); - } - } - + m_strValue = utilValue.GetValue(true).Escape().AddSlashes(); return MIstatus::success; } @@ -195,21 +155,12 @@ CMICmdCmdDataEvaluateExpression::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataEvaluateExpression::Acknowledge(void) +CMICmdCmdDataEvaluateExpression::Acknowledge() { if (m_bExpressionValid) { if (m_bEvaluatedExpression) { - if (m_bCompositeVarType) - { - const CMICmnMIValueConst miValueConst(m_miValueTuple.GetString()); - const CMICmnMIValueResult miValueResult("value", miValueConst); - const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - if (m_bFoundInvalidChar) { const CMICmnMIValueConst miValueConst( @@ -251,7 +202,7 @@ CMICmdCmdDataEvaluateExpression::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataEvaluateExpression::CreateSelf(void) +CMICmdCmdDataEvaluateExpression::CreateSelf() { return new CMICmdCmdDataEvaluateExpression(); } @@ -285,11 +236,9 @@ CMICmdCmdDataEvaluateExpression::HaveInvalidCharacterInExpression(const CMIUtilS // Return: None. // Throws: None. //-- -CMICmdCmdDataDisassemble::CMICmdCmdDataDisassemble(void) - : m_constStrArgThread("thread") - , m_constStrArgAddrStart("s") +CMICmdCmdDataDisassemble::CMICmdCmdDataDisassemble() + : m_constStrArgAddrStart("s") , m_constStrArgAddrEnd("e") - , m_constStrArgConsume("--") , m_constStrArgMode("mode") , m_miValueList(true) { @@ -307,7 +256,7 @@ CMICmdCmdDataDisassemble::CMICmdCmdDataDisassemble(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataDisassemble::~CMICmdCmdDataDisassemble(void) +CMICmdCmdDataDisassemble::~CMICmdCmdDataDisassemble() { } @@ -321,19 +270,14 @@ CMICmdCmdDataDisassemble::~CMICmdCmdDataDisassemble(void) // Throws: None. //-- bool -CMICmdCmdDataDisassemble::ParseArgs(void) +CMICmdCmdDataDisassemble::ParseArgs() { - bool bOk = - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && - m_setCmdArgs.Add( - *(new CMICmdArgValOptionShort(m_constStrArgAddrStart, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1))); - bOk = bOk && - m_setCmdArgs.Add( - *(new CMICmdArgValOptionShort(m_constStrArgAddrEnd, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValConsume(m_constStrArgConsume, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgMode, true, true))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add( + new CMICmdArgValOptionShort(m_constStrArgAddrStart, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1)); + m_setCmdArgs.Add( + new CMICmdArgValOptionShort(m_constStrArgAddrEnd, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1)); + m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgMode, true, true)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -346,7 +290,7 @@ CMICmdCmdDataDisassemble::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataDisassemble::Execute(void) +CMICmdCmdDataDisassemble::Execute() { CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); CMICMDBASE_GETOPTION(pArgAddrStart, OptionShort, m_constStrArgAddrStart); @@ -476,7 +420,7 @@ CMICmdCmdDataDisassemble::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataDisassemble::Acknowledge(void) +CMICmdCmdDataDisassemble::Acknowledge() { const CMICmnMIValueResult miValueResult("asm_insns", m_miValueList); const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); @@ -494,7 +438,7 @@ CMICmdCmdDataDisassemble::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataDisassemble::CreateSelf(void) +CMICmdCmdDataDisassemble::CreateSelf() { return new CMICmdCmdDataDisassemble(); } @@ -510,10 +454,8 @@ CMICmdCmdDataDisassemble::CreateSelf(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataReadMemoryBytes::CMICmdCmdDataReadMemoryBytes(void) - : m_constStrArgThread("thread") - , m_constStrArgFrame("frame") - , m_constStrArgByteOffset("o") +CMICmdCmdDataReadMemoryBytes::CMICmdCmdDataReadMemoryBytes() + : m_constStrArgByteOffset("o") , m_constStrArgAddrExpr("address") , m_constStrArgNumBytes("count") , m_pBufferMemory(nullptr) @@ -534,7 +476,7 @@ CMICmdCmdDataReadMemoryBytes::CMICmdCmdDataReadMemoryBytes(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataReadMemoryBytes::~CMICmdCmdDataReadMemoryBytes(void) +CMICmdCmdDataReadMemoryBytes::~CMICmdCmdDataReadMemoryBytes() { if (m_pBufferMemory != nullptr) { @@ -553,18 +495,12 @@ CMICmdCmdDataReadMemoryBytes::~CMICmdCmdDataReadMemoryBytes(void) // Throws: None. //-- bool -CMICmdCmdDataReadMemoryBytes::ParseArgs(void) +CMICmdCmdDataReadMemoryBytes::ParseArgs() { - bool bOk = - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgFrame, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = - bOk && - m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgByteOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgAddrExpr, true, true, true, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgNumBytes, true, true))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValOptionShort(m_constStrArgByteOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1)); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgAddrExpr, true, true, true, true)); + m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumBytes, true, true)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -577,7 +513,7 @@ CMICmdCmdDataReadMemoryBytes::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataReadMemoryBytes::Execute(void) +CMICmdCmdDataReadMemoryBytes::Execute() { CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); CMICMDBASE_GETOPTION(pArgFrame, OptionLong, m_constStrArgFrame); @@ -700,7 +636,7 @@ CMICmdCmdDataReadMemoryBytes::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataReadMemoryBytes::Acknowledge(void) +CMICmdCmdDataReadMemoryBytes::Acknowledge() { // MI: memory=[{begin=\"0x%016" PRIx64 "\",offset=\"0x%016" PRIx64" \",end=\"0x%016" PRIx64 "\",contents=\" \" }]" const CMICmnMIValueConst miValueConst(CMIUtilString::Format("0x%016" PRIx64, m_nAddrStart)); @@ -742,7 +678,7 @@ CMICmdCmdDataReadMemoryBytes::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataReadMemoryBytes::CreateSelf(void) +CMICmdCmdDataReadMemoryBytes::CreateSelf() { return new CMICmdCmdDataReadMemoryBytes(); } @@ -758,7 +694,7 @@ CMICmdCmdDataReadMemoryBytes::CreateSelf(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataReadMemory::CMICmdCmdDataReadMemory(void) +CMICmdCmdDataReadMemory::CMICmdCmdDataReadMemory() { // Command factory matches this name with that received from the stdin stream m_strMiCmd = "data-read-memory"; @@ -774,7 +710,7 @@ CMICmdCmdDataReadMemory::CMICmdCmdDataReadMemory(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataReadMemory::~CMICmdCmdDataReadMemory(void) +CMICmdCmdDataReadMemory::~CMICmdCmdDataReadMemory() { } @@ -788,7 +724,7 @@ CMICmdCmdDataReadMemory::~CMICmdCmdDataReadMemory(void) // Throws: None. //-- bool -CMICmdCmdDataReadMemory::Execute(void) +CMICmdCmdDataReadMemory::Execute() { // Do nothing - command deprecated use "data-read-memory-bytes" command return MIstatus::success; @@ -804,7 +740,7 @@ CMICmdCmdDataReadMemory::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataReadMemory::Acknowledge(void) +CMICmdCmdDataReadMemory::Acknowledge() { // Command CMICmdCmdSupportListFeatures sends "data-read-memory-bytes" which causes this command not to be called const CMICmnMIValueConst miValueConst(MIRSRC(IDS_CMD_ERR_NOT_IMPLEMENTED_DEPRECATED)); @@ -824,7 +760,7 @@ CMICmdCmdDataReadMemory::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataReadMemory::CreateSelf(void) +CMICmdCmdDataReadMemory::CreateSelf() { return new CMICmdCmdDataReadMemory(); } @@ -840,9 +776,8 @@ CMICmdCmdDataReadMemory::CreateSelf(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataListRegisterNames::CMICmdCmdDataListRegisterNames(void) - : m_constStrArgThreadGroup("thread-group") - , m_constStrArgRegNo("regno") +CMICmdCmdDataListRegisterNames::CMICmdCmdDataListRegisterNames() + : m_constStrArgRegNo("regno") , m_miValueList(true) { // Command factory matches this name with that received from the stdin stream @@ -859,7 +794,7 @@ CMICmdCmdDataListRegisterNames::CMICmdCmdDataListRegisterNames(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataListRegisterNames::~CMICmdCmdDataListRegisterNames(void) +CMICmdCmdDataListRegisterNames::~CMICmdCmdDataListRegisterNames() { } @@ -873,12 +808,10 @@ CMICmdCmdDataListRegisterNames::~CMICmdCmdDataListRegisterNames(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterNames::ParseArgs(void) +CMICmdCmdDataListRegisterNames::ParseArgs() { - bool bOk = m_setCmdArgs.Add( - *(new CMICmdArgValOptionLong(m_constStrArgThreadGroup, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValListOfN(m_constStrArgRegNo, false, false, CMICmdArgValListBase::eArgValType_Number))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValListOfN(m_constStrArgRegNo, false, false, CMICmdArgValListBase::eArgValType_Number)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -891,7 +824,7 @@ CMICmdCmdDataListRegisterNames::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterNames::Execute(void) +CMICmdCmdDataListRegisterNames::Execute() { CMICMDBASE_GETOPTION(pArgRegNo, ListOfN, m_constStrArgRegNo); @@ -940,9 +873,7 @@ CMICmdCmdDataListRegisterNames::Execute(void) if (regValue.IsValid()) { const CMICmnMIValueConst miValueConst(CMICmnLLDBUtilSBValue(regValue).GetName()); - const bool bOk = m_miValueList.Add(miValueConst); - if (!bOk) - return MIstatus::failure; + m_miValueList.Add(miValueConst); } } } @@ -961,7 +892,7 @@ CMICmdCmdDataListRegisterNames::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterNames::Acknowledge(void) +CMICmdCmdDataListRegisterNames::Acknowledge() { const CMICmnMIValueResult miValueResult("register-names", m_miValueList); const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); @@ -979,7 +910,7 @@ CMICmdCmdDataListRegisterNames::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataListRegisterNames::CreateSelf(void) +CMICmdCmdDataListRegisterNames::CreateSelf() { return new CMICmdCmdDataListRegisterNames(); } @@ -1031,9 +962,8 @@ CMICmdCmdDataListRegisterNames::GetRegister(const MIuint vRegisterIndex) const // Return: None. // Throws: None. //-- -CMICmdCmdDataListRegisterValues::CMICmdCmdDataListRegisterValues(void) - : m_constStrArgThread("thread") - , m_constStrArgSkip("skip-unavailable") +CMICmdCmdDataListRegisterValues::CMICmdCmdDataListRegisterValues() + : m_constStrArgSkip("skip-unavailable") , m_constStrArgFormat("fmt") , m_constStrArgRegNo("regno") , m_miValueList(true) @@ -1052,7 +982,7 @@ CMICmdCmdDataListRegisterValues::CMICmdCmdDataListRegisterValues(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataListRegisterValues::~CMICmdCmdDataListRegisterValues(void) +CMICmdCmdDataListRegisterValues::~CMICmdCmdDataListRegisterValues() { } @@ -1066,14 +996,13 @@ CMICmdCmdDataListRegisterValues::~CMICmdCmdDataListRegisterValues(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterValues::ParseArgs(void) +CMICmdCmdDataListRegisterValues::ParseArgs() { - bool bOk = - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgSkip, false, false))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgFormat, true, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValListOfN(m_constStrArgRegNo, false, true, CMICmdArgValListBase::eArgValType_Number))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1)); + m_setCmdArgs.Add(new CMICmdArgValOptionLong(m_constStrArgSkip, false, false)); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgFormat, true, true)); + m_setCmdArgs.Add(new CMICmdArgValListOfN(m_constStrArgRegNo, false, true, CMICmdArgValListBase::eArgValType_Number)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -1086,7 +1015,7 @@ CMICmdCmdDataListRegisterValues::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterValues::Execute(void) +CMICmdCmdDataListRegisterValues::Execute() { CMICMDBASE_GETOPTION(pArgFormat, String, m_constStrArgFormat); CMICMDBASE_GETOPTION(pArgRegNo, ListOfN, m_constStrArgRegNo); @@ -1124,9 +1053,7 @@ CMICmdCmdDataListRegisterValues::Execute(void) lldb::SBValue regValue = GetRegister(nRegIndex); if (regValue.IsValid()) { - const bool bOk = AddToOutput(nRegIndex, regValue, eFormat); - if (!bOk) - return MIstatus::failure; + AddToOutput(nRegIndex, regValue, eFormat); } // Next @@ -1150,9 +1077,7 @@ CMICmdCmdDataListRegisterValues::Execute(void) lldb::SBValue regValue = value.GetChildAtIndex(j); if (regValue.IsValid()) { - const bool bOk = AddToOutput(nRegIndex, regValue, eFormat); - if (!bOk) - return MIstatus::failure; + AddToOutput(nRegIndex, regValue, eFormat); } // Next @@ -1174,7 +1099,7 @@ CMICmdCmdDataListRegisterValues::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterValues::Acknowledge(void) +CMICmdCmdDataListRegisterValues::Acknowledge() { const CMICmnMIValueResult miValueResult("register-values", m_miValueList); const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); @@ -1192,7 +1117,7 @@ CMICmdCmdDataListRegisterValues::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataListRegisterValues::CreateSelf(void) +CMICmdCmdDataListRegisterValues::CreateSelf() { return new CMICmdCmdDataListRegisterValues(); } @@ -1240,7 +1165,7 @@ CMICmdCmdDataListRegisterValues::GetRegister(const MIuint vRegisterIndex) const // Return: None // Throws: None. //-- -bool +void CMICmdCmdDataListRegisterValues::AddToOutput(const MIuint vnIndex, const lldb::SBValue &vrValue, CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat) { @@ -1250,8 +1175,8 @@ CMICmdCmdDataListRegisterValues::AddToOutput(const MIuint vnIndex, const lldb::S const CMIUtilString strRegValue(CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(vrValue, veVarFormat)); const CMICmnMIValueConst miValueConst2(strRegValue); const CMICmnMIValueResult miValueResult2("value", miValueConst2); - bool bOk = miValueTuple.Add(miValueResult2); - return bOk && m_miValueList.Add(miValueTuple); + miValueTuple.Add(miValueResult2); + m_miValueList.Add(miValueTuple); } //--------------------------------------------------------------------------------------- @@ -1265,7 +1190,7 @@ CMICmdCmdDataListRegisterValues::AddToOutput(const MIuint vnIndex, const lldb::S // Return: None. // Throws: None. //-- -CMICmdCmdDataListRegisterChanged::CMICmdCmdDataListRegisterChanged(void) +CMICmdCmdDataListRegisterChanged::CMICmdCmdDataListRegisterChanged() { // Command factory matches this name with that received from the stdin stream m_strMiCmd = "data-list-changed-registers"; @@ -1281,7 +1206,7 @@ CMICmdCmdDataListRegisterChanged::CMICmdCmdDataListRegisterChanged(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataListRegisterChanged::~CMICmdCmdDataListRegisterChanged(void) +CMICmdCmdDataListRegisterChanged::~CMICmdCmdDataListRegisterChanged() { } @@ -1295,7 +1220,7 @@ CMICmdCmdDataListRegisterChanged::~CMICmdCmdDataListRegisterChanged(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterChanged::Execute(void) +CMICmdCmdDataListRegisterChanged::Execute() { // Do nothing @@ -1312,7 +1237,7 @@ CMICmdCmdDataListRegisterChanged::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataListRegisterChanged::Acknowledge(void) +CMICmdCmdDataListRegisterChanged::Acknowledge() { const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); const CMICmnMIValueResult miValueResult("msg", miValueConst); @@ -1331,7 +1256,7 @@ CMICmdCmdDataListRegisterChanged::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataListRegisterChanged::CreateSelf(void) +CMICmdCmdDataListRegisterChanged::CreateSelf() { return new CMICmdCmdDataListRegisterChanged(); } @@ -1347,9 +1272,8 @@ CMICmdCmdDataListRegisterChanged::CreateSelf(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataWriteMemoryBytes::CMICmdCmdDataWriteMemoryBytes(void) - : m_constStrArgThread("thread") - , m_constStrArgAddr("address") +CMICmdCmdDataWriteMemoryBytes::CMICmdCmdDataWriteMemoryBytes() + : m_constStrArgAddr("address") , m_constStrArgContents("contents") , m_constStrArgCount("count") { @@ -1367,7 +1291,7 @@ CMICmdCmdDataWriteMemoryBytes::CMICmdCmdDataWriteMemoryBytes(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataWriteMemoryBytes::~CMICmdCmdDataWriteMemoryBytes(void) +CMICmdCmdDataWriteMemoryBytes::~CMICmdCmdDataWriteMemoryBytes() { } @@ -1381,14 +1305,12 @@ CMICmdCmdDataWriteMemoryBytes::~CMICmdCmdDataWriteMemoryBytes(void) // Throws: None. //-- bool -CMICmdCmdDataWriteMemoryBytes::ParseArgs(void) +CMICmdCmdDataWriteMemoryBytes::ParseArgs() { - bool bOk = - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgAddr, true, true, false, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgContents, true, true, true, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgCount, false, true, false, true))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgAddr, true, true, false, true)); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgContents, true, true, true, true)); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgCount, false, true, false, true)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -1401,7 +1323,7 @@ CMICmdCmdDataWriteMemoryBytes::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataWriteMemoryBytes::Execute(void) +CMICmdCmdDataWriteMemoryBytes::Execute() { // Do nothing - not reproduceable (yet) in Eclipse // CMICMDBASE_GETOPTION( pArgOffset, OptionShort, m_constStrArgOffset ); @@ -1425,7 +1347,7 @@ CMICmdCmdDataWriteMemoryBytes::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataWriteMemoryBytes::Acknowledge(void) +CMICmdCmdDataWriteMemoryBytes::Acknowledge() { const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); const CMICmnMIValueResult miValueResult("msg", miValueConst); @@ -1444,7 +1366,7 @@ CMICmdCmdDataWriteMemoryBytes::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataWriteMemoryBytes::CreateSelf(void) +CMICmdCmdDataWriteMemoryBytes::CreateSelf() { return new CMICmdCmdDataWriteMemoryBytes(); } @@ -1460,9 +1382,8 @@ CMICmdCmdDataWriteMemoryBytes::CreateSelf(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataWriteMemory::CMICmdCmdDataWriteMemory(void) - : m_constStrArgThread("thread") - , m_constStrArgOffset("o") +CMICmdCmdDataWriteMemory::CMICmdCmdDataWriteMemory() + : m_constStrArgOffset("o") , m_constStrArgAddr("address") , m_constStrArgD("d") , m_constStrArgNumber("a number") @@ -1485,7 +1406,7 @@ CMICmdCmdDataWriteMemory::CMICmdCmdDataWriteMemory(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataWriteMemory::~CMICmdCmdDataWriteMemory(void) +CMICmdCmdDataWriteMemory::~CMICmdCmdDataWriteMemory() { if (m_pBufferMemory != nullptr) { @@ -1504,17 +1425,14 @@ CMICmdCmdDataWriteMemory::~CMICmdCmdDataWriteMemory(void) // Throws: None. //-- bool -CMICmdCmdDataWriteMemory::ParseArgs(void) +CMICmdCmdDataWriteMemory::ParseArgs() { - bool bOk = - m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, false, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && - m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgAddr, true, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgD, true, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgNumber, true, true))); - bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgContents, true, true))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValOptionShort(m_constStrArgOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1)); + m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgAddr, true, true)); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgD, true, true)); + m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumber, true, true)); + m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgContents, true, true)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -1527,7 +1445,7 @@ CMICmdCmdDataWriteMemory::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataWriteMemory::Execute(void) +CMICmdCmdDataWriteMemory::Execute() { CMICMDBASE_GETOPTION(pArgOffset, OptionShort, m_constStrArgOffset); CMICMDBASE_GETOPTION(pArgAddr, Number, m_constStrArgAddr); @@ -1585,7 +1503,7 @@ CMICmdCmdDataWriteMemory::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataWriteMemory::Acknowledge(void) +CMICmdCmdDataWriteMemory::Acknowledge() { const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); m_miResultRecord = miRecordResult; @@ -1602,7 +1520,7 @@ CMICmdCmdDataWriteMemory::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataWriteMemory::CreateSelf(void) +CMICmdCmdDataWriteMemory::CreateSelf() { return new CMICmdCmdDataWriteMemory(); } @@ -1618,7 +1536,7 @@ CMICmdCmdDataWriteMemory::CreateSelf(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataInfoLine::CMICmdCmdDataInfoLine(void) +CMICmdCmdDataInfoLine::CMICmdCmdDataInfoLine() : m_constStrArgLocation("location") { // Command factory matches this name with that received from the stdin stream @@ -1635,7 +1553,7 @@ CMICmdCmdDataInfoLine::CMICmdCmdDataInfoLine(void) // Return: None. // Throws: None. //-- -CMICmdCmdDataInfoLine::~CMICmdCmdDataInfoLine(void) +CMICmdCmdDataInfoLine::~CMICmdCmdDataInfoLine() { } @@ -1649,10 +1567,10 @@ CMICmdCmdDataInfoLine::~CMICmdCmdDataInfoLine(void) // Throws: None. //-- bool -CMICmdCmdDataInfoLine::ParseArgs(void) +CMICmdCmdDataInfoLine::ParseArgs() { - bool bOk = m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgLocation, true, true))); - return (bOk && ParseValidateCmdOptions()); + m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgLocation, true, true)); + return ParseValidateCmdOptions(); } //++ ------------------------------------------------------------------------------------ @@ -1665,7 +1583,7 @@ CMICmdCmdDataInfoLine::ParseArgs(void) // Throws: None. //-- bool -CMICmdCmdDataInfoLine::Execute(void) +CMICmdCmdDataInfoLine::Execute() { CMICMDBASE_GETOPTION(pArgLocation, String, m_constStrArgLocation); @@ -1676,7 +1594,7 @@ CMICmdCmdDataInfoLine::Execute(void) // Parse argument: // *0x12345 // ^^^^^^^ -- address - const CMIUtilString strAddress(strLocation.c_str() + 1); + const CMIUtilString strAddress(strLocation.substr(1)); strCmdOptionsLocation = CMIUtilString::Format("--address %s", strAddress.c_str()); } else @@ -1692,8 +1610,8 @@ CMICmdCmdDataInfoLine::Execute(void) // hello.cpp:5 // ^^^^^^^^^ -- file // ^ -- line - const CMIUtilString strFile(strLocation.substr(0, nLineStartPos).c_str()); - const CMIUtilString strLine(strLocation.substr(nLineStartPos + 1).c_str()); + const CMIUtilString strFile(strLocation.substr(0, nLineStartPos)); + const CMIUtilString strLine(strLocation.substr(nLineStartPos + 1)); strCmdOptionsLocation = CMIUtilString::Format("--file \"%s\" --line %s", strFile.AddSlashes().c_str(), strLine.c_str()); } const CMIUtilString strCmd(CMIUtilString::Format("target modules lookup -v %s", strCmdOptionsLocation.c_str())); @@ -1706,6 +1624,53 @@ CMICmdCmdDataInfoLine::Execute(void) } //++ ------------------------------------------------------------------------------------ +// Details: Helper function for parsing a line entry returned from lldb for the command: +// target modules lookup -v <location> +// where the line entry is of the format: +// LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/file:3[:1] +// start end file line column(opt) +// Args: input - (R) Input string to parse. +// start - (W) String representing the start address. +// end - (W) String representing the end address. +// file - (W) String representing the file. +// line - (W) String representing the line. +// Return: bool - True = input was parsed successfully, false = input could not be parsed. +// Throws: None. +//-- +static bool +ParseLLDBLineEntry(const char *input, CMIUtilString &start, CMIUtilString &end, + CMIUtilString &file, CMIUtilString &line) +{ + // Note: Ambiguities arise because the column is optional, and + // because : can appear in filenames or as a byte in a multibyte + // UTF8 character. We keep those cases to a minimum by using regex + // to work on the string from both the left and right, so that what + // is remains is assumed to be the filename. + + // Match LineEntry using regex. + static MIUtilParse::CRegexParser g_lineentry_nocol_regex( + "^ *LineEntry: \\[(0x[0-9a-fA-F]+)-(0x[0-9a-fA-F]+)\\): (.+):([0-9]+)$"); + static MIUtilParse::CRegexParser g_lineentry_col_regex( + "^ *LineEntry: \\[(0x[0-9a-fA-F]+)-(0x[0-9a-fA-F]+)\\): (.+):([0-9]+):[0-9]+$"); + // ^1=start ^2=end ^3=f ^4=line ^5=:col(opt) + + MIUtilParse::CRegexParser::Match match(6); + + // First try matching the LineEntry with the column, + // then try without the column. + const bool ok = g_lineentry_col_regex.Execute(input, match) || + g_lineentry_nocol_regex.Execute(input, match); + if (ok) + { + start = match.GetMatchAtIndex(1); + end = match.GetMatchAtIndex(2); + file = match.GetMatchAtIndex(3); + line = match.GetMatchAtIndex(4); + } + return ok; +} + +//++ ------------------------------------------------------------------------------------ // Details: The invoker requires this function. The command prepares a MI Record Result // for the work carried out in the Execute(). // Type: Overridden. @@ -1715,7 +1680,7 @@ CMICmdCmdDataInfoLine::Execute(void) // Throws: None. //-- bool -CMICmdCmdDataInfoLine::Acknowledge(void) +CMICmdCmdDataInfoLine::Acknowledge() { if (m_lldbResult.GetErrorSize() > 0) { @@ -1736,67 +1701,28 @@ CMICmdCmdDataInfoLine::Acknowledge(void) // String looks like: // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1] const CMIUtilString &rLine(vecLines[i]); + CMIUtilString strStart; + CMIUtilString strEnd; + CMIUtilString strFile; + CMIUtilString strLine; - // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1] - // ^^^^^^^^^ -- property - const size_t nPropertyStartPos = rLine.find_first_not_of(' '); - const size_t nPropertyEndPos = rLine.find(':'); - const size_t nPropertyLen = nPropertyEndPos - nPropertyStartPos; - const CMIUtilString strProperty(rLine.substr(nPropertyStartPos, nPropertyLen).c_str()); - - // Skip all except LineEntry - if (!CMIUtilString::Compare(strProperty, "LineEntry")) + if (!ParseLLDBLineEntry(rLine.c_str(), strStart, strEnd, strFile, strLine)) continue; - // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1] - // ^^^^^^^^^^^^^^^^^^ -- start address - const size_t nStartAddressStartPos = rLine.find('['); - const size_t nStartAddressEndPos = rLine.find('-'); - const size_t nStartAddressLen = nStartAddressEndPos - nStartAddressStartPos - 1; - const CMIUtilString strStartAddress(rLine.substr(nStartAddressStartPos + 1, nStartAddressLen).c_str()); - const CMICmnMIValueConst miValueConst(strStartAddress); + const CMICmnMIValueConst miValueConst(strStart); const CMICmnMIValueResult miValueResult("start", miValueConst); - CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); - - // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1] - // ^^^^^^^^^^^^^^^^^^ -- end address - const size_t nEndAddressEndPos = rLine.find(')'); - const size_t nEndAddressLen = nEndAddressEndPos - nStartAddressEndPos - 1; - const CMIUtilString strEndAddress(rLine.substr(nStartAddressEndPos + 1, nEndAddressLen).c_str()); - const CMICmnMIValueConst miValueConst2(strEndAddress); + CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, + CMICmnMIResultRecord::eResultClass_Done, + miValueResult); + const CMICmnMIValueConst miValueConst2(strEnd); const CMICmnMIValueResult miValueResult2("end", miValueConst2); - bool bOk = miRecordResult.Add(miValueResult2); - if (!bOk) - return MIstatus::failure; - - // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1] - // ^^^^^^^^^^^^^ -- file - // ^ -- line - // ^ -- column (optional) - const size_t nFileStartPos = rLine.find_first_not_of(' ', nEndAddressEndPos + 2); - const size_t nFileOrLineEndPos = rLine.rfind(':'); - const size_t nFileOrLineStartPos = rLine.rfind(':', nFileOrLineEndPos - 1); - const size_t nFileEndPos = nFileStartPos < nFileOrLineStartPos ? nFileOrLineStartPos : nFileOrLineEndPos; - const size_t nFileLen = nFileEndPos - nFileStartPos; - const CMIUtilString strFile(rLine.substr(nFileStartPos, nFileLen).c_str()); + miRecordResult.Add(miValueResult2); const CMICmnMIValueConst miValueConst3(strFile); const CMICmnMIValueResult miValueResult3("file", miValueConst3); - bOk = miRecordResult.Add(miValueResult3); - if (!bOk) - return MIstatus::failure; - - // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1] - // ^ -- line - const size_t nLineStartPos = nFileEndPos + 1; - const size_t nLineEndPos = rLine.find(':', nLineStartPos); - const size_t nLineLen = nLineEndPos != std::string::npos ? nLineEndPos - nLineStartPos - : std::string::npos; - const CMIUtilString strLine(rLine.substr(nLineStartPos, nLineLen).c_str()); + miRecordResult.Add(miValueResult3); const CMICmnMIValueConst miValueConst4(strLine); const CMICmnMIValueResult miValueResult4("line", miValueConst4); - bOk = miRecordResult.Add(miValueResult4); - if (!bOk) - return MIstatus::failure; + miRecordResult.Add(miValueResult4); // MI print "%s^done,start=\"%d\",end=\"%d\"",file=\"%s\",line=\"%d\" m_miResultRecord = miRecordResult; @@ -1823,7 +1749,7 @@ CMICmdCmdDataInfoLine::Acknowledge(void) // Throws: None. //-- CMICmdBase * -CMICmdCmdDataInfoLine::CreateSelf(void) +CMICmdCmdDataInfoLine::CreateSelf() { return new CMICmdCmdDataInfoLine(); } |