示例#1
0
void AssignExprStatementVisitor::handleSubExpr(Expr *E)
{
  if (!E)
    return;

  BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E->IgnoreParenCasts());
  if (!BinOp) {
    TraverseStmt(E);
    return;
  }

  if (!BinOp->isAssignmentOp() && !BinOp->isCompoundAssignmentOp()) {
    TraverseStmt(E);
    return;
  }

  TransAssert(std::find(ConsumerInstance->ValidAssignExprs.begin(), 
                        ConsumerInstance->ValidAssignExprs.end(), BinOp)
              == ConsumerInstance->ValidAssignExprs.end());

  ConsumerInstance->ValidAssignExprs.push_back(BinOp);
  ConsumerInstance->ValidInstanceNum++;

  if (ConsumerInstance->ValidInstanceNum != 
      ConsumerInstance->TransformationCounter)
    return;

  ConsumerInstance->TheFuncDecl = CurrentFuncDecl;
  ConsumerInstance->TheStmt = CurrentStmt;
  ConsumerInstance->TheAssignExpr = BinOp;
  ConsumerInstance->NeedParen = NeedParen;
}
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);
  }
  
}