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); } }