diff options
author | DeLesley Hutchins <delesley@google.com> | 2015-02-03 22:11:04 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2015-02-03 22:11:04 +0000 |
commit | ab1dc2d54db5fc2ad4ee748745420eac844a5ea3 (patch) | |
tree | 899c05ac07727ebfe508a90dc6411a261d418633 /clang/lib/Sema/AnalysisBasedWarnings.cpp | |
parent | e4101e2c9e15f3f6e6a5bbb80acc65021b476886 (diff) | |
download | bcm5719-llvm-ab1dc2d54db5fc2ad4ee748745420eac844a5ea3.tar.gz bcm5719-llvm-ab1dc2d54db5fc2ad4ee748745420eac844a5ea3.zip |
Thread Safety Analysis: add support for before/after annotations on mutexes.
These checks detect potential deadlocks caused by inconsistent lock
ordering. The checks are implemented under the -Wthread-safety-beta flag.
This patch also replaces calls to getAttrs() with calls to attrs() throughout
ThreadSafety.cpp, which fixes the earlier issue that cause assert failures.
llvm-svn: 228051
Diffstat (limited to 'clang/lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | clang/lib/Sema/AnalysisBasedWarnings.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index f666a9b4638..da044d0ec24 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -1679,6 +1679,22 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { Warnings.push_back(DelayedDiag(Warning, getNotes())); } + + virtual void handleLockAcquiredBefore(StringRef Kind, Name L1Name, + Name L2Name, SourceLocation Loc) + override { + PartialDiagnosticAt Warning(Loc, + S.PDiag(diag::warn_acquired_before) << Kind << L1Name << L2Name); + Warnings.push_back(DelayedDiag(Warning, getNotes())); + } + + virtual void handleBeforeAfterCycle(Name L1Name, SourceLocation Loc) + override { + PartialDiagnosticAt Warning(Loc, + S.PDiag(diag::warn_acquired_before_after_cycle) << L1Name); + Warnings.push_back(DelayedDiag(Warning, getNotes())); + } + void enterFunction(const FunctionDecl* FD) override { CurrentFunction = FD; } @@ -1704,7 +1720,7 @@ class ConsumedWarningsHandler : public ConsumedWarningsHandlerBase { DiagList Warnings; public: - + ConsumedWarningsHandler(Sema &S) : S(S) {} void emitDiagnostics() override { @@ -1981,7 +1997,8 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P, if (!Diags.isIgnored(diag::warn_thread_safety_verbose, D->getLocStart())) Reporter.setVerbose(true); - threadSafety::runThreadSafetyAnalysis(AC, Reporter); + threadSafety::runThreadSafetyAnalysis(AC, Reporter, + &S.ThreadSafetyDeclCache); Reporter.emitDiagnostics(); } |