void FakeDirectiveHandler::HandleUnaryOperator(DeclRefExpr * Original, Expr * Var, Expr * Next, vector<LocalStmtPair> WritePairs, bool ActualVar, string Struct) { UnaryOperator * UO = dyn_cast<UnaryOperator>(Next); // Var++ etc. if (UO->isIncrementDecrementOp()) { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); InsertAccess(Var, Original, true, WritePairs, ActualVar, Struct); // *Var } else if (UO->getOpcode() == clang::UO_Deref) { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); ActualVar = true; } else { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); ActualVar = false; } if (IsPointerType(Var)) { WalkUpExpr(Original, UO, WritePairs, ActualVar, Struct); } }
void FakeDirectiveHandler::HandleBinaryOperator(DeclRefExpr * Original, Expr * Var, Expr * Next, vector<LocalStmtPair> WritePairs, bool ActualVar, string Struct) { BinaryOperator * BO = cast<BinaryOperator>(Next); CompilerInstance &CI = FullDirectives->GetCI(Original->getLocStart()); // a = b; if (BO->isAssignmentOp()) { // Var = b; if (IsWrite(BO, Var, CI)) { InsertAccess(Var, Original, true, WritePairs, ActualVar, Struct); // Var += b; if (BO->isCompoundAssignmentOp()) { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); } // a = Var; } else { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); } ActualVar = false; // a + b; } else { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); ActualVar = false; } if (IsPointerType(Var) && IsPointerType(BO)) { WalkUpExpr(Original, BO, WritePairs, ActualVar, Struct); } }
//++ ------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object the value of the variable described in // text if it has a simple format (not composite). // Type: Method. // Args: vwrValue - (W) The SBValue in a string format. // Return: MIstatus::success - Function succeeded. // MIstatus::failure - Function failed. // Throws: None. //-- bool CMICmnLLDBUtilSBValue::GetSimpleValue(const bool vbHandleArrayType, CMIUtilString &vwrValue) const { const MIuint nChildren = m_rValue.GetNumChildren(); if (nChildren == 0) { if (m_bHandleCharType && IsCharType()) { vwrValue = GetSimpleValueChar(); return MIstatus::success; } else { const char *pValue = m_rValue.GetValue(); vwrValue = pValue != nullptr ? pValue : m_pUnkwn; return MIstatus::success; } } else if (IsPointerType()) { if (m_bHandleCharType && IsFirstChildCharType()) { vwrValue = GetSimpleValueCStringPointer(); return MIstatus::success; } else { const char *pValue = m_rValue.GetValue(); vwrValue = pValue != nullptr ? pValue : m_pUnkwn; return MIstatus::success; } } else if (IsArrayType()) { CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); bool bPrintCharArrayAsString = false; bPrintCharArrayAsString = rSessionInfo.SharedDataRetrieve<bool>(rSessionInfo.m_constStrPrintCharArrayAsString, bPrintCharArrayAsString) && bPrintCharArrayAsString; if (bPrintCharArrayAsString && m_bHandleCharType && IsFirstChildCharType()) { vwrValue = GetSimpleValueCStringArray(); return MIstatus::success; } else if (vbHandleArrayType) { vwrValue = CMIUtilString::Format("[%u]", nChildren); return MIstatus::success; } } // Composite variable type i.e. struct return MIstatus::failure; }
void FakeDirectiveHandler::HandleArraySubscriptExpr(DeclRefExpr * Original, Expr * Var, Expr * Next, vector<LocalStmtPair> WritePairs, bool ActualVar, string Struct) { CompilerInstance &CI = FullDirectives->GetCI(Original->getLocStart()); ArraySubscriptExpr * Array = dyn_cast<ArraySubscriptExpr>(Next); if (IsArrayIndex(Array, Var, CI)) { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); } if (IsPointerType(Var)) { InsertAccess(Var, Original, false, WritePairs, ActualVar, Struct); ActualVar = true; WalkUpExpr(Original, Array, WritePairs, ActualVar, Struct); } }
//++ //------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object the value of the variable // described in // text if it has a simple format (not composite). // Type: Method. // Args: vwrValue - (W) The SBValue in a string format. // Return: MIstatus::success - Function succeeded. // MIstatus::failure - Function failed. // Throws: None. //-- bool CMICmnLLDBUtilSBValue::GetSimpleValue(const bool vbHandleArrayType, CMIUtilString &vwrValue) const { const MIuint nChildren = m_rValue.GetNumChildren(); if (nChildren == 0) { vwrValue = GetValueSummary(!m_bHandleCharType && IsCharType(), m_pUnkwn); return MIstatus::success; } else if (IsPointerType()) { vwrValue = GetValueSummary(!m_bHandleCharType && IsPointeeCharType(), m_pUnkwn); return MIstatus::success; } else if (IsArrayType()) { CMICmnLLDBDebugSessionInfo &rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance()); bool bPrintCharArrayAsString = false; bPrintCharArrayAsString = rSessionInfo.SharedDataRetrieve<bool>( rSessionInfo.m_constStrPrintCharArrayAsString, bPrintCharArrayAsString) && bPrintCharArrayAsString; if (bPrintCharArrayAsString && m_bHandleCharType && IsFirstChildCharType()) { vwrValue = GetValueSummary(false); return MIstatus::success; } else if (vbHandleArrayType) { vwrValue = CMIUtilString::Format("[%u]", nChildren); return MIstatus::success; } } else { // Treat composite value which has registered summary // (for example with AddCXXSummary) as simple value vwrValue = GetValueSummary(false); if (!vwrValue.empty()) return MIstatus::success; } // Composite variable type i.e. struct return MIstatus::failure; }