forked from OSchip/llvm-project
Thread Safety Analysis: fix assert_capability.
Summary: Previously, the assert_capability attribute was completely ignored by thread safety analysis. Reviewers: delesley, rnk Reviewed By: delesley Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D36122 llvm-svn: 309725
This commit is contained in:
parent
836a64b53e
commit
bbd6108369
|
@ -2138,7 +2138,7 @@ def AssertCapability : InheritableAttr {
|
|||
let TemplateDependent = 1;
|
||||
let ParseArgumentsAsUnevaluated = 1;
|
||||
let DuplicatesAllowedWhileMerging = 1;
|
||||
let Args = [ExprArgument<"Expr">];
|
||||
let Args = [VariadicExprArgument<"Args">];
|
||||
let Accessors = [Accessor<"isShared",
|
||||
[GNU<"assert_shared_capability">,
|
||||
CXX11<"clang", "assert_shared_capability">]>];
|
||||
|
|
|
@ -1735,8 +1735,23 @@ void BuildLockset::handleCall(Expr *Exp, const NamedDecl *D, VarDecl *VD) {
|
|||
CapExprSet AssertLocks;
|
||||
Analyzer->getMutexIDs(AssertLocks, A, Exp, D, VD);
|
||||
for (const auto &AssertLock : AssertLocks)
|
||||
Analyzer->addLock(FSet, llvm::make_unique<LockableFactEntry>(
|
||||
AssertLock, LK_Shared, Loc, false, true),
|
||||
Analyzer->addLock(FSet,
|
||||
llvm::make_unique<LockableFactEntry>(
|
||||
AssertLock, LK_Shared, Loc, false, true),
|
||||
ClassifyDiagnostic(A));
|
||||
break;
|
||||
}
|
||||
|
||||
case attr::AssertCapability: {
|
||||
AssertCapabilityAttr *A = cast<AssertCapabilityAttr>(At);
|
||||
CapExprSet AssertLocks;
|
||||
Analyzer->getMutexIDs(AssertLocks, A, Exp, D, VD);
|
||||
for (const auto &AssertLock : AssertLocks)
|
||||
Analyzer->addLock(FSet,
|
||||
llvm::make_unique<LockableFactEntry>(
|
||||
AssertLock,
|
||||
A->isShared() ? LK_Shared : LK_Exclusive, Loc,
|
||||
false, true),
|
||||
ClassifyDiagnostic(A));
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -5686,8 +5686,12 @@ static void handleCapabilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
|
||||
static void handleAssertCapabilityAttr(Sema &S, Decl *D,
|
||||
const AttributeList &Attr) {
|
||||
SmallVector<Expr*, 1> Args;
|
||||
if (!checkLockFunAttrCommon(S, D, Attr, Args))
|
||||
return;
|
||||
|
||||
D->addAttr(::new (S.Context) AssertCapabilityAttr(Attr.getRange(), S.Context,
|
||||
Attr.getArgAsExpr(0),
|
||||
Args.data(), Args.size(),
|
||||
Attr.getAttributeSpellingListIndex()));
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wthread-safety -Wthread-safety-beta -Wno-thread-safety-negative -fcxx-exceptions %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wthread-safety -Wthread-safety-beta -Wno-thread-safety-negative -fcxx-exceptions -DUSE_ASSERT_CAPABILITY=0 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wthread-safety -Wthread-safety-beta -Wno-thread-safety-negative -fcxx-exceptions -DUSE_ASSERT_CAPABILITY=1 %s
|
||||
|
||||
// FIXME: should also run %clang_cc1 -fsyntax-only -verify -Wthread-safety -std=c++11 -Wc++98-compat %s
|
||||
// FIXME: should also run %clang_cc1 -fsyntax-only -verify -Wthread-safety %s
|
||||
|
@ -13,8 +14,15 @@
|
|||
#define ACQUIRED_BEFORE(...) __attribute__((acquired_before(__VA_ARGS__)))
|
||||
#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__((exclusive_lock_function(__VA_ARGS__)))
|
||||
#define SHARED_LOCK_FUNCTION(...) __attribute__((shared_lock_function(__VA_ARGS__)))
|
||||
|
||||
#if USE_ASSERT_CAPABILITY
|
||||
#define ASSERT_EXCLUSIVE_LOCK(...) __attribute__((assert_capability(__VA_ARGS__)))
|
||||
#define ASSERT_SHARED_LOCK(...) __attribute__((assert_shared_capability(__VA_ARGS__)))
|
||||
#else
|
||||
#define ASSERT_EXCLUSIVE_LOCK(...) __attribute__((assert_exclusive_lock(__VA_ARGS__)))
|
||||
#define ASSERT_SHARED_LOCK(...) __attribute__((assert_shared_lock(__VA_ARGS__)))
|
||||
#endif
|
||||
|
||||
#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__((exclusive_trylock_function(__VA_ARGS__)))
|
||||
#define SHARED_TRYLOCK_FUNCTION(...) __attribute__((shared_trylock_function(__VA_ARGS__)))
|
||||
#define UNLOCK_FUNCTION(...) __attribute__((unlock_function(__VA_ARGS__)))
|
||||
|
|
Loading…
Reference in New Issue