diff options
author | DeLesley Hutchins <delesley@google.com> | 2011-10-21 20:51:27 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2011-10-21 20:51:27 +0000 |
commit | f893e8ab87920c7273bef4440fcf675410bf60c3 (patch) | |
tree | 4445b2290087b2c7323d851d95354588a3d73bcd /clang/lib/Analysis/ThreadSafety.cpp | |
parent | 688db1d6d09ffd5372c1477dfa78d9f28a1a2601 (diff) | |
download | bcm5719-llvm-f893e8ab87920c7273bef4440fcf675410bf60c3.tar.gz bcm5719-llvm-f893e8ab87920c7273bef4440fcf675410bf60c3.zip |
Added support for thread safety attributes on destructors.
llvm-svn: 142685
Diffstat (limited to 'clang/lib/Analysis/ThreadSafety.cpp')
-rw-r--r-- | clang/lib/Analysis/ThreadSafety.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index 5b813ff2eae..7b9a693bb77 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -227,6 +227,9 @@ class MutexID { Parent = 0; // FIXME -- get the parent from DeclStmt NumArgs = CE->getNumArgs(); FunArgs = CE->getArgs(); + } else if (D && isa<CXXDestructorDecl>(D)) { + // There's no such thing as a "destructor call" in the AST. + Parent = DeclExp; } // If the attribute has no arguments, then assume the argument is "this". @@ -879,8 +882,30 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisContext &AC) { BuildLockset LocksetBuilder(Handler, Entryset, LocksetFactory); for (CFGBlock::const_iterator BI = CurrBlock->begin(), BE = CurrBlock->end(); BI != BE; ++BI) { - if (const CFGStmt *CfgStmt = dyn_cast<CFGStmt>(&*BI)) - LocksetBuilder.Visit(const_cast<Stmt*>(CfgStmt->getStmt())); + switch (BI->getKind()) { + case CFGElement::Statement: { + const CFGStmt *CS = cast<CFGStmt>(&*BI); + LocksetBuilder.Visit(const_cast<Stmt*>(CS->getStmt())); + break; + } + // Ignore BaseDtor, MemberDtor, and TemporaryDtor for now. + case CFGElement::AutomaticObjectDtor: { + const CFGAutomaticObjDtor *AD = cast<CFGAutomaticObjDtor>(&*BI); + CXXDestructorDecl *DD = const_cast<CXXDestructorDecl*>( + AD->getDestructorDecl(AC.getASTContext())); + if (!DD->hasAttrs()) + break; + + // Create a dummy expression, + VarDecl *VD = const_cast<VarDecl*>(AD->getVarDecl()); + DeclRefExpr DRE(VD, VD->getType(), VK_LValue, + AD->getTriggerStmt()->getLocEnd()); + LocksetBuilder.handleCall(&DRE, DD); + break; + } + default: + break; + } } Exitset = LocksetBuilder.getLockset(); |