aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/ThreadSafety.cpp
diff options
context:
space:
mode:
authorDeLesley Hutchins <delesley@google.com>2012-07-03 19:47:18 +0000
committerDeLesley Hutchins <delesley@google.com>2012-07-03 19:47:18 +0000
commit96fac6a7fe89deff7860e536febbd4ae17bb57f3 (patch)
tree79a895bcaf1f936765c600a3b37b9fd8b8b64a49 /lib/Analysis/ThreadSafety.cpp
parentc359f2029d19016560a422551704ccc2419be0b1 (diff)
Thread safety analysis: improve handling of smart pointers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159679 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ThreadSafety.cpp')
-rw-r--r--lib/Analysis/ThreadSafety.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp
index 238a888194..fb53d076a4 100644
--- a/lib/Analysis/ThreadSafety.cpp
+++ b/lib/Analysis/ThreadSafety.cpp
@@ -26,6 +26,7 @@
#include "clang/AST/StmtVisitor.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/OperatorKinds.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/ImmutableMap.h"
@@ -162,6 +163,13 @@ class MutexID {
buildMutexID(At->getArg(), &LRCallCtx);
return;
}
+ // Hack to treat smart pointers and iterators as pointers;
+ // ignore any method named get().
+ if (CMCE->getMethodDecl()->getNameAsString() == "get" &&
+ CMCE->getNumArgs() == 0) {
+ buildMutexID(CMCE->getImplicitObjectArgument(), CallCtx);
+ return;
+ }
DeclSeq.push_back(CMCE->getMethodDecl()->getCanonicalDecl());
buildMutexID(CMCE->getImplicitObjectArgument(), CallCtx);
unsigned NumCallArgs = CMCE->getNumArgs();
@@ -179,6 +187,15 @@ class MutexID {
buildMutexID(At->getArg(), &LRCallCtx);
return;
}
+ // Treat smart pointers and iterators as pointers;
+ // ignore the * and -> operators.
+ if (CXXOperatorCallExpr *OE = dyn_cast<CXXOperatorCallExpr>(CE)) {
+ OverloadedOperatorKind k = OE->getOperator();
+ if (k == OO_Arrow || k == OO_Star) {
+ buildMutexID(OE->getArg(0), CallCtx);
+ return;
+ }
+ }
buildMutexID(CE->getCallee(), CallCtx);
unsigned NumCallArgs = CE->getNumArgs();
Expr** CallArgs = CE->getArgs();
@@ -208,6 +225,8 @@ class MutexID {
buildMutexID(PE->getSubExpr(), CallCtx);
} else if (ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(Exp)) {
buildMutexID(EWC->getSubExpr(), CallCtx);
+ } else if (CXXBindTemporaryExpr *E = dyn_cast<CXXBindTemporaryExpr>(Exp)) {
+ buildMutexID(E->getSubExpr(), CallCtx);
} else if (isa<CharacterLiteral>(Exp) ||
isa<CXXNullPtrLiteralExpr>(Exp) ||
isa<GNUNullExpr>(Exp) ||