aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/AnalysisBasedWarnings.cpp
diff options
context:
space:
mode:
authorMarco Elver <elver@google.com>2025-05-26 17:03:55 +0200
committerGitHub <noreply@github.com>2025-05-26 17:03:55 +0200
commitc7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9 (patch)
tree79aef42f5a494cc7350c07d46c170a92b685668b /clang/lib/Sema/AnalysisBasedWarnings.cpp
parent365dcf48b8aa726fb6a9ace4b37eb1f1cf121941 (diff)
downloadllvm-c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9.zip
llvm-c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9.tar.gz
llvm-c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9.tar.bz2
Thread Safety Analysis: Support reentrant capabilities (#137133)
Introduce the `reentrant_capability` attribute, which may be specified alongside the `capability(..)` attribute to denote that the defined capability type is reentrant. Marking a capability as reentrant means that acquiring the same capability multiple times is safe, and does not produce warnings on attempted re-acquisition. The most significant changes required are plumbing to propagate if the attribute is present to a CapabilityExpr, and introducing ReentrancyDepth to the LockableFactEntry class.
Diffstat (limited to 'clang/lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r--clang/lib/Sema/AnalysisBasedWarnings.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index d95844c..2a107a36 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -1907,7 +1907,8 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler {
void handleMutexHeldEndOfScope(StringRef Kind, Name LockName,
SourceLocation LocLocked,
SourceLocation LocEndOfScope,
- LockErrorKind LEK) override {
+ LockErrorKind LEK,
+ bool ReentrancyMismatch) override {
unsigned DiagID = 0;
switch (LEK) {
case LEK_LockedSomePredecessors:
@@ -1926,8 +1927,9 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler {
if (LocEndOfScope.isInvalid())
LocEndOfScope = FunEndLocation;
- PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) << Kind
- << LockName);
+ PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID)
+ << Kind << LockName
+ << ReentrancyMismatch);
Warnings.emplace_back(std::move(Warning),
makeLockedHereNote(LocLocked, Kind));
}