llvm-project/lldb/tools/lldb-mi/MICmdBase.cpp

264 lines
8.7 KiB
C++
Raw Normal View History

//===-- MICmdBase.cpp -------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//++
// File: MICmdBase.cpp
//
// Overview: CMICmdBase implementation.
//
// Environment: Compilers: Visual C++ 12.
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
// Libraries: See MIReadmetxt.
//
// Copyright: None.
//--
// In-house headers:
#include "MICmdBase.h"
#include "MICmnMIValueConst.h"
#include "MICmnLLDBDebugSessionInfo.h"
//++ ------------------------------------------------------------------------------------
// Details: CMICmdBase constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdBase::CMICmdBase( void )
: m_pSelfCreatorFn( nullptr )
, m_rLLDBDebugSessionInfo( CMICmnLLDBDebugSessionInfo::Instance() )
, m_bHasResultRecordExtra( false )
{
}
//++ ------------------------------------------------------------------------------------
// Details: CMICmdBase destructor.
// Type: Overrideable.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdBase::~CMICmdBase( void )
{
}
//++ ------------------------------------------------------------------------------------
// Details: The invoker requires this function.
// Type: Overridden.
// Args: None.
// Return: SMICmdData & - *this command's present status/data/information.
// Throws: None.
//--
const SMICmdData & CMICmdBase::GetCmdData( void ) const
{
return m_cmdData;
}
//++ ------------------------------------------------------------------------------------
// Details: The invoker requires this function.
// Type: Overridden.
// Args: None.
// Return: CMIUtilString & - *this command's current error description.
// Empty string indicates command status ok.
// Throws: None.
//--
const CMIUtilString & CMICmdBase::GetErrorDescription( void ) const
{
return m_strCurrentErrDescription;
}
//++ ------------------------------------------------------------------------------------
// Details: The CMICmdFactory requires this function. Retrieve the command and argument
// options description string.
// Type: Overridden.
// Args: None.
// Return: CMIUtilString & - Command decription.
// Throws: None.
//--
const CMIUtilString & CMICmdBase::GetMiCmd( void ) const
{
return m_strMiCmd;
}
//++ ------------------------------------------------------------------------------------
// Details: The invoker requires this function. A command must be given working data and
// provide data about its status or provide information to other objects.
// Type: Overridden.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdBase::SetCmdData( const SMICmdData & vCmdData )
{
m_cmdData = vCmdData;
return MIstatus::success;
}
//++ ------------------------------------------------------------------------------------
// Details: The command factory requires this function. The factory calls this function
// so it can obtain *this command's creation function.
// Type: Overridden.
// Args: None.
// Return: CMICmdFactory::CmdCreatorFnPtr - Function pointer.
// Throws: None.
//--
CMICmdFactory::CmdCreatorFnPtr CMICmdBase::GetCmdCreatorFn( void ) const
{
return m_pSelfCreatorFn;
}
//++ ------------------------------------------------------------------------------------
// Details: If a command is an event type (has callbacks registered with SBListener) it
// needs to inform the Invoker that it has finished its work so that the
// Invoker can tidy up and call the commands Acknowledge function (yes the
// command itself could call the Acknowledge itself but not doing that way).
// Type: Overridden.
// Args: None.
// Return: None.
// Throws: None.
//--
void CMICmdBase::CmdFinishedTellInvoker( void ) const
{
CMICmdInvoker::Instance().CmdExecuteFinished( const_cast< CMICmdBase & >( *this ) );
}
//++ ------------------------------------------------------------------------------------
// Details: Returns the final version of the MI result record built up in the command's
// Acknowledge function. The one line text of MI result.
// Type: Overridden.
// Args: None.
// Return: CMIUtilString & - MI text version of the MI result record.
// Throws: None.
//--
const CMIUtilString & CMICmdBase::GetMIResultRecord( void ) const
{
return m_miResultRecord.GetString();
}
//++ ------------------------------------------------------------------------------------
// Details: Retrieve from the command additional MI result to its 1 line response.
// Because of using LLDB addtional 'fake'/hack output is sometimes required to
// help the driver client operate i.e. Eclipse.
// Type: Overridden.
// Args: None.
// Return: CMIUtilString & - MI text version of the MI result record.
// Throws: None.
//--
const CMIUtilString & CMICmdBase::GetMIResultRecordExtra( void ) const
{
return m_miResultRecordExtra;
}
//++ ------------------------------------------------------------------------------------
// Details: Hss *this command got additional MI result to its 1 line response.
// Because of using LLDB addtional 'fake'/hack output is sometimes required to
// help the driver client operate i.e. Eclipse.
// Type: Overridden.
// Args: None.
// Return: bool - True = Yes have additional MI output, false = no nothing extra.
// Throws: None.
//--
bool CMICmdBase::HasMIResultRecordExtra( void ) const
{
return m_bHasResultRecordExtra;
}
//++ ------------------------------------------------------------------------------------
// Details: Short cut function to enter error information into the command's metadata
// object and set the command's error status.
// Type: Method.
// Args: rErrMsg - (R) Error description.
// Return: None.
// Throws: None.
//--
void CMICmdBase::SetError( const CMIUtilString & rErrMsg )
{
m_cmdData.bCmdValid = false;
m_cmdData.strErrorDescription = rErrMsg;
m_cmdData.bCmdExecutedSuccessfully = false;
const CMICmnMIValueResult valueResult( "msg", CMICmnMIValueConst( rErrMsg ) );
const CMICmnMIResultRecord miResultRecord( m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, valueResult );
m_miResultRecord = miResultRecord;
m_cmdData.strMiCmdResultRecord = miResultRecord.GetString();
}
//++ ------------------------------------------------------------------------------------
// Details: Ask a command to provide its unique identifier.
// Type: Method.
// Args: A unique identifier for this command class.
// Return: None.
// Throws: None.
//--
MIuint CMICmdBase::GetGUID( void )
{
MIuint64 vptr = reinterpret_cast< MIuint64 >( this );
MIuint id = (vptr ) & 0xFFFFFFFF;
id ^= (vptr >> 32) & 0xFFFFFFFF;
return id;
}
//++ ------------------------------------------------------------------------------------
// Details: The invoker requires this function. The parses the command line options
// arguments to extract values for each of those arguments.
// Type: Overridden.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdBase::ParseArgs( void )
{
// Do nothing - override to implement
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;
}