diff options
Diffstat (limited to 'tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp')
-rw-r--r-- | tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp | 570 |
1 files changed, 570 insertions, 0 deletions
diff --git a/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp b/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp new file mode 100644 index 000000000000..d519875993fe --- /dev/null +++ b/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp @@ -0,0 +1,570 @@ +//===-- MICmnLLDBDebugSessionInfoVarObj.cpp ---------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +//++ +// File: MICmnLLDBDebugSessionInfoVarObj.cpp +// +// Overview: CMICmnLLDBDebugSessionInfoVarObj 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 "MICmnLLDBDebugSessionInfoVarObj.h" +#include "MICmnLLDBProxySBValue.h" +#include "MICmnLLDBUtilSBValue.h" + +// Instantiations: +const MIchar * CMICmnLLDBDebugSessionInfoVarObj::ms_aVarFormatStrings[] = +{ + // CODETAG_SESSIONINFO_VARFORMAT_ENUM + // *** Order is import here. + "<Invalid var format>", + "binary", + "octal", + "decimal", + "hexadecimal", + "natural" +}; +const MIchar * CMICmnLLDBDebugSessionInfoVarObj::ms_aVarFormatChars[] = +{ + // CODETAG_SESSIONINFO_VARFORMAT_ENUM + // *** Order is import here. + "<Invalid var format>", + "t", + "o", + "d", + "x", + "N" +}; +CMICmnLLDBDebugSessionInfoVarObj::MapKeyToVarObj_t CMICmnLLDBDebugSessionInfoVarObj::ms_mapVarIdToVarObj; +MIuint CMICmnLLDBDebugSessionInfoVarObj::ms_nVarUniqueId = 0; // Index from 0 + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj constructor. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( void ) +: m_eVarFormat( eVarFormat_Natural ) +, m_eVarType( eVarType_Internal ) +{ + // Do not call UpdateValue() in here as not necessary +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj constructor. +// Type: Method. +// Args: vrStrNameReal - (R) The actual name of the variable, the expression. +// vrStrName - (R) The name given for *this var object. +// vrValue - (R) The LLDB SBValue object represented by *this object. +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( const CMIUtilString & vrStrNameReal, const CMIUtilString & vrStrName, const lldb::SBValue & vrValue ) +: m_eVarFormat( eVarFormat_Natural ) +, m_eVarType( eVarType_Internal ) +, m_strName( vrStrName ) +, m_SBValue( vrValue ) +, m_strNameReal( vrStrNameReal ) +{ + UpdateValue(); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj constructor. +// Type: Method. +// Args: vrStrNameReal - (R) The actual name of the variable, the expression. +// vrStrName - (R) The name given for *this var object. +// vrValue - (R) The LLDB SBValue object represented by *this object. +// vrStrVarObjParentName - (R) The var object parent to *this var object (LLDB SBValue equivalent). +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( const CMIUtilString & vrStrNameReal, const CMIUtilString & vrStrName, const lldb::SBValue & vrValue, const CMIUtilString & vrStrVarObjParentName ) +: m_eVarFormat( eVarFormat_Natural ) +, m_eVarType( eVarType_Internal ) +, m_strName( vrStrName ) +, m_SBValue( vrValue ) +, m_strNameReal( vrStrNameReal ) +, m_strVarObjParentName( vrStrVarObjParentName ) +{ + UpdateValue(); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj copy constructor. +// Type: Method. +// Args: vrOther - (R) The object to copy from. +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( const CMICmnLLDBDebugSessionInfoVarObj & vrOther ) +{ + CopyOther( vrOther ); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj copy constructor. +// Type: Method. +// Args: vrOther - (R) The object to copy from. +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( CMICmnLLDBDebugSessionInfoVarObj & vrOther ) +{ + CopyOther( vrOther ); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj move constructor. +// Type: Method. +// Args: vrwOther - (R) The object to copy from. +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( CMICmnLLDBDebugSessionInfoVarObj && vrwOther ) +{ + MoveOther( vrwOther ); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj assignment operator. +// Type: Method. +// Args: vrOther - (R) The object to copy from. +// Return: CMICmnLLDBDebugSessionInfoVarObj & - Updated *this object. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj & CMICmnLLDBDebugSessionInfoVarObj::operator= ( const CMICmnLLDBDebugSessionInfoVarObj & vrOther ) +{ + CopyOther( vrOther ); + + return *this; +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj assignment operator. +// Type: Method. +// Args: vrwOther - (R) The object to copy from. +// Return: CMICmnLLDBDebugSessionInfoVarObj & - Updated *this object. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj & CMICmnLLDBDebugSessionInfoVarObj::operator= ( CMICmnLLDBDebugSessionInfoVarObj && vrwOther ) +{ + MoveOther( vrwOther ); + + return *this; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Copy the other instance of that object to *this object. +// Type: Method. +// Args: vrOther - (R) The object to copy from. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. +//-- +bool CMICmnLLDBDebugSessionInfoVarObj::CopyOther( const CMICmnLLDBDebugSessionInfoVarObj & vrOther ) +{ + // Check for self-assignment + if( this == &vrOther ) + return MIstatus::success; + + m_eVarFormat = vrOther.m_eVarFormat; + m_eVarType = vrOther.m_eVarType; + m_strName = vrOther.m_strName; + m_SBValue = vrOther.m_SBValue; + m_strNameReal = vrOther.m_strNameReal; + m_strFormattedValue = vrOther.m_strFormattedValue; + m_strVarObjParentName = vrOther.m_strVarObjParentName; + + return MIstatus::success; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Move that object to *this object. +// Type: Method. +// Args: vrwOther - (RW) The object to copy from. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. +//-- +bool CMICmnLLDBDebugSessionInfoVarObj::MoveOther( CMICmnLLDBDebugSessionInfoVarObj & vrwOther ) +{ + // Check for self-assignment + if( this == &vrwOther ) + return MIstatus::success; + + CopyOther( vrwOther ); + vrwOther.m_eVarFormat = eVarFormat_Natural; + vrwOther.m_eVarType = eVarType_Internal; + vrwOther.m_strName.clear(); + vrwOther.m_SBValue.Clear(); + vrwOther.m_strNameReal.clear(); + vrwOther.m_strFormattedValue.clear(); + vrwOther.m_strVarObjParentName.clear(); + + return MIstatus::success; +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmnLLDBDebugSessionInfoVarObj destructor. +// Type: Overridden. +// Args: None. +// Return: None. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::~CMICmnLLDBDebugSessionInfoVarObj( void ) +{ +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the var format enumeration for the specified string. +// Type: Static method. +// Args: vrStrFormat - (R) Text description of the var format. +// Return: varFormat_e - Var format enumeration. +// - No match found return eVarFormat_Invalid. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::varFormat_e CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForString( const CMIUtilString & vrStrFormat ) +{ + // CODETAG_SESSIONINFO_VARFORMAT_ENUM + for( MIuint i = 0; i < eVarFormat_count; i++ ) + { + const MIchar * pVarFormatString = ms_aVarFormatStrings[ i ]; + if( vrStrFormat == pVarFormatString ) + return static_cast< varFormat_e >( i ); + } + + return eVarFormat_Invalid; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the var format enumeration for the specified character. +// Type: Static method. +// Args: vrcFormat - (R) Character representing the var format. +// Return: varFormat_e - Var format enumeration. +// - No match found return eVarFormat_Invalid. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::varFormat_e CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForChar( const MIchar & vrcFormat ) +{ + if( 'r' == vrcFormat ) + return eVarFormat_Hex; + + // CODETAG_SESSIONINFO_VARFORMAT_ENUM + for( MIuint i = 0; i < eVarFormat_count; i++ ) + { + const MIchar * pVarFormatChar = ms_aVarFormatChars[ i ]; + if( *pVarFormatChar == vrcFormat ) + return static_cast< varFormat_e >( i ); + } + + return eVarFormat_Invalid; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Return the equivalent var value formatted string for the given value type. +// The SBValue vrValue parameter is checked by LLDB private code for valid +// scalar type via MI Driver proxy function as the valued returned can also be +// an error condition. The proxy function determines if the check was valid +// otherwise return an error condition state by other means saying so. +// Type: Static method. +// Args: vrValue - (R) The var value object. +// veVarFormat - (R) Var format enumeration. +// Returns: CMIUtilString - Value formatted string. +// Throws: None. +//-- +CMIUtilString CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted( const lldb::SBValue & vrValue, const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat ) +{ + CMIUtilString strFormattedValue; + + MIuint64 nValue = 0; + if( CMICmnLLDBProxySBValue::GetValueAsUnsigned( vrValue, nValue ) == MIstatus::success ) + { + lldb::SBValue & rValue = const_cast< lldb::SBValue & >( vrValue ); + strFormattedValue = GetStringFormatted( nValue, rValue.GetValue(), veVarFormat ); + } + else + { + // Composite variable type i.e. struct + strFormattedValue = "{...}"; + } + + return strFormattedValue; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Return nuber formatted string according to the given value type. +// Type: Static method. +// Args: vnValue - (R) The number value to get formatted. +// vpStrValueNatural - (R) The natural representation of the number value. +// veVarFormat - (R) Var format enumeration. +// Returns: CMIUtilString - Numerical formatted string. +// Throws: None. +//-- +CMIUtilString CMICmnLLDBDebugSessionInfoVarObj::GetStringFormatted( const MIuint64 vnValue, const MIchar * vpStrValueNatural, const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat ) +{ + CMIUtilString strFormattedValue; + + switch( veVarFormat ) + { + case eVarFormat_Binary: + strFormattedValue = CMIUtilString::FormatBinary( vnValue ); + break; + case eVarFormat_Octal: + strFormattedValue = CMIUtilString::Format( "0%llo", vnValue ); + break; + case eVarFormat_Decimal: + strFormattedValue = CMIUtilString::Format( "%lld", vnValue ); + break; + case eVarFormat_Hex: + strFormattedValue = CMIUtilString::Format( "0x%llx", vnValue ); + break; + case eVarFormat_Natural: + default: + { + strFormattedValue = (vpStrValueNatural != nullptr) ? vpStrValueNatural : ""; + } + } + + return strFormattedValue; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Delete internal container contents. +// Type: Static method. +// Args: None. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::VarObjClear( void ) +{ + ms_mapVarIdToVarObj.clear(); +} + +//++ ------------------------------------------------------------------------------------ +// Details: Add a var object to the internal container. +// Type: Static method. +// Args: vrVarObj - (R) The var value object. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::VarObjAdd( const CMICmnLLDBDebugSessionInfoVarObj & vrVarObj ) +{ + VarObjDelete( vrVarObj.GetName() ); + MapPairKeyToVarObj_t pr( vrVarObj.GetName(), vrVarObj ); + ms_mapVarIdToVarObj.insert( pr ); +} + +//++ ------------------------------------------------------------------------------------ +// Details: Delete the var object from the internal container matching the specified name. +// Type: Static method. +// Args: vrVarName - (R) The var value name. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::VarObjDelete( const CMIUtilString & vrVarName ) +{ + const MapKeyToVarObj_t::const_iterator it = ms_mapVarIdToVarObj.find( vrVarName ); + if( it != ms_mapVarIdToVarObj.end() ) + { + ms_mapVarIdToVarObj.erase( it ); + } +} + +//++ ------------------------------------------------------------------------------------ +// Details: Update an existing var object in the internal container. +// Type: Static method. +// Args: vrVarObj - (R) The var value object. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::VarObjUpdate( const CMICmnLLDBDebugSessionInfoVarObj & vrVarObj ) +{ + VarObjAdd( vrVarObj ); +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the var object matching the specified name. +// Type: Static method. +// Args: vrVarName - (R) The var value name. +// vrwVarObj - (W) A var object. +// Returns: bool - True = object found, false = object not found. +// Throws: None. +//-- +bool CMICmnLLDBDebugSessionInfoVarObj::VarObjGet( const CMIUtilString & vrVarName, CMICmnLLDBDebugSessionInfoVarObj & vrwVarObj ) +{ + const MapKeyToVarObj_t::const_iterator it = ms_mapVarIdToVarObj.find( vrVarName ); + if( it != ms_mapVarIdToVarObj.end() ) + { + const CMICmnLLDBDebugSessionInfoVarObj & rVarObj = (*it).second; + vrwVarObj = rVarObj; + return true; + } + + return false; +} + +//++ ------------------------------------------------------------------------------------ +// Details: A count is kept of the number of var value objects created. This is count is +// used to ID the var value object. Reset the count to 0. +// Type: Static method. +// Args: None. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::VarObjIdResetToZero( void ) +{ + ms_nVarUniqueId = 0; +} + +//++ ------------------------------------------------------------------------------------ +// Details: A count is kept of the number of var value objects created. This is count is +// used to ID the var value object. Increment the count by 1. +// Type: Static method. +// Args: None. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::VarObjIdInc( void ) +{ + ms_nVarUniqueId++; +} + +//++ ------------------------------------------------------------------------------------ +// Details: A count is kept of the number of var value objects created. This is count is +// used to ID the var value object. Retrieve ID. +// Type: Static method. +// Args: None. +// Returns: None. +// Throws: None. +//-- +MIuint CMICmnLLDBDebugSessionInfoVarObj::VarObjIdGet( void ) +{ + return ms_nVarUniqueId; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the value formatted object's name. +// Type: Method. +// Args: None. +// Returns: CMIUtilString & - Value's var%u name text. +// Throws: None. +//-- +const CMIUtilString & CMICmnLLDBDebugSessionInfoVarObj::GetName( void ) const +{ + return m_strName; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the value formatted object's variable name as given in the MI command +// to create the var object. +// Type: Method. +// Args: None. +// Returns: CMIUtilString & - Value's real name text. +// Throws: None. +//-- +const CMIUtilString & CMICmnLLDBDebugSessionInfoVarObj::GetNameReal( void ) const +{ + return m_strNameReal; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the value formatted string. +// Type: Method. +// Args: None. +// Returns: CMIUtilString & - Value formatted string. +// Throws: None. +//-- +const CMIUtilString & CMICmnLLDBDebugSessionInfoVarObj::GetValueFormatted( void ) const +{ + return m_strFormattedValue; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the LLDB Value object. +// Type: Method. +// Args: None. +// Returns: lldb::SBValue & - LLDB Value object. +// Throws: None. +//-- +const lldb::SBValue & CMICmnLLDBDebugSessionInfoVarObj::GetValue( void ) const +{ + return m_SBValue; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Set the var format type for *this object and upate the formatting. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. +//-- +bool CMICmnLLDBDebugSessionInfoVarObj::SetVarFormat( const varFormat_e veVarFormat ) +{ + if( veVarFormat >= eVarFormat_count ) + return MIstatus::failure; + + m_eVarFormat = veVarFormat; + UpdateValue(); + return MIstatus::success; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Update *this var obj. Update it's value and type. +// Type: Method. +// Args: None. +// Returns: None. +// Throws: None. +//-- +void CMICmnLLDBDebugSessionInfoVarObj::UpdateValue( void ) +{ + m_strFormattedValue = CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted( m_SBValue, m_eVarFormat ); + + MIuint64 nValue = 0; + if( CMICmnLLDBProxySBValue::GetValueAsUnsigned( m_SBValue, nValue ) == MIstatus::failure ) + m_eVarType = eVarType_Composite; + + CMICmnLLDBDebugSessionInfoVarObj::VarObjUpdate( *this ); +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the enumeration type of the var object. +// Type: Method. +// Args: None. +// Returns: varType_e - Enumeration value. +// Throws: None. +//-- +CMICmnLLDBDebugSessionInfoVarObj::varType_e CMICmnLLDBDebugSessionInfoVarObj::GetType( void ) const +{ + return m_eVarType; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the parent var object's name, the parent var object to *this var +// object (if assigned). The parent is equivalent to LLDB SBValue variable's +// parent. +// Type: Method. +// Args: None. +// Returns: CMIUtilString & - Pointer to var object, NULL = no parent. +// Throws: None. +//-- +const CMIUtilString & CMICmnLLDBDebugSessionInfoVarObj::GetVarParentName( void ) const +{ + return m_strVarObjParentName; +} +
\ No newline at end of file |