Exemplo n.º 1
0
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);
  }

}
Exemplo n.º 2
0
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;
}
Exemplo n.º 4
0
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;
}