227 changes: 210 additions & 17 deletions lldb/tools/lldb-mi/MICmdArgValString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ CMICmdArgValString::CMICmdArgValString( const CMIUtilString & vrArgName, const b

//++ ------------------------------------------------------------------------------------
// Details: CMICmdArgValString destructor.
// Type: Overridden.
// Type: Overidden.
// Args: None.
// Return: None.
// Throws: None.
Expand All @@ -98,7 +98,7 @@ bool CMICmdArgValString::Validate( CMICmdArgContext & vrwArgContext )
return MIstatus::success;

if( m_bHandleQuotedString )
return ValidateQuotedText( vrwArgContext );
return (ValidateQuotedText( vrwArgContext ) || ValidateQuotedTextEmbedded( vrwArgContext ) );

return ValidateSingleText( vrwArgContext );
}
Expand Down Expand Up @@ -158,7 +158,8 @@ bool CMICmdArgValString::ValidateSingleText( CMICmdArgContext & vrwArgContext )

//++ ------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract all the words
// between quotes then delimited by the next space.
// between quotes then delimited by the next space. Can fall through to
// ValidateSingleText() or ValidateQuotedQuotedTextEmbedded().
// Type: Method.
// Args: vrwArgContext - (RW) The command's argument options string.
// Return: MIstatus::success - Functional succeeded.
Expand All @@ -168,32 +169,146 @@ bool CMICmdArgValString::ValidateSingleText( CMICmdArgContext & vrwArgContext )
bool CMICmdArgValString::ValidateQuotedText( CMICmdArgContext & vrwArgContext )
{
// CODETAG_QUOTEDTEXT_SIMILAR_CODE
const CMIUtilString strOptions = vrwArgContext.GetArgsLeftToParse();
CMIUtilString strOptions = vrwArgContext.GetArgsLeftToParse();
const MIchar cQuote = '"';
const MIint nPos = strOptions.find( cQuote );

// Look for first quote of two
MIint nPos = strOptions.find( cQuote );
if( nPos == (MIint) std::string::npos )
return ValidateSingleText( vrwArgContext );

// Is one and only quote at end of the string
if( nPos == (MIint)(strOptions.length() - 1) )
const MIint nLen = strOptions.length();
if( nPos == (MIint)(nLen - 1) )
return MIstatus::failure;

// Quote must be the first character in the string or be preceeded by a space
if( (nPos > 0) && (strOptions[ nPos - 1 ] != ' ' ) )
return MIstatus::failure;

if( (nPos > 0) && (strOptions[ nPos - 1 ] != ' ') )
return MIstatus::failure;
// Need to find the other quote
const MIint nPos2 = strOptions.find( cQuote, nPos + 1 );
const MIint nPos2 = strOptions.rfind( cQuote );
if( nPos2 == (MIint) std::string::npos )
return MIstatus::failure;

// Is there quotes surrounding string formatting embedded quotes
if( IsStringArgQuotedQuotedTextEmbedded( strOptions ) )
return ValidateQuotedQuotedTextEmbedded( vrwArgContext );

// Make sure not same back quote, need two quotes
if( nPos == nPos2 )
return MIstatus::failure;

// Extract quoted text
const CMIUtilString strQuotedTxt = strOptions.substr( nPos, nPos2 - nPos + 1 ).c_str();
if( vrwArgContext.RemoveArg( strQuotedTxt ) )
{
m_bFound = true;
m_bValid = true;
m_argValue = strOptions.substr( nPos + 1, nPos2 - nPos - 1 ).c_str();;
m_argValue = strOptions.substr( nPos + 1, nPos2 - nPos - 1 ).c_str();
return MIstatus::success;
}

return MIstatus::failure;
}

//++ ------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract all the words
// between quotes then delimited by the next space. If there any string format
// characters '\\' used to embed quotes these are ignored i.e. "\\\"%5d\\\""
// becomes "%5d". Can fall through to ValidateQuotedText().
// Type: Method.
// Args: vrwArgContext - (RW) The command's argument options string.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdArgValString::ValidateQuotedTextEmbedded( CMICmdArgContext & vrwArgContext )
{
// CODETAG_QUOTEDTEXT_SIMILAR_CODE
CMIUtilString strOptions = vrwArgContext.GetArgsLeftToParse();
const MIchar cBckSlash = '\\';
const MIint nPos = strOptions.find( cBckSlash );
if( nPos == (MIint) std::string::npos )
return ValidateQuotedText( vrwArgContext );

// Back slash must be the first character in the string or be preceeded by a space
// or '\\'
const MIchar cSpace = ' ';
if( (nPos > 0) && (strOptions[ nPos - 1 ] != cSpace) )
return MIstatus::failure;

// Need to find the other back slash
const MIint nPos2 = strOptions.rfind( cBckSlash );
if( nPos2 == (MIint) std::string::npos )
return MIstatus::failure;

// Make sure not same back slash, need two slashs
if( nPos == nPos2 )
return MIstatus::failure;

// Look for the two quotes
const MIint nLen = strOptions.length();
const MIchar cQuote = '"';
const MIint nPosQuote1 = nPos + 1;
const MIint nPosQuote2 = (nPos2 < nLen) ? nPos2 + 1 : nPos2;
if( (nPosQuote1 != nPosQuote2) &&
(strOptions[ nPosQuote1 ] != cQuote) && (strOptions[ nPosQuote2 ] != cQuote) )
return MIstatus::failure;

// Extract quoted text
const CMIUtilString strQuotedTxt = strOptions.substr( nPos, nPosQuote2 - nPos + 1 ).c_str();
if( vrwArgContext.RemoveArg( strQuotedTxt ) )
{
m_bFound = true;
m_bValid = true;
m_argValue = strQuotedTxt;
return MIstatus::success;
}

return MIstatus::failure;
}

//++ ------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract all the words
// between quotes then delimited by the next space. If there any string format
// characters '\\' used to embed quotes these are ignored i.e. "\\\"%5d\\\""
// becomes "%5d".
// Type: Method.
// Args: vrwArgContext - (RW) The command's argument options string.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdArgValString::ValidateQuotedQuotedTextEmbedded( CMICmdArgContext & vrwArgContext )
{
// CODETAG_QUOTEDTEXT_SIMILAR_CODE
CMIUtilString strOptions = vrwArgContext.GetArgsLeftToParse();
const MIint nPos = strOptions.find( "\"\\\"" );
if( nPos == (MIint) std::string::npos )
return MIstatus::failure;

const MIint nPos2 = strOptions.rfind( "\\\"\"" );
if( nPos2 == (MIint) std::string::npos )
return MIstatus::failure;

const MIint nLen = strOptions.length();
if( (nLen > 5) && ((nPos + 2) == (nPos2 - 2)) )
return MIstatus::failure;

// Quote must be the first character in the string or be preceeded by a space
// or '\\'
const MIchar cSpace = ' ';
if( (nPos > 0) && (strOptions[ nPos - 1 ] != cSpace) )
return MIstatus::failure;

// Extract quoted text
const CMIUtilString strQuotedTxt = strOptions.substr( nPos, nPos2 - nPos + 3 ).c_str();
if( vrwArgContext.RemoveArg( strQuotedTxt ) )
{
m_bFound = true;
m_bValid = true;
m_argValue = strQuotedTxt;
return MIstatus::success;
}

Expand All @@ -210,7 +325,10 @@ bool CMICmdArgValString::ValidateQuotedText( CMICmdArgContext & vrwArgContext )
bool CMICmdArgValString::IsStringArg( const CMIUtilString & vrTxt ) const
{
if( m_bHandleQuotedString )
return IsStringArgQuotedText( vrTxt );
return (IsStringArgQuotedText( vrTxt ) ||
IsStringArgQuotedTextEmbedded( vrTxt ) ||
IsStringArgQuotedQuotedTextEmbedded( vrTxt ) ||
IsStringArgSingleText( vrTxt ) ); // Still test for this as could just be one word still

return IsStringArgSingleText( vrTxt );
}
Expand Down Expand Up @@ -241,11 +359,11 @@ bool CMICmdArgValString::IsStringArgSingleText( const CMIUtilString & vrTxt ) co
return false;

// Look for -f type short options, if found reject
if( (0 == vrTxt.find( "-" )) && (vrTxt.length() == 2 ) )
if( (0 == vrTxt.find( "-" )) && (vrTxt.length() == 2) )
return false;

// Look for thread group i1 i2 i3...., if found reject
if( (vrTxt.find( "i" ) == 0) && (::isdigit( vrTxt[ 1 ] )) )
if( (vrTxt.find( "i" ) == 0) && ::isdigit( vrTxt[ 1 ]) )
return false;

// Look for numbers, if found reject
Expand All @@ -257,6 +375,8 @@ bool CMICmdArgValString::IsStringArgSingleText( const CMIUtilString & vrTxt ) co

//++ ------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type argument.
// Take into account quotes surrounding the text. Note this function falls
// through to IsStringArgSingleText() should the criteria match fail.
// Type: Method.
// Args: vrTxt - (R) Some text.
// Return: bool - True = yes valid arg, false = no.
Expand All @@ -268,20 +388,93 @@ bool CMICmdArgValString::IsStringArgQuotedText( const CMIUtilString & vrTxt ) co
const MIchar cQuote = '"';
const MIint nPos = vrTxt.find( cQuote );
if( nPos == (MIint) std::string::npos )
return IsStringArgSingleText( vrTxt );
return false;

// Is one and only quote at end of the string
if( nPos == (MIint)(vrTxt.length() - 1) )
return false;

// Quote must be the first character in the string or be preceeded by a space
if( (nPos > 0) && (vrTxt[ nPos - 1 ] != ' ' ) )
// Also check for embedded string formating quote
const MIchar cBckSlash = '\\';
const MIchar cSpace = ' ';
if( (nPos > 1) && (vrTxt[ nPos - 1 ] == cBckSlash) && (vrTxt[ nPos - 2 ] != cSpace) )
{
return false;
}
if( (nPos > 0) && (vrTxt[ nPos - 1 ] != cSpace) )
return false;

// Need to find the other quote
const MIint nPos2 = vrTxt.find( cQuote, nPos + 1 );
const MIint nPos2 = vrTxt.rfind( cQuote );
if( nPos2 == (MIint) std::string::npos )
return false;

// Make sure not same quote, need two quotes
if( nPos == nPos2 )
return MIstatus::failure;

return true;
}

//++ ------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type argument.
// Take into account quotes surrounding the text. Take into account string format
// embedded quotes surrounding the text i.e. "\\\"%5d\\\"". Note this function falls
// through to IsStringArgQuotedText() should the criteria match fail.
// Type: Method.
// Args: vrTxt - (R) Some text.
// Return: bool - True = yes valid arg, false = no.
// Throws: None.
//--
bool CMICmdArgValString::IsStringArgQuotedTextEmbedded( const CMIUtilString & vrTxt ) const
{
// CODETAG_QUOTEDTEXT_SIMILAR_CODE
const MIchar cBckSlash = '\\';
const MIint nPos = vrTxt.find( cBckSlash );
if( nPos == (MIint) std::string::npos )
return false;

// Slash must be the first character in the string or be preceeded by a space
const MIchar cSpace = ' ';
if( (nPos > 0) && (vrTxt[ nPos - 1 ] != cSpace) )
return false;

// Need to find the other matching slash
const MIint nPos2 = vrTxt.rfind( cBckSlash );
if( nPos2 == (MIint) std::string::npos )
return false;

// Make sure not same back slash, need two slashs
if( nPos == nPos2 )
return MIstatus::failure;

return false;
}

//++ ------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type argument.
// Take into account quotes surrounding the text. Take into account string format
// embedded quotes surrounding the text i.e. "\\\"%5d\\\"". Note this function falls
// through to IsStringArgQuotedTextEmbedded() should the criteria match fail.
// Type: Method.
// Args: vrTxt - (R) Some text.
// Return: bool - True = yes valid arg, false = no.
// Throws: None.
//--
bool CMICmdArgValString::IsStringArgQuotedQuotedTextEmbedded( const CMIUtilString & vrTxt ) const
{
const MIint nPos = vrTxt.find( "\"\\\"" );
if( nPos == (MIint) std::string::npos )
return false;

const MIint nPos2 = vrTxt.rfind( "\\\"\"" );
if( nPos2 == (MIint) std::string::npos )
return false;

const MIint nLen = vrTxt.length();
if( (nLen > 5) && ((nPos + 2) == (nPos2 - 2)) )
return false;

return true;
}
4 changes: 4 additions & 0 deletions lldb/tools/lldb-mi/MICmdArgValString.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,12 @@ class CMICmdArgValString : public CMICmdArgValBaseTemplate< CMIUtilString >
private:
bool ValidateSingleText( CMICmdArgContext & vrwArgContext );
bool ValidateQuotedText( CMICmdArgContext & vrwArgContext );
bool ValidateQuotedTextEmbedded( CMICmdArgContext & vrwArgContext );
bool ValidateQuotedQuotedTextEmbedded( CMICmdArgContext & vrwArgContext );
bool IsStringArgSingleText( const CMIUtilString & vrTxt ) const;
bool IsStringArgQuotedText( const CMIUtilString & vrTxt ) const;
bool IsStringArgQuotedTextEmbedded( const CMIUtilString & vrTxt ) const;
bool IsStringArgQuotedQuotedTextEmbedded( const CMIUtilString & vrTxt ) const;

// Attribute:
private:
Expand Down
4 changes: 2 additions & 2 deletions lldb/tools/lldb-mi/MICmdArgValThreadGrp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ CMICmdArgValThreadGrp::CMICmdArgValThreadGrp( const CMIUtilString & vrArgName, c

//++ ------------------------------------------------------------------------------------
// Details: CMICmdArgValThreadGrp destructor.
// Type: Overridden.
// Type: Overidden.
// Args: None.
// Return: None.
// Throws: None.
Expand Down Expand Up @@ -169,4 +169,4 @@ bool CMICmdArgValThreadGrp::ExtractNumber( const CMIUtilString & vrTxt )
MIuint CMICmdArgValThreadGrp::GetNumber( void ) const
{
return m_nThreadGrp;
}
}
37 changes: 37 additions & 0 deletions lldb/tools/lldb-mi/MICmdBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,3 +224,40 @@ bool CMICmdBase::ParseArgs( void )
return MIstatus::success;
}

//++ ------------------------------------------------------------------------------------
// Details: Having previously given CMICmdArgSet m_setCmdArgs all the argument or option
// definitions for the command to handle proceed to parse and validate the
// command's options text for those arguments and extract the values for each if
// any.
// Type: Method.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdBase::ParseValidateCmdOptions( void )
{
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
return MIstatus::success;

SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );

return MIstatus::failure;
}

//++ ------------------------------------------------------------------------------------
// Details: If the MI Driver is not operating via a client i.e. Eclipse but say operating
// on a executable passed in as a argument to the drive then what should the driver
// do on a command failing? Either continue operating or exit the application.
// Override this function where a command failure cannot allow the driver to
// continue operating.
// Type: Overrideable.
// Args: None.
// Return: bool - True = Fatal if command fails, false = can continue if command fails.
// Throws: None.
//--
bool CMICmdBase::GetExitAppOnCommandFailure( void ) const
{
return false;
}
2 changes: 2 additions & 0 deletions lldb/tools/lldb-mi/MICmdBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,14 @@ class CMICmdBase
// Overrideable:
public:
/* dtor */ virtual ~CMICmdBase( void );
virtual bool GetExitAppOnCommandFailure( void ) const;

// Methods:
protected:
void SetError( const CMIUtilString & rErrMsg );
template< class T >
T * GetOption( const CMIUtilString & vStrOptionName );
bool ParseValidateCmdOptions( void );

// Attributes:
protected:
Expand Down
28 changes: 0 additions & 28 deletions lldb/tools/lldb-mi/MICmdCmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,36 +20,8 @@
// Copyright: None.
//--

// Third Party Headers:
#include <lldb/API/SBBreakpointLocation.h>
#include <lldb/API/SBCommandInterpreter.h>
#include <lldb/API/SBStream.h>
#include <lldb/API/SBThread.h>
#include <lldb/API/SBTypeFormat.h>
#include <limits.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmd.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIOutOfBandRecord.h"
#include "MICmnResources.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MIDriverBase.h"
#include "MIUtilDebug.h"
#include "MIDriver.h"
#include "MIUtilFileStd.h"
#include "MICmnLLDBProxySBValue.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
#include "MICmdArgValOptionLong.h"
#include "MICmdArgValOptionShort.h"
#include "MICmdArgValListOfN.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdEnablePrettyPrinting constructor.
Expand Down
60 changes: 9 additions & 51 deletions lldb/tools/lldb-mi/MICmdCmdBreak.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,12 @@
#include <lldb/API/SBBreakpointLocation.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdBreak.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIOutOfBandRecord.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
Expand Down Expand Up @@ -102,22 +100,15 @@ bool CMICmdCmdBreakInsert::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedTempBrkPt, false, true )) );
//Not implemented bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedHWBrkPt, false, false ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedPendinfBrkPt, false, true, CMICmdArgValListBase::eArgValType_String, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedPendinfBrkPt, false, true, CMICmdArgValListBase::eArgValType_StringQuotedNumberPath, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedDisableBrkPt, false, false ) ) );
//Not implemented bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedTracePt, false, false ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedConditionalBrkPt, false, true, CMICmdArgValListBase::eArgValType_StringQuoted, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedInoreCnt, false, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgNamedRestrictBrkPtToThreadId, false, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedLocation, false, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgNamedThreadGroup, false, true, CMICmdArgValListBase::eArgValType_ThreadGrp, 1 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -285,6 +276,8 @@ bool CMICmdCmdBreakInsert::Execute( void )
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_BRKPT_INVALID ), m_cmdData.strMiCmd.c_str(), m_brkName.c_str() ) );
return MIstatus::failure;
}

// CODETAG_LLDB_BRKPT_ID_MAX
if( m_brkPt.GetID() > (lldb::break_id_t) rSessionInfo.m_nBrkPointCntMax )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_BRKPT_CNT_EXCEEDED ), m_cmdData.strMiCmd.c_str(), rSessionInfo.m_nBrkPointCntMax, m_brkName.c_str() ) );
Expand Down Expand Up @@ -401,14 +394,7 @@ bool CMICmdCmdBreakDelete::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgNamedThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValListOfN( m_constStrArgNamedBrkPt, true, true, CMICmdArgValListBase::eArgValType_Number ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -522,14 +508,7 @@ bool CMICmdCmdBreakDisable::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgNamedThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValListOfN( m_constStrArgNamedBrkPt, true, true, CMICmdArgValListBase::eArgValType_Number ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -663,14 +642,7 @@ bool CMICmdCmdBreakEnable::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgNamedThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValListOfN( m_constStrArgNamedBrkPt, true, true, CMICmdArgValListBase::eArgValType_Number ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -806,14 +778,7 @@ bool CMICmdCmdBreakAfter::ParseArgs( void )
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgNamedThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNamedNumber, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNamedCount, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -939,14 +904,7 @@ bool CMICmdCmdBreakCondition::ParseArgs( void )
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNamedNumber, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedExpr, true, true, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValListOfN( m_constStrArgNamedExprNoQuotes, true, false, CMICmdArgValListBase::eArgValType_StringQuotedNumber ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
133 changes: 64 additions & 69 deletions lldb/tools/lldb-mi/MICmdCmdData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,12 @@
#include <lldb/API/SBStream.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdData.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmnLLDBProxySBValue.h"
#include "MICmdArgContext.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
Expand All @@ -50,6 +48,7 @@
#include "MICmdArgValListOfN.h"
#include "MICmdArgValConsume.h"
#include "MICmnLLDBDebugSessionInfoVarObj.h"
#include "MICmnLLDBUtilSBValue.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdDataEvaluateExpression constructor.
Expand All @@ -63,6 +62,8 @@ CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression( void )
, m_bEvaluatedExpression( true )
, m_strValue( "??" )
, m_bCompositeVarType( false )
, m_bFoundInvalidChar( false )
, m_cExpressionInvalidChar( 0x00 )
, m_constStrArgThread( "thread" )
, m_constStrArgFrame( "frame" )
, m_constStrArgExpr( "expr" )
Expand Down Expand Up @@ -99,14 +100,7 @@ bool CMICmdCmdDataEvaluateExpression::ParseArgs( void )
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 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -139,13 +133,29 @@ bool CMICmdCmdDataEvaluateExpression::Execute( void )
m_bEvaluatedExpression = false;
return MIstatus::success;
}
const CMICmnLLDBUtilSBValue utilValue( value );
if( !utilValue.HasName() )
{
if( HaveInvalidCharacterInExpression( rExpression, m_cExpressionInvalidChar ) )
{
m_bFoundInvalidChar = true;
return MIstatus::success;
}

m_strValue = rExpression;
return MIstatus::success;
}
if( rExpression.IsQuoted() )
{
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 = (value.GetValue() != nullptr) ? value.GetValue() : "??";

m_strValue = utilValue.GetValue();
CMIUtilString strCString;
if( CMICmnLLDBProxySBValue::GetCString( value, strCString ) )
{
Expand All @@ -156,7 +166,7 @@ bool CMICmdCmdDataEvaluateExpression::Execute( void )

// Composite type i.e. struct
m_bCompositeVarType = true;
MIuint nChild = value.GetNumChildren();
const MIuint nChild = value.GetNumChildren();
for( MIuint i = 0; i < nChild; i++ )
{
lldb::SBValue member = value.GetChildAtIndex( i );
Expand Down Expand Up @@ -204,6 +214,15 @@ bool CMICmdCmdDataEvaluateExpression::Acknowledge( void )
m_miResultRecord = miRecordResult;
return MIstatus::success;
}

if( m_bFoundInvalidChar )
{
const CMICmnMIValueConst miValueConst( CMIUtilString::Format( "Invalid character '%c' in expression", m_cExpressionInvalidChar ) );
const CMICmnMIValueResult miValueResult( "msg", miValueConst );
const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult );
m_miResultRecord = miRecordResult;
return MIstatus::success;
}

const CMICmnMIValueConst miValueConst( m_strValue );
const CMICmnMIValueResult miValueResult( "value", miValueConst );
Expand All @@ -212,14 +231,14 @@ bool CMICmdCmdDataEvaluateExpression::Acknowledge( void )
return MIstatus::success;
}

const CMICmnMIValueConst miValueConst( "could not evaluate expression" );
const CMICmnMIValueConst miValueConst( "Could not evaluate expression" );
const CMICmnMIValueResult miValueResult( "msg", miValueConst );
const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult );
m_miResultRecord = miRecordResult;
return MIstatus::success;
}

const CMICmnMIValueConst miValueConst( "invalid expression" );
const CMICmnMIValueConst miValueConst( "Invalid expression" );
const CMICmnMIValueResult miValueResult( "msg", miValueConst );
const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult );
m_miResultRecord = miRecordResult;
Expand All @@ -240,6 +259,29 @@ CMICmdBase * CMICmdCmdDataEvaluateExpression::CreateSelf( void )
return new CMICmdCmdDataEvaluateExpression();
}

//++ ------------------------------------------------------------------------------------
// Details: Examine the expression string to see if it contains invalid characters.
// Type: Method.
// Args: vrExpr - (R) Expression string given to *this command.
// vrwInvalidChar - (W) True = Invalid character found, false = nothing found.
// Return: bool - True = Invalid character found, false = nothing found.
// Throws: None.
//--
bool CMICmdCmdDataEvaluateExpression::HaveInvalidCharacterInExpression( const CMIUtilString & vrExpr, MIchar & vrwInvalidChar )
{
bool bFoundInvalidCharInExpression = false;
vrwInvalidChar = 0x00;

if( vrExpr.at( 0 ) == '\\' )
{
// Example: Mouse hover over "%5d" expression has \"%5d\" in it
bFoundInvalidCharInExpression = true;
vrwInvalidChar = '\\';
}

return bFoundInvalidCharInExpression;
}

//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
Expand Down Expand Up @@ -293,14 +335,7 @@ bool CMICmdCmdDataDisassemble::ParseArgs( void )
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 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -505,14 +540,7 @@ bool CMICmdCmdDataReadMemoryBytes::ParseArgs( void )
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgByteOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgAddrStart, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNumBytes, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -745,14 +773,7 @@ bool CMICmdCmdDataListRegisterNames::ParseArgs( void )
{
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 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -781,18 +802,13 @@ bool CMICmdCmdDataListRegisterNames::Execute( void )
for( MIuint i = 0; i < nRegisters; i++ )
{
lldb::SBValue value = registers.GetValueAtIndex( i );
const MIchar * pRegName = value.GetName();
const MIchar * pUnknown = "??";
pRegName = (pRegName != nullptr) ? pRegName : pUnknown;
const MIuint nRegChildren = value.GetNumChildren();
for( MIuint j = 0; j < nRegChildren; j++ )
{
lldb::SBValue value2 = value.GetChildAtIndex( j );
if( value2.IsValid() )
{
const MIchar * pRegName = value2.GetName();
pRegName = (pRegName != nullptr) ? pRegName : pUnknown;
const CMICmnMIValueConst miValueConst( pRegName );
const CMICmnMIValueConst miValueConst( CMICmnLLDBUtilSBValue( value2 ).GetName() );
m_miValueList.Add( miValueConst );
}
}
Expand Down Expand Up @@ -884,14 +900,7 @@ bool CMICmdCmdDataListRegisterValues::ParseArgs( void )
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 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1147,14 +1156,7 @@ bool CMICmdCmdDataWriteMemoryBytes::ParseArgs( void )
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 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1274,14 +1276,7 @@ bool CMICmdCmdDataWriteMemory::ParseArgs( void )
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 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
16 changes: 11 additions & 5 deletions lldb/tools/lldb-mi/MICmdCmdData.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,21 @@ class CMICmdCmdDataEvaluateExpression : public CMICmdBase
// From CMICmnBase
/* dtor */ virtual ~CMICmdCmdDataEvaluateExpression( void );

// Methods:
private:
bool HaveInvalidCharacterInExpression( const CMIUtilString & vrExpr, MIchar & vrwInvalidChar );

// Attributes:
private:
bool m_bExpressionValid; // True = yes is valid, false = not valid
bool m_bEvaluatedExpression; // True = yes is expression evaluated, false = failed
bool m_bExpressionValid; // True = yes is valid, false = not valid
bool m_bEvaluatedExpression; // True = yes is expression evaluated, false = failed
CMIUtilString m_strValue;
CMICmnMIValueTuple m_miValueTuple;
bool m_bCompositeVarType; // True = yes composite type, false = internal type
const CMIUtilString m_constStrArgThread; // Not specified in MI spec but Eclipse gives this option. Not handled by command.
const CMIUtilString m_constStrArgFrame; // Not specified in MI spec but Eclipse gives this option. Not handled by command.
bool m_bCompositeVarType; // True = yes composite type, false = internal type
bool m_bFoundInvalidChar; // True = yes found unexpected character in the expression, false = all ok
MIchar m_cExpressionInvalidChar;
const CMIUtilString m_constStrArgThread; // Not specified in MI spec but Eclipse gives this option. Not handled by command.
const CMIUtilString m_constStrArgFrame; // Not specified in MI spec but Eclipse gives this option. Not handled by command.
const CMIUtilString m_constStrArgExpr;
};

Expand Down
21 changes: 1 addition & 20 deletions lldb/tools/lldb-mi/MICmdCmdEnviro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,12 @@
//--

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdEnviro.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MIDriverBase.h"
#include "MIUtilDebug.h"
#include "MIDriver.h"
#include "MIUtilFileStd.h"
#include "MICmnLLDBProxySBValue.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
#include "MICmdArgValOptionLong.h"
#include "MICmdArgValOptionShort.h"
#include "MICmdArgValListOfN.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdEnvironmentCd constructor.
Expand Down Expand Up @@ -81,13 +68,7 @@ bool CMICmdCmdEnvironmentCd::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValFile( m_constStrArgNamePathDir, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
49 changes: 6 additions & 43 deletions lldb/tools/lldb-mi/MICmdCmdExec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// CMICmdCmdExecNextInstruction implementation.
// CMICmdCmdExecStepInstruction implementation.
// CMICmdCmdExecFinish implementation.
// CMICmdCmdExecInterupt implementation.
// CMICmdCmdExecInterrupt implementation.
//
// Environment: Compilers: Visual C++ 12.
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Expand All @@ -30,14 +30,12 @@
#include <lldb/API/SBCommandInterpreter.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdExec.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MIDriver.h"
#include "MICmdArgContext.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
Expand Down Expand Up @@ -300,14 +298,7 @@ bool CMICmdCmdExecNext::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNumber, false, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -428,14 +419,7 @@ bool CMICmdCmdExecStep::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNumber, false, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -556,14 +540,7 @@ bool CMICmdCmdExecNextInstruction::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNumber, false, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -684,14 +661,7 @@ bool CMICmdCmdExecStepInstruction::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNumber, false, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -812,14 +782,7 @@ bool CMICmdCmdExecFinish::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgFrame, false, false, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion lldb/tools/lldb-mi/MICmdCmdExec.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// CMICmdCmdExecNextInstruction interface.
// CMICmdCmdExecStepInstruction interface.
// CMICmdCmdExecFinish interface.
// CMICmdCmdExecInterupt interface.
// CMICmdCmdExecInterrupt interface.
//
// To implement new MI commands derive a new command class from the command base
// class. To enable the new command for interpretation add the new command class
Expand Down
33 changes: 17 additions & 16 deletions lldb/tools/lldb-mi/MICmdCmdFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,13 @@
#include <lldb/API/SBStream.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdFile.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MIUtilFileStd.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
#include "MICmdArgValOptionLong.h"
#include "MICmdArgValOptionShort.h"
#include "MICmdArgValListOfN.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdFileExecAndSymbols constructor.
Expand Down Expand Up @@ -81,14 +73,7 @@ bool CMICmdCmdFileExecAndSymbols::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValFile( m_constStrArgNameFile, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -181,3 +166,19 @@ CMICmdBase * CMICmdCmdFileExecAndSymbols::CreateSelf( void )
{
return new CMICmdCmdFileExecAndSymbols();
}

//++ ------------------------------------------------------------------------------------
// Details: If the MI Driver is not operating via a client i.e. Eclipse but say operating
// on a executable passed in as a argument to the drive then what should the driver
// do on a command failing? Either continue operating or exit the application.
// Override this function where a command failure cannot allow the driver to
// continue operating.
// Type: Overridden.
// Args: None.
// Return: bool - True = Fatal if command fails, false = can continue if command fails.
// Throws: None.
//--
bool CMICmdCmdFileExecAndSymbols::GetExitAppOnCommandFailure( void ) const
{
return true;
}
1 change: 1 addition & 0 deletions lldb/tools/lldb-mi/MICmdCmdFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class CMICmdCmdFileExecAndSymbols : public CMICmdBase
virtual bool ParseArgs( void );
// From CMICmnBase
/* dtor */ virtual ~CMICmdCmdFileExecAndSymbols( void );
virtual bool GetExitAppOnCommandFailure( void ) const;

// Attributes:
private:
Expand Down
10 changes: 1 addition & 9 deletions lldb/tools/lldb-mi/MICmdCmdGdbInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#include "MICmdCmdGdbInfo.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmdArgContext.h"
#include "MICmdArgValString.h"
#include "MICmnStreamStdout.h"
#include "MICmnLLDBDebugSessionInfo.h"
Expand Down Expand Up @@ -80,14 +79,7 @@ CMICmdCmdGdbInfo::~CMICmdCmdGdbInfo( void )
bool CMICmdCmdGdbInfo::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedPrint, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
10 changes: 1 addition & 9 deletions lldb/tools/lldb-mi/MICmdCmdGdbSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include "MICmdCmdGdbSet.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmdArgContext.h"
#include "MICmdArgValString.h"
#include "MICmdArgValListOfN.h"
#include "MICmnLLDBDebugSessionInfo.h"
Expand Down Expand Up @@ -81,14 +80,7 @@ CMICmdCmdGdbSet::~CMICmdCmdGdbSet( void )
bool CMICmdCmdGdbSet::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValListOfN( m_constStrArgNamedGdbOption, true, true, CMICmdArgValListBase::eArgValType_StringQuotedNumberPath ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
118 changes: 95 additions & 23 deletions lldb/tools/lldb-mi/MICmdCmdMiscellanous.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// Overview: CMICmdCmdGdbExit implementation.
// CMICmdCmdListThreadGroups implementation.
// CMICmdCmdInterpreterExec implementation.
// CMICmdCmdInferiorTtySet implementation.
//
// Environment: Compilers: Visual C++ 12.
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Expand All @@ -26,15 +27,13 @@
#include <lldb/API/SBThread.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdMiscellanous.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIOutOfBandRecord.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MIDriverBase.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
Expand Down Expand Up @@ -182,14 +181,7 @@ bool CMICmdCmdListThreadGroups::ParseArgs( void )
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgNamedRecurse, false, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValListOfN( m_constStrArgNamedGroup, false, true, CMICmdArgValListBase::eArgValType_Number ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValThreadGrp( m_constStrArgNamedThreadGroup, false, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -248,7 +240,7 @@ bool CMICmdCmdListThreadGroups::Execute( void )
if( thread.IsValid() )
{
CMICmnMIValueTuple miTuple;
if( !rSessionInfo.MIResponseFormThreadInfo( m_cmdData, thread, miTuple ) )
if( !rSessionInfo.MIResponseFormThreadInfo2( m_cmdData, thread, miTuple ) )
return MIstatus::failure;

m_vecMIValueTuple.push_back( miTuple );
Expand Down Expand Up @@ -431,14 +423,7 @@ bool CMICmdCmdInterpreterExec::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedInterpreter, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedCommand, true, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand All @@ -454,11 +439,14 @@ bool CMICmdCmdInterpreterExec::Execute( void )
{
CMICMDBASE_GETOPTION( pArgInterpreter, String, m_constStrArgNamedInterpreter );
CMICMDBASE_GETOPTION( pArgCommand, String, m_constStrArgNamedCommand );
const CMIUtilString & rStrInterpreter( pArgInterpreter->GetValue() );

// Handle the interpreter parameter by do nothing on purpose (set to 'handled' in
// the arg definition above)
const CMIUtilString & rStrInterpreter( pArgInterpreter->GetValue() ); MIunused( rStrInterpreter );

const CMIUtilString & rStrCommand( pArgCommand->GetValue() );
const CMIUtilString strCmd( CMIUtilString::Format( "%s %s", rStrInterpreter.c_str(), rStrCommand.c_str() ) );
CMICmnLLDBDebugSessionInfo & rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() );
const lldb::ReturnStatus rtn = rSessionInfo.m_rLldbDebugger.GetCommandInterpreter().HandleCommand( strCmd.c_str(), m_lldbResult, true ); MIunused( rtn );
const lldb::ReturnStatus rtn = rSessionInfo.m_rLldbDebugger.GetCommandInterpreter().HandleCommand( rStrCommand.c_str(), m_lldbResult, true ); MIunused( rtn );

return MIstatus::success;
}
Expand All @@ -479,12 +467,19 @@ bool CMICmdCmdInterpreterExec::Acknowledge( void )
CMIUtilString strMsg( m_lldbResult.GetOutput() );
strMsg = strMsg.StripCREndOfLine();
CMICmnStreamStdout::TextToStdout( strMsg );

// Send the LLDB result message to console so the user can see the result of the
// command they typed. It is not necessary an error message.
CMICmnStreamStderr::LLDBMsgToConsole( strMsg );
}
if( m_lldbResult.GetErrorSize() > 0 )
{
CMIUtilString strMsg( m_lldbResult.GetError() );
strMsg = strMsg.StripCREndOfLine();
CMICmnStreamStderr::TextToStderr( strMsg );
CMICmnStreamStderr::LLDBMsgToConsole( strMsg );

// Send LLDB's error message to the MI Driver's Log file
CMICmnStreamStdout::TextToStdout( strMsg );
}

const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done );
Expand All @@ -505,3 +500,80 @@ CMICmdBase * CMICmdCmdInterpreterExec::CreateSelf( void )
{
return new CMICmdCmdInterpreterExec();
}

//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdInferiorTtySet constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdCmdInferiorTtySet::CMICmdCmdInferiorTtySet( void )
{
// Command factory matches this name with that received from the stdin stream
m_strMiCmd = "inferior-tty-set";

// Required by the CMICmdFactory when registering *this command
m_pSelfCreatorFn = &CMICmdCmdInferiorTtySet::CreateSelf;
}

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdInferiorTtySet destructor.
// Type: Overrideable.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdCmdInferiorTtySet::~CMICmdCmdInferiorTtySet( void )
{
}

//++ ------------------------------------------------------------------------------------
// Details: The invoker requires this function. The command does work in this function.
// The command is likely to communicate with the LLDB SBDebugger in here.
// Type: Overridden.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdCmdInferiorTtySet::Execute( void )
{
// Do nothing

return MIstatus::success;
}

//++ ------------------------------------------------------------------------------------
// Details: The invoker requires this function. The command prepares a MI Record Result
// for the work carried out in the Execute().
// Type: Overridden.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdCmdInferiorTtySet::Acknowledge( void )
{
const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done );
m_miResultRecord = miRecordResult;

return MIstatus::success;
}

//++ ------------------------------------------------------------------------------------
// Details: Required by the CMICmdFactory when registering *this command. The factory
// calls this function to create an instance of *this command.
// Type: Static method.
// Args: None.
// Return: CMICmdBase * - Pointer to a new command.
// Throws: None.
//--
CMICmdBase * CMICmdCmdInferiorTtySet::CreateSelf( void )
{
return new CMICmdCmdInferiorTtySet();
}
28 changes: 28 additions & 0 deletions lldb/tools/lldb-mi/MICmdCmdMiscellanous.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// Overview: CMICmdCmdGdbExit interface.
// CMICmdCmdListThreadGroups interface.
// CMICmdCmdInterpreterExec interface.
// CMICmdCmdInferiorTtySet interface.
//
// To implement new MI commands derive a new command class from the command base
// class. To enable the new command for interpretation add the new command class
Expand Down Expand Up @@ -145,3 +146,30 @@ class CMICmdCmdInterpreterExec : public CMICmdBase
const CMIUtilString m_constStrArgNamedCommand;
lldb::SBCommandReturnObject m_lldbResult;
};

//++ ============================================================================
// Details: MI command class. MI commands derived from the command base class.
// *this class implements MI command "inferior-tty-set".
// Gotchas: None.
// Authors: Illya Rudkin 22/07/2014.
// Changes: None.
//--
class CMICmdCmdInferiorTtySet : public CMICmdBase
{
// Statics:
public:
// Required by the CMICmdFactory when registering *this command
static CMICmdBase * CreateSelf( void );

// Methods:
public:
/* ctor */ CMICmdCmdInferiorTtySet( void );

// Overridden:
public:
// From CMICmdInvoker::ICmd
virtual bool Execute( void );
virtual bool Acknowledge( void );
// From CMICmnBase
/* dtor */ virtual ~CMICmdCmdInferiorTtySet( void );
};
110 changes: 44 additions & 66 deletions lldb/tools/lldb-mi/MICmdCmdStack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,12 @@
#include <lldb/API/SBThread.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdStack.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIOutOfBandRecord.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmdArgContext.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
Expand Down Expand Up @@ -84,14 +82,7 @@ bool CMICmdCmdStackInfoDepth::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgMaxDepth, false, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand All @@ -117,7 +108,9 @@ bool CMICmdCmdStackInfoDepth::Execute( void )
}

CMICmnLLDBDebugSessionInfo & rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() );
m_nThreadFrames = rSessionInfo.m_lldbProcess.GetThreadByIndexID( nThreadId ).GetNumFrames();
lldb::SBProcess & rProcess = rSessionInfo.m_lldbProcess;
lldb::SBThread thread = (nThreadId != UINT64_MAX) ? rProcess.GetThreadByIndexID( nThreadId ) : rProcess.GetSelectedThread();
m_nThreadFrames = thread.GetNumFrames();

return MIstatus::success;
}
Expand Down Expand Up @@ -205,14 +198,7 @@ bool CMICmdCmdStackListFrames::ParseArgs( void )
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, true, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgFrameLow, false, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgFrameHigh, false, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -243,7 +229,8 @@ bool CMICmdCmdStackListFrames::Execute( void )
const MIuint nFrameLow = pArgFrameLow->GetFound() ? pArgFrameLow->GetValue() : 0;

CMICmnLLDBDebugSessionInfo & rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() );
lldb::SBThread thread = rSessionInfo.m_lldbProcess.GetThreadByIndexID( nThreadId );
lldb::SBProcess & rProcess = rSessionInfo.m_lldbProcess;
lldb::SBThread thread = (nThreadId != UINT64_MAX) ? rProcess.GetThreadByIndexID( nThreadId ) : rProcess.GetSelectedThread();
MIuint nThreadFrames = thread.GetNumFrames();

// Adjust nThreadFrames for the nFrameHigh argument as we use nFrameHigh+1 in the min calc as the arg
Expand Down Expand Up @@ -385,14 +372,7 @@ bool CMICmdCmdStackListArguments::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong( m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgPrintValues, true, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -422,11 +402,7 @@ bool CMICmdCmdStackListArguments::Execute( void )

CMICmnLLDBDebugSessionInfo & rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() );
lldb::SBProcess & rProcess = rSessionInfo.m_lldbProcess;
lldb::SBThread thread;
if( nThreadId == UINT64_MAX )
thread = rProcess.GetSelectedThread();
else
thread = rProcess.GetThreadByIndexID( nThreadId );
lldb::SBThread thread = (nThreadId != UINT64_MAX) ? rProcess.GetThreadByIndexID( nThreadId ) : rProcess.GetSelectedThread();
m_bThreadInvalid = !thread.IsValid();
if( m_bThreadInvalid )
return MIstatus::success;
Expand All @@ -438,13 +414,23 @@ bool CMICmdCmdStackListArguments::Execute( void )
return MIstatus::success;
}

lldb::SBFrame frame = thread.GetFrameAtIndex( 0 );
CMICmnMIValueList miValueList( true );
const MIuint vMaskVarTypes = 0x1000;
if( !rSessionInfo.MIResponseFormVariableInfo( frame, vMaskVarTypes, miValueList ) )
return MIstatus::failure;

m_miValueList = miValueList;
const MIuint nFrames = thread.GetNumFrames();
for( MIuint i = 0; i < nFrames; i++ )
{
lldb::SBFrame frame = thread.GetFrameAtIndex( i );
CMICmnMIValueList miValueList( true );
const MIuint maskVarTypes = 0x1000;
if( !rSessionInfo.MIResponseFormVariableInfo3( frame, maskVarTypes, miValueList ) )
return MIstatus::failure;
const CMICmnMIValueConst miValueConst( CMIUtilString::Format( "%d", i ) );
const CMICmnMIValueResult miValueResult( "level", miValueConst );
CMICmnMIValueTuple miValueTuple( miValueResult );
const CMICmnMIValueResult miValueResult2( "args", miValueList );
miValueTuple.Add( miValueResult2 );
const CMICmnMIValueResult miValueResult3( "frame", miValueTuple );
m_miValueList.Add( miValueResult3 );
}

return MIstatus::success;
}
Expand All @@ -470,15 +456,8 @@ bool CMICmdCmdStackListArguments::Acknowledge( void )
return MIstatus::success;
}

// MI print "%s^done,stack-args=[frame={level=\"0\",args=[%s]}]"
const CMICmnMIValueConst miValueConst( "0" );
const CMICmnMIValueResult miValueResult( "level", miValueConst );
CMICmnMIValueTuple miValueTuple( miValueResult );
const CMICmnMIValueResult miValueResult2( "args", m_miValueList );
miValueTuple.Add( miValueResult2 );
const CMICmnMIValueResult miValueResult3( "frame", miValueTuple );
const CMICmnMIValueList miValueList( miValueResult3 );
const CMICmnMIValueResult miValueResult4( "stack-args", miValueList );
// MI print "%s^done,stack-args=[frame={level=\"0\",args=[%s]},frame={level=\"1\",args=[%s]}]"
const CMICmnMIValueResult miValueResult4( "stack-args", m_miValueList );
const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult4 );
m_miResultRecord = miRecordResult;

Expand Down Expand Up @@ -546,16 +525,9 @@ CMICmdCmdStackListLocals::~CMICmdCmdStackListLocals( void )
bool CMICmdCmdStackListLocals::ParseArgs( void )
{
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, false, 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 CMICmdArgValNumber( m_constStrArgPrintValues, true, false ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand All @@ -570,7 +542,7 @@ bool CMICmdCmdStackListLocals::ParseArgs( void )
bool CMICmdCmdStackListLocals::Execute( void )
{
CMICMDBASE_GETOPTION( pArgThread, OptionLong, m_constStrArgThread );
CMICMDBASE_GETOPTION( pArgPrintValues, Number, m_constStrArgPrintValues );
CMICMDBASE_GETOPTION( pArgFrame, OptionLong, m_constStrArgFrame );

// Retrieve the --thread option's thread ID (only 1)
MIuint64 nThreadId = UINT64_MAX;
Expand All @@ -582,14 +554,19 @@ bool CMICmdCmdStackListLocals::Execute( void )
return MIstatus::failure;
}
}
MIuint64 nFrame = UINT64_MAX;
if( pArgFrame->GetFound() )
{
if( !pArgFrame->GetExpectedOption< CMICmdArgValNumber, MIuint64 >( nFrame ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_OPTION_NOT_FOUND ), m_cmdData.strMiCmd.c_str(), m_constStrArgFrame.c_str() ) );
return MIstatus::failure;
}
}

CMICmnLLDBDebugSessionInfo & rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() );
lldb::SBProcess & rProcess = rSessionInfo.m_lldbProcess;
lldb::SBThread thread;
if( nThreadId == UINT64_MAX )
thread = rProcess.GetSelectedThread();
else
thread = rProcess.GetThreadByIndexID( nThreadId );
lldb::SBThread thread = (nThreadId != UINT64_MAX) ? rProcess.GetThreadByIndexID( nThreadId ) : rProcess.GetSelectedThread();
m_bThreadInvalid = !thread.IsValid();
if( m_bThreadInvalid )
return MIstatus::success;
Expand All @@ -601,10 +578,11 @@ bool CMICmdCmdStackListLocals::Execute( void )
return MIstatus::success;
}

lldb::SBFrame frame = thread.GetFrameAtIndex( 0 );
const MIuint nFrames = thread.GetNumFrames(); MIunused( nFrames );
lldb::SBFrame frame = (nFrame != UINT64_MAX) ? thread.GetFrameAtIndex( nFrame ) : thread.GetSelectedFrame();
CMICmnMIValueList miValueList( true );
const MIuint vMaskVarTypes = 0x0100;
if( !rSessionInfo.MIResponseFormVariableInfo( frame, vMaskVarTypes, miValueList ) )
const MIuint maskVarTypes = 0x0110;
if( !rSessionInfo.MIResponseFormVariableInfo( frame, maskVarTypes, miValueList ) )
return MIstatus::failure;

m_miValueList = miValueList;
Expand Down
11 changes: 1 addition & 10 deletions lldb/tools/lldb-mi/MICmdCmdSupportInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@
//--

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdSupportInfo.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIValueTuple.h"
#include "MICmdArgContext.h"
#include "MICmdArgValString.h"
#include "MICmdFactory.h"

Expand Down Expand Up @@ -70,14 +68,7 @@ CMICmdCmdSupportInfoMiCmdQuery::~CMICmdCmdSupportInfoMiCmdQuery( void )
bool CMICmdCmdSupportInfoMiCmdQuery::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgCmdName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
1 change: 0 additions & 1 deletion lldb/tools/lldb-mi/MICmdCmdSupportList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
//--

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdSupportList.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
Expand Down
17 changes: 1 addition & 16 deletions lldb/tools/lldb-mi/MICmdCmdTarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,13 @@
#include <lldb/API/SBCommandReturnObject.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdTarget.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIOutOfBandRecord.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
#include "MICmdArgValOptionLong.h"
#include "MICmdArgValOptionShort.h"
#include "MICmdArgValListOfN.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdTargetSelect constructor.
Expand Down Expand Up @@ -83,14 +75,7 @@ bool CMICmdCmdTargetSelect::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedType, true, true )) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgNamedParameters, true, true )) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
21 changes: 3 additions & 18 deletions lldb/tools/lldb-mi/MICmdCmdThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,12 @@
#include <lldb/API/SBThread.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdThread.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmdArgContext.h"
#include "MICmdArgValFile.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
#include "MICmdArgValOptionLong.h"
#include "MICmdArgValOptionShort.h"
#include "MICmdArgValListOfN.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdThreadInfo constructor.
Expand Down Expand Up @@ -82,14 +74,7 @@ CMICmdCmdThreadInfo::~CMICmdCmdThreadInfo( void )
bool CMICmdCmdThreadInfo::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgNamedThreadId, false, true )) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -123,7 +108,7 @@ bool CMICmdCmdThreadInfo::Execute( void )
return MIstatus::success;

CMICmnMIValueTuple miTuple;
if( !rSessionInfo.MIResponseFormThreadInfo( m_cmdData, thread, miTuple ) )
if( !rSessionInfo.MIResponseFormThreadInfo3( m_cmdData, thread, miTuple ) )
return MIstatus::failure;

m_miValueTupleThread = miTuple;
Expand All @@ -140,7 +125,7 @@ bool CMICmdCmdThreadInfo::Execute( void )
if( thread.IsValid() )
{
CMICmnMIValueTuple miTuple;
if( !rSessionInfo.MIResponseFormThreadInfo( m_cmdData, thread, miTuple ) )
if( !rSessionInfo.MIResponseFormThreadInfo3( m_cmdData, thread, miTuple ) )
return MIstatus::failure;

m_vecMIValueTuple.push_back( miTuple );
Expand Down
2 changes: 0 additions & 2 deletions lldb/tools/lldb-mi/MICmdCmdTrace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@
//--

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdTrace.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"


//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdTraceStatus constructor.
// Type: Method.
Expand Down
111 changes: 20 additions & 91 deletions lldb/tools/lldb-mi/MICmdCmdVar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,19 @@
#include <lldb/API/SBThread.h>

// In-house headers:
#include "MICmnConfig.h"
#include "MICmdCmdVar.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmdArgContext.h"
#include "MICmdArgValNumber.h"
#include "MICmdArgValString.h"
#include "MICmdArgValThreadGrp.h"
#include "MICmdArgValOptionLong.h"
#include "MICmdArgValOptionShort.h"
#include "MICmdArgValListOfN.h"
#include "MICmnLLDBProxySBValue.h"
#include "MICmnLLDBUtilSBValue.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdCmdVarCreate constructor.
Expand All @@ -60,6 +59,7 @@ CMICmdCmdVarCreate::CMICmdCmdVarCreate( void )
, m_nThreadId( 0 )
, m_strType( "??" )
, m_bValid( false )
, m_strValue( "??" )
, m_constStrArgThread( "thread" )
, m_constStrArgThreadGroup( "thread-group" )
, m_constStrArgFrame( "frame" )
Expand Down Expand Up @@ -102,14 +102,7 @@ bool CMICmdCmdVarCreate::ParseArgs( void )
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, false, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgFrameAddr, false, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgExpression, true, true, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -166,7 +159,7 @@ bool CMICmdCmdVarCreate::Execute( void )
m_strExpression = rStrExpression;

CMICmnLLDBDebugSessionInfo & rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() );
m_strVarName = "unnamedvariable";
m_strVarName = "<unnamedvariable>";
if( bAutoName )
{
m_strVarName = CMIUtilString::Format( "var%u", CMICmnLLDBDebugSessionInfoVarObj::VarObjIdGet() );
Expand All @@ -182,14 +175,11 @@ bool CMICmdCmdVarCreate::Execute( void )
{
m_bValid = true;
m_nChildren = value.GetNumChildren();
const MIchar * pCType = value.GetTypeName();
m_strType = (pCType != nullptr) ? pCType : m_strType;
}

if( m_bValid )
{
m_strType = CMICmnLLDBUtilSBValue( value ).GetTypeNameDisplay();

// This gets added to CMICmnLLDBDebugSessionInfoVarObj static container of varObjs
CMICmnLLDBDebugSessionInfoVarObj varObj( rStrExpression, m_strVarName, value );
m_strValue = varObj.GetValueFormatted();
}

return MIstatus::success;
Expand All @@ -214,9 +204,7 @@ bool CMICmdCmdVarCreate::Acknowledge( void )
const CMIUtilString strNumChild( CMIUtilString::Format( "%d", m_nChildren ) );
const CMICmnMIValueConst miValueConst2( strNumChild );
miValueResultAll.Add( "numchild", miValueConst2 );
CMICmnLLDBDebugSessionInfoVarObj varObj;
const bool bOk = CMICmnLLDBDebugSessionInfoVarObj::VarObjGet( m_strVarName, varObj ); MIunused( bOk );
const CMICmnMIValueConst miValueConst3( varObj.GetValueFormatted() );
const CMICmnMIValueConst miValueConst3( m_strValue );
miValueResultAll.Add( "value", miValueConst3 );
const CMICmnMIValueConst miValueConst4( m_strType );
miValueResultAll.Add( "type", miValueConst4 );
Expand All @@ -225,7 +213,7 @@ bool CMICmdCmdVarCreate::Acknowledge( void )
miValueResultAll.Add( "thread-id", miValueConst5 );
const CMICmnMIValueConst miValueConst6( "0" );
miValueResultAll.Add( "has_more", miValueConst6 );

const CMICmnMIResultRecord miRecordResult( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResultAll );
m_miResultRecord = miRecordResult;

Expand Down Expand Up @@ -303,14 +291,7 @@ bool CMICmdCmdVarUpdate::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgPrintValues, false, false ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -609,14 +590,7 @@ CMICmdCmdVarDelete::CMICmdCmdVarDelete( void )
bool CMICmdCmdVarDelete::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -726,14 +700,7 @@ bool CMICmdCmdVarAssign::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgExpression, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -862,14 +829,7 @@ bool CMICmdCmdVarSetFormat::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgFormatSpec, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1008,14 +968,7 @@ bool CMICmdCmdVarListChildren::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValNumber( m_constStrArgPrintValues, false, false ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1051,13 +1004,10 @@ bool CMICmdCmdVarListChildren::Execute( void )
lldb::SBValue member = rValue.GetChildAtIndex( i );
if( !member.IsValid() )
continue;

const MIchar * pExp = member.GetName();
const CMIUtilString strExp = (pExp != nullptr) ? pExp : "??";
const CMICmnLLDBUtilSBValue utilValue( member );
const CMIUtilString strExp = utilValue.GetName();
const CMIUtilString name( CMIUtilString::Format( "%s.%s", rVarObjName.c_str(), strExp.c_str() ) );
const MIuint nChildren = member.GetNumChildren();
const MIchar * pTypeName = member.GetType().GetName();
const CMIUtilString strType = (pTypeName != nullptr) ? pTypeName : MIRSRC( IDS_WORD_UNKNOWNTYPE_BRKTS );
const CMIUtilString strThreadId( CMIUtilString::Format( "%u", member.GetThread().GetIndexID() ) );

// Varobj gets added to CMICmnLLDBDebugSessionInfoVarObj static container of varObjs
Expand All @@ -1074,7 +1024,7 @@ bool CMICmdCmdVarListChildren::Execute( void )
const CMICmnMIValueConst miValueConst3( strNumChild );
const CMICmnMIValueResult miValueResult3( "numchild", miValueConst3 );
miValueTuple.Add( miValueResult3 );
const CMICmnMIValueConst miValueConst5( strType );
const CMICmnMIValueConst miValueConst5( utilValue.GetTypeNameDisplay() );
const CMICmnMIValueResult miValueResult5( "type", miValueConst5 );
miValueTuple.Add( miValueResult5 );
const CMICmnMIValueConst miValueConst6( strThreadId );
Expand Down Expand Up @@ -1203,14 +1153,7 @@ bool CMICmdCmdVarEvaluateExpression::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionShort( m_constStrArgFormatSpec, false, false, CMICmdArgValListBase::eArgValType_String, 1 ) ) );
bOk = bOk && m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1332,14 +1275,7 @@ CMICmdCmdVarInfoPathExpression::~CMICmdCmdVarInfoPathExpression( void )
bool CMICmdCmdVarInfoPathExpression::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1495,14 +1431,7 @@ CMICmdCmdVarShowAttributes::~CMICmdCmdVarShowAttributes( void )
bool CMICmdCmdVarShowAttributes::ParseArgs( void )
{
bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValString( m_constStrArgName, true, true ) ) );
CMICmdArgContext argCntxt( m_cmdData.strMiCmdOption );
if( bOk && !m_setCmdArgs.Validate( m_cmdData.strMiCmd, argCntxt ) )
{
SetError( CMIUtilString::Format( MIRSRC( IDS_CMD_ERR_ARGS ), m_cmdData.strMiCmd.c_str(), m_setCmdArgs.GetErrorDescription().c_str() ) );
return MIstatus::failure;
}

return bOk;
return (bOk && ParseValidateCmdOptions() );
}

//++ ------------------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions lldb/tools/lldb-mi/MICmdCmdVar.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ class CMICmdCmdVarCreate : public CMICmdBase
CMIUtilString m_strType;
bool m_bValid; // True = Variable is valid, false = not valid
CMIUtilString m_strExpression;
CMIUtilString m_strValue;
const CMIUtilString m_constStrArgThread; // Not specified in MI spec but Eclipse gives this option
const CMIUtilString m_constStrArgThreadGroup; // Not specified in MI spec but Eclipse gives this option
const CMIUtilString m_constStrArgFrame; // Not specified in MI spec but Eclipse gives this option
Expand Down
1 change: 1 addition & 0 deletions lldb/tools/lldb-mi/MICmdCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ bool MICmnCommands::RegisterAll( void )
bOk &= Register< CMICmdCmdGdbInfo >();
bOk &= Register< CMICmdCmdGdbSet >();
bOk &= Register< CMICmdCmdGdbThread >();
bOk &= Register< CMICmdCmdInferiorTtySet >();
bOk &= Register< CMICmdCmdInterpreterExec >();
bOk &= Register< CMICmdCmdListThreadGroups >();
bOk &= Register< CMICmdCmdSource >();
Expand Down
25 changes: 25 additions & 0 deletions lldb/tools/lldb-mi/MICmdInvoker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "MICmdMgr.h"
#include "MICmnLog.h"
#include "MICmnStreamStdout.h"
#include "MIDriver.h"

//++ ------------------------------------------------------------------------------------
// Details: CMICmdInvoker constructor.
Expand Down Expand Up @@ -197,6 +198,7 @@ bool CMICmdInvoker::CmdExecute( CMICmdBase & vCmd )
// Report command execution failed
const SMICmdData cmdData( vCmd.GetCmdData() );
CmdStdout( cmdData );
CmdCauseAppExit( vCmd );
CmdDelete( cmdData.id );

// Proceed to wait or execute next command
Expand All @@ -208,6 +210,7 @@ bool CMICmdInvoker::CmdExecute( CMICmdBase & vCmd )
// Report command execution failed
const SMICmdData cmdData( vCmd.GetCmdData() );
CmdStdout( cmdData );
CmdCauseAppExit( vCmd );
CmdDelete( cmdData.id );

// Proceed to wait or execute next command
Expand Down Expand Up @@ -240,6 +243,7 @@ bool CMICmdInvoker::CmdExecuteFinished( CMICmdBase & vCmd )
// Report command acknowledge functionality failed
const SMICmdData cmdData( vCmd.GetCmdData() );
CmdStdout( cmdData );
CmdCauseAppExit( vCmd );
CmdDelete( cmdData.id );

// Proceed to wait or execute next command
Expand Down Expand Up @@ -267,6 +271,27 @@ bool CMICmdInvoker::CmdExecuteFinished( CMICmdBase & vCmd )
return bOk;
}

//++ ------------------------------------------------------------------------------------
// Details: If the MI Driver is not operating via a client i.e. Eclipse check the command
// on failure suggests the application exits. A command can be such that a
// failure cannot the allow the application to continue operating.
// Args: vCmd - (R) Command object.
// Return: None.
// Return: None.
// Throws: None.
//--
void CMICmdInvoker::CmdCauseAppExit( const CMICmdBase & vCmd ) const
{
if( vCmd.GetExitAppOnCommandFailure() )
{
CMIDriver & rDriver( CMIDriver::Instance() );
if( rDriver.IsDriverDebuggingArgExecutable() )
{
rDriver.SetExitApplicationFlag( true );
}
}
}

//++ ------------------------------------------------------------------------------------
// Details: Write to stdout and the Log file the command's MI formatted result.
// Type: vCmdData - (R) A command's information.
Expand Down
1 change: 1 addition & 0 deletions lldb/tools/lldb-mi/MICmdInvoker.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ class CMICmdInvoker
bool CmdDelete( const MIuint vCmdId, const bool vbYesDeleteCmd = false );
bool CmdAdd( const CMICmdBase & vCmd );
bool CmdStdout( const SMICmdData & vCmdData ) const;
void CmdCauseAppExit( const CMICmdBase & vCmd ) const;

// Overridden:
private:
Expand Down
10 changes: 6 additions & 4 deletions lldb/tools/lldb-mi/MICmnConfig.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//===-- MIConfig.h ----------------------------------------------*- C++ -*-===//
//===-- MICmnConfig.h -------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
Expand All @@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===//

//++
// File: MIConfig.h
// File: MICmnConfig.h
//
// Overview: Common defines to guide feature inclusion at compile time.
//
Expand All @@ -26,11 +26,10 @@
#define MICONFIG_COMPILE_MIDRIVER_VERSION 1

// 1 = Show debug process attach modal dialog, 0 = do not show
// For windows only ATM, other OS use an infinite loop which a debug has to change a value to continue
// For windows only ATM, other OS's code is an infinite loop which a debugger must change a value to continue
#define MICONFIG_DEBUG_SHOW_ATTACH_DBG_DLG 0

// 1 = Compile in and init LLDB driver code alongside MI version, 0 = do not compile in
// ToDo: This has not been fully implemented as may not be required in the future
#define MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER 1

// 1 = Give runtime our own custom buffer, 0 = Use runtime managed buffer
Expand All @@ -46,3 +45,6 @@
// 1 = Write to MI's Log file warnings about commands that did not handle arguments or
// options present to them by the driver's client, 0 = no warnings given
#define MICONFIG_GIVE_WARNING_CMD_ARGS_NOT_HANDLED 1

// 1 = Enable MI Driver in MI mode to create a local debug session, 0 = Report "Not implemented"
#define MICONFIG_ENABLE_MI_DRIVER_MI_MODE_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION 0
Loading