diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-07-03 19:47:18 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-07-03 19:47:18 +0000 |
commit | 3a8d6cff143f1f712e5b61b459f79019f6ba4c44 (patch) | |
tree | 6170b3e75307125464e4792d59ecb354c9107b10 /clang/lib/Analysis/ThreadSafety.cpp | |
parent | e1e3ad3d11cb5d650b87c27d7b0af2f18e35d0eb (diff) | |
download | bcm5719-llvm-3a8d6cff143f1f712e5b61b459f79019f6ba4c44.tar.gz bcm5719-llvm-3a8d6cff143f1f712e5b61b459f79019f6ba4c44.zip |
Thread safety analysis: improve handling of smart pointers.
llvm-svn: 159679
Diffstat (limited to 'clang/lib/Analysis/ThreadSafety.cpp')
-rw-r--r-- | clang/lib/Analysis/ThreadSafety.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index 238a888194b..fb53d076a40 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/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) || |