aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp')
-rw-r--r--tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp570
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