r342353 - [NFC] Minor refactoring to setup the stage for supporting pointers in ExprMutationAnalyzer
Shuai Wang via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 16 14:09:50 PDT 2018
Author: shuaiwang
Date: Sun Sep 16 14:09:50 2018
New Revision: 342353
URL: http://llvm.org/viewvc/llvm-project?rev=342353&view=rev
Log:
[NFC] Minor refactoring to setup the stage for supporting pointers in ExprMutationAnalyzer
Modified:
cfe/trunk/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h
cfe/trunk/lib/Analysis/ExprMutationAnalyzer.cpp
Modified: cfe/trunk/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h?rev=342353&r1=342352&r2=342353&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h (original)
+++ cfe/trunk/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h Sun Sep 16 14:09:50 2018
@@ -31,13 +31,32 @@ public:
const Stmt *findMutation(const Expr *Exp);
const Stmt *findMutation(const Decl *Dec);
+ bool isPointeeMutated(const Expr *Exp) {
+ return findPointeeMutation(Exp) != nullptr;
+ }
+ bool isPointeeMutated(const Decl *Dec) {
+ return findPointeeMutation(Dec) != nullptr;
+ }
+ const Stmt *findPointeeMutation(const Expr *Exp);
+ const Stmt *findPointeeMutation(const Decl *Dec);
+
private:
+ using MutationFinder = const Stmt *(ExprMutationAnalyzer::*)(const Expr *);
using ResultMap = llvm::DenseMap<const Expr *, const Stmt *>;
+ const Stmt *findMutationMemoized(const Expr *Exp,
+ llvm::ArrayRef<MutationFinder> Finders,
+ ResultMap &MemoizedResults);
+ const Stmt *tryEachDeclRef(const Decl *Dec, MutationFinder Finder);
+
bool isUnevaluated(const Expr *Exp);
const Stmt *findExprMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
const Stmt *findDeclMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
+ const Stmt *
+ findExprPointeeMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
+ const Stmt *
+ findDeclPointeeMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
const Stmt *findDirectMutation(const Expr *Exp);
const Stmt *findMemberMutation(const Expr *Exp);
@@ -53,6 +72,7 @@ private:
std::unique_ptr<FunctionParmMutationAnalyzer>>
FuncParmAnalyzer;
ResultMap Results;
+ ResultMap PointeeResults;
};
// A convenient wrapper around ExprMutationAnalyzer for analyzing function
Modified: cfe/trunk/lib/Analysis/ExprMutationAnalyzer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ExprMutationAnalyzer.cpp?rev=342353&r1=342352&r2=342353&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ExprMutationAnalyzer.cpp (original)
+++ cfe/trunk/lib/Analysis/ExprMutationAnalyzer.cpp Sun Sep 16 14:09:50 2018
@@ -64,33 +64,83 @@ const auto isMoveOnly = [] {
unless(isDeleted()))))));
};
+template <class T> struct NodeID;
+template <> struct NodeID<Expr> { static const std::string value; };
+template <> struct NodeID<Decl> { static const std::string value; };
+const std::string NodeID<Expr>::value = "expr";
+const std::string NodeID<Decl>::value = "decl";
+
+template <class T, class F = const Stmt *(ExprMutationAnalyzer::*)(const T *)>
+const Stmt *tryEachMatch(ArrayRef<ast_matchers::BoundNodes> Matches,
+ ExprMutationAnalyzer *Analyzer, F Finder) {
+ const StringRef ID = NodeID<T>::value;
+ for (const auto &Nodes : Matches) {
+ if (const Stmt *S = (Analyzer->*Finder)(Nodes.getNodeAs<T>(ID)))
+ return S;
+ }
+ return nullptr;
+}
+
} // namespace
const Stmt *ExprMutationAnalyzer::findMutation(const Expr *Exp) {
- const auto Memoized = Results.find(Exp);
- if (Memoized != Results.end())
+ return findMutationMemoized(Exp,
+ {&ExprMutationAnalyzer::findDirectMutation,
+ &ExprMutationAnalyzer::findMemberMutation,
+ &ExprMutationAnalyzer::findArrayElementMutation,
+ &ExprMutationAnalyzer::findCastMutation,
+ &ExprMutationAnalyzer::findRangeLoopMutation,
+ &ExprMutationAnalyzer::findReferenceMutation,
+ &ExprMutationAnalyzer::findFunctionArgMutation},
+ Results);
+}
+
+const Stmt *ExprMutationAnalyzer::findMutation(const Decl *Dec) {
+ return tryEachDeclRef(Dec, &ExprMutationAnalyzer::findMutation);
+}
+
+const Stmt *ExprMutationAnalyzer::findPointeeMutation(const Expr *Exp) {
+ return findMutationMemoized(Exp, {/*TODO*/}, PointeeResults);
+}
+
+const Stmt *ExprMutationAnalyzer::findPointeeMutation(const Decl *Dec) {
+ return tryEachDeclRef(Dec, &ExprMutationAnalyzer::findPointeeMutation);
+}
+
+const Stmt *ExprMutationAnalyzer::findMutationMemoized(
+ const Expr *Exp, llvm::ArrayRef<MutationFinder> Finders,
+ ResultMap &MemoizedResults) {
+ const auto Memoized = MemoizedResults.find(Exp);
+ if (Memoized != MemoizedResults.end())
return Memoized->second;
if (isUnevaluated(Exp))
- return Results[Exp] = nullptr;
+ return MemoizedResults[Exp] = nullptr;
- for (const auto &Finder : {&ExprMutationAnalyzer::findDirectMutation,
- &ExprMutationAnalyzer::findMemberMutation,
- &ExprMutationAnalyzer::findArrayElementMutation,
- &ExprMutationAnalyzer::findCastMutation,
- &ExprMutationAnalyzer::findRangeLoopMutation,
- &ExprMutationAnalyzer::findReferenceMutation,
- &ExprMutationAnalyzer::findFunctionArgMutation}) {
+ for (const auto &Finder : Finders) {
if (const Stmt *S = (this->*Finder)(Exp))
- return Results[Exp] = S;
+ return MemoizedResults[Exp] = S;
}
- return Results[Exp] = nullptr;
+ return MemoizedResults[Exp] = nullptr;
+}
+
+const Stmt *ExprMutationAnalyzer::tryEachDeclRef(const Decl *Dec,
+ MutationFinder Finder) {
+ const auto Refs =
+ match(findAll(declRefExpr(to(equalsNode(Dec))).bind(NodeID<Expr>::value)),
+ Stm, Context);
+ for (const auto &RefNodes : Refs) {
+ const auto *E = RefNodes.getNodeAs<Expr>(NodeID<Expr>::value);
+ if ((this->*Finder)(E))
+ return E;
+ }
+ return nullptr;
}
bool ExprMutationAnalyzer::isUnevaluated(const Expr *Exp) {
return selectFirst<Expr>(
- "expr",
+ NodeID<Expr>::value,
match(
findAll(
expr(equalsNode(Exp),
@@ -115,37 +165,30 @@ bool ExprMutationAnalyzer::isUnevaluated
genericSelectionExpr(hasControllingExpr(
hasDescendant(equalsNode(Exp)))),
cxxNoexceptExpr())))))
- .bind("expr")),
+ .bind(NodeID<Expr>::value)),
Stm, Context)) != nullptr;
}
const Stmt *
ExprMutationAnalyzer::findExprMutation(ArrayRef<BoundNodes> Matches) {
- for (const auto &Nodes : Matches) {
- if (const Stmt *S = findMutation(Nodes.getNodeAs<Expr>("expr")))
- return S;
- }
- return nullptr;
+ return tryEachMatch<Expr>(Matches, this, &ExprMutationAnalyzer::findMutation);
}
const Stmt *
ExprMutationAnalyzer::findDeclMutation(ArrayRef<BoundNodes> Matches) {
- for (const auto &DeclNodes : Matches) {
- if (const Stmt *S = findMutation(DeclNodes.getNodeAs<Decl>("decl")))
- return S;
- }
- return nullptr;
+ return tryEachMatch<Decl>(Matches, this, &ExprMutationAnalyzer::findMutation);
}
-const Stmt *ExprMutationAnalyzer::findMutation(const Decl *Dec) {
- const auto Refs = match(
- findAll(declRefExpr(to(equalsNode(Dec))).bind("expr")), Stm, Context);
- for (const auto &RefNodes : Refs) {
- const auto *E = RefNodes.getNodeAs<Expr>("expr");
- if (findMutation(E))
- return E;
- }
- return nullptr;
+const Stmt *ExprMutationAnalyzer::findExprPointeeMutation(
+ ArrayRef<ast_matchers::BoundNodes> Matches) {
+ return tryEachMatch<Expr>(Matches, this,
+ &ExprMutationAnalyzer::findPointeeMutation);
+}
+
+const Stmt *ExprMutationAnalyzer::findDeclPointeeMutation(
+ ArrayRef<ast_matchers::BoundNodes> Matches) {
+ return tryEachMatch<Decl>(Matches, this,
+ &ExprMutationAnalyzer::findPointeeMutation);
}
const Stmt *ExprMutationAnalyzer::findDirectMutation(const Expr *Exp) {
@@ -237,7 +280,7 @@ const Stmt *ExprMutationAnalyzer::findMe
match(findAll(expr(anyOf(memberExpr(hasObjectExpression(equalsNode(Exp))),
cxxDependentScopeMemberExpr(
hasObjectExpression(equalsNode(Exp)))))
- .bind("expr")),
+ .bind(NodeID<Expr>::value)),
Stm, Context);
return findExprMutation(MemberExprs);
}
@@ -246,7 +289,7 @@ const Stmt *ExprMutationAnalyzer::findAr
// Check whether any element of an array is mutated.
const auto SubscriptExprs = match(
findAll(arraySubscriptExpr(hasBase(ignoringImpCasts(equalsNode(Exp))))
- .bind("expr")),
+ .bind(NodeID<Expr>::value)),
Stm, Context);
return findExprMutation(SubscriptExprs);
}
@@ -259,7 +302,7 @@ const Stmt *ExprMutationAnalyzer::findCa
nonConstReferenceType())),
implicitCastExpr(hasImplicitDestinationType(
nonConstReferenceType()))))
- .bind("expr")),
+ .bind(NodeID<Expr>::value)),
Stm, Context);
return findExprMutation(Casts);
}
@@ -269,8 +312,8 @@ const Stmt *ExprMutationAnalyzer::findRa
// check all declRefExpr of the loop variable.
const auto LoopVars =
match(findAll(cxxForRangeStmt(
- hasLoopVariable(
- varDecl(hasType(nonConstReferenceType())).bind("decl")),
+ hasLoopVariable(varDecl(hasType(nonConstReferenceType()))
+ .bind(NodeID<Decl>::value)),
hasRangeInit(equalsNode(Exp)))),
Stm, Context);
return findDeclMutation(LoopVars);
@@ -286,7 +329,7 @@ const Stmt *ExprMutationAnalyzer::findRe
callee(cxxMethodDecl(ofClass(isMoveOnly()),
returns(nonConstReferenceType()))),
argumentCountIs(1), hasArgument(0, equalsNode(Exp)))
- .bind("expr")),
+ .bind(NodeID<Expr>::value)),
Stm, Context);
if (const Stmt *S = findExprMutation(Ref))
return S;
@@ -305,7 +348,7 @@ const Stmt *ExprMutationAnalyzer::findRe
// that separately.
unless(hasParent(declStmt(hasParent(
cxxForRangeStmt(hasRangeStmt(equalsBoundNode("stmt"))))))))
- .bind("decl"))),
+ .bind(NodeID<Decl>::value))),
Stm, Context);
return findDeclMutation(Refs);
}
@@ -320,10 +363,10 @@ const Stmt *ExprMutationAnalyzer::findFu
findAll(expr(anyOf(callExpr(NonConstRefParam, IsInstantiated, FuncDecl),
cxxConstructExpr(NonConstRefParam, IsInstantiated,
FuncDecl)))
- .bind("expr")),
+ .bind(NodeID<Expr>::value)),
Stm, Context);
for (const auto &Nodes : Matches) {
- const auto *Exp = Nodes.getNodeAs<Expr>("expr");
+ const auto *Exp = Nodes.getNodeAs<Expr>(NodeID<Expr>::value);
const auto *Func = Nodes.getNodeAs<FunctionDecl>("func");
if (!Func->getBody())
return Exp;
More information about the cfe-commits
mailing list