Index: clang-tools-extra/trunk/clang-tidy/darwin/AvoidSpinlockCheck.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/darwin/AvoidSpinlockCheck.h +++ clang-tools-extra/trunk/clang-tidy/darwin/AvoidSpinlockCheck.h @@ -0,0 +1,35 @@ +//===--- AvoidSpinlockCheck.h - clang-tidy-----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_DARWIN_AVOIDSPINLOCKCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_DARWIN_AVOIDSPINLOCKCHECK_H + +#include "../ClangTidyCheck.h" + +namespace clang { +namespace tidy { +namespace darwin { + +/// Finds usages of OSSpinlock, which is deprecated due to potential livelock +/// problems. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/darwin-avoid-spinlock.html +class AvoidSpinlockCheck : public ClangTidyCheck { + public: + AvoidSpinlockCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace darwin +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_DARWIN_AVOIDSPINLOCKCHECK_H Index: clang-tools-extra/trunk/clang-tidy/darwin/AvoidSpinlockCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/darwin/AvoidSpinlockCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/darwin/AvoidSpinlockCheck.cpp @@ -0,0 +1,36 @@ +//===--- AvoidSpinlockCheck.cpp - clang-tidy-------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "AvoidSpinlockCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace darwin { + +void AvoidSpinlockCheck::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher( + callExpr(callee((functionDecl(hasAnyName( + "OSSpinlockLock", "OSSpinlockUnlock", "OSSpinlockTry"))))) + .bind("spinlock"), + this); +} + +void AvoidSpinlockCheck::check(const MatchFinder::MatchResult &Result) { + const auto *MatchedExpr = Result.Nodes.getNodeAs("spinlock"); + diag(MatchedExpr->getBeginLoc(), + "use os_unfair_lock_lock() or dispatch queue APIs instead of the " + "deprecated OSSpinLock"); +} + +} // namespace darwin +} // namespace tidy +} // namespace clang Index: clang-tools-extra/trunk/clang-tidy/darwin/CMakeLists.txt =================================================================== --- clang-tools-extra/trunk/clang-tidy/darwin/CMakeLists.txt +++ clang-tools-extra/trunk/clang-tidy/darwin/CMakeLists.txt @@ -1,6 +1,7 @@ set(LLVM_LINK_COMPONENTS support) add_clang_library(clangTidyDarwinModule + AvoidSpinlockCheck.cpp DarwinTidyModule.cpp DispatchOnceNonstaticCheck.cpp Index: clang-tools-extra/trunk/clang-tidy/darwin/DarwinTidyModule.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/darwin/DarwinTidyModule.cpp +++ clang-tools-extra/trunk/clang-tidy/darwin/DarwinTidyModule.cpp @@ -9,6 +9,7 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "AvoidSpinlockCheck.h" #include "DispatchOnceNonstaticCheck.h" namespace clang { @@ -18,6 +19,8 @@ class DarwinModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck( + "darwin-avoid-spinlock"); CheckFactories.registerCheck( "darwin-dispatch-once-nonstatic"); } Index: clang-tools-extra/trunk/clang-tidy/objc/AvoidSpinlockCheck.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/objc/AvoidSpinlockCheck.h +++ clang-tools-extra/trunk/clang-tidy/objc/AvoidSpinlockCheck.h @@ -1,35 +0,0 @@ -//===--- AvoidSpinlockCheck.h - clang-tidy-----------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_OBJC_AVOID_SPINLOCK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_OBJC_AVOID_SPINLOCK_H - -#include "../ClangTidyCheck.h" - -namespace clang { -namespace tidy { -namespace objc { - -/// Finds usages of OSSpinlock, which is deprecated due to potential livelock -/// problems. -/// -/// For the user-facing documentation see: -/// http://clang.llvm.org/extra/clang-tidy/checks/objc-avoid-spinlock.html -class AvoidSpinlockCheck : public ClangTidyCheck { - public: - AvoidSpinlockCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} - void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void check(const ast_matchers::MatchFinder::MatchResult &Result) override; -}; - -} // namespace objc -} // namespace tidy -} // namespace clang - -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_OBJC_AVOID_SPINLOCK_H Index: clang-tools-extra/trunk/clang-tidy/objc/AvoidSpinlockCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/objc/AvoidSpinlockCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/objc/AvoidSpinlockCheck.cpp @@ -1,36 +0,0 @@ -//===--- AvoidSpinlockCheck.cpp - clang-tidy-------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "AvoidSpinlockCheck.h" -#include "clang/AST/ASTContext.h" -#include "clang/ASTMatchers/ASTMatchFinder.h" - -using namespace clang::ast_matchers; - -namespace clang { -namespace tidy { -namespace objc { - -void AvoidSpinlockCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher( - callExpr(callee((functionDecl(hasAnyName( - "OSSpinlockLock", "OSSpinlockUnlock", "OSSpinlockTry"))))) - .bind("spinlock"), - this); -} - -void AvoidSpinlockCheck::check(const MatchFinder::MatchResult &Result) { - const auto *MatchedExpr = Result.Nodes.getNodeAs("spinlock"); - diag(MatchedExpr->getBeginLoc(), - "use os_unfair_lock_lock() or dispatch queue APIs instead of the " - "deprecated OSSpinLock"); -} - -} // namespace objc -} // namespace tidy -} // namespace clang Index: clang-tools-extra/trunk/clang-tidy/objc/CMakeLists.txt =================================================================== --- clang-tools-extra/trunk/clang-tidy/objc/CMakeLists.txt +++ clang-tools-extra/trunk/clang-tidy/objc/CMakeLists.txt @@ -2,7 +2,6 @@ add_clang_library(clangTidyObjCModule AvoidNSErrorInitCheck.cpp - AvoidSpinlockCheck.cpp ForbiddenSubclassingCheck.cpp MissingHashCheck.cpp ObjCTidyModule.cpp Index: clang-tools-extra/trunk/clang-tidy/objc/ObjCTidyModule.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/objc/ObjCTidyModule.cpp +++ clang-tools-extra/trunk/clang-tidy/objc/ObjCTidyModule.cpp @@ -10,7 +10,6 @@ #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" #include "AvoidNSErrorInitCheck.h" -#include "AvoidSpinlockCheck.h" #include "ForbiddenSubclassingCheck.h" #include "MissingHashCheck.h" #include "PropertyDeclarationCheck.h" @@ -27,8 +26,6 @@ void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { CheckFactories.registerCheck( "objc-avoid-nserror-init"); - CheckFactories.registerCheck( - "objc-avoid-spinlock"); CheckFactories.registerCheck( "objc-forbidden-subclassing"); CheckFactories.registerCheck( Index: clang-tools-extra/trunk/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/trunk/docs/ReleaseNotes.rst +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst @@ -115,6 +115,9 @@ Now also checks if any calls to ``pthread_*`` functions expect negative return values. +- The 'objc-avoid-spinlock' check was renamed to :doc:`darwin-avoid-spinlock + ` + Improvements to include-fixer ----------------------------- Index: clang-tools-extra/trunk/docs/clang-tidy/checks/darwin-avoid-spinlock.rst =================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/darwin-avoid-spinlock.rst +++ clang-tools-extra/trunk/docs/clang-tidy/checks/darwin-avoid-spinlock.rst @@ -0,0 +1,15 @@ +.. title:: clang-tidy - darwin-avoid-spinlock + +darwin-avoid-spinlock +===================== + +Finds usages of ``OSSpinlock``, which is deprecated due to potential livelock +problems. + +This check will detect following function invocations: + +- ``OSSpinlockLock`` +- ``OSSpinlockTry`` +- ``OSSpinlockUnlock`` + +The corresponding information about the problem of ``OSSpinlock``: https://blog.postmates.com/why-spinlocks-are-bad-on-ios-b69fc5221058 Index: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst =================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst @@ -212,6 +212,7 @@ cppcoreguidelines-pro-type-vararg cppcoreguidelines-slicing cppcoreguidelines-special-member-functions + darwin-avoid-spinlock darwin-dispatch-once-nonstatic fuchsia-default-arguments-calls fuchsia-default-arguments-declarations @@ -325,7 +326,6 @@ mpi-buffer-deref mpi-type-mismatch objc-avoid-nserror-init - objc-avoid-spinlock objc-forbidden-subclassing objc-missing-hash objc-property-declaration Index: clang-tools-extra/trunk/docs/clang-tidy/checks/objc-avoid-spinlock.rst =================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/objc-avoid-spinlock.rst +++ clang-tools-extra/trunk/docs/clang-tidy/checks/objc-avoid-spinlock.rst @@ -1,15 +0,0 @@ -.. title:: clang-tidy - objc-avoid-spinlock - -objc-avoid-spinlock -=================== - -Finds usages of ``OSSpinlock``, which is deprecated due to potential livelock -problems. - -This check will detect following function invocations: - -- ``OSSpinlockLock`` -- ``OSSpinlockTry`` -- ``OSSpinlockUnlock`` - -The corresponding information about the problem of ``OSSpinlock``: https://blog.postmates.com/why-spinlocks-are-bad-on-ios-b69fc5221058 Index: clang-tools-extra/trunk/test/clang-tidy/darwin-avoid-spinlock.m =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/darwin-avoid-spinlock.m +++ clang-tools-extra/trunk/test/clang-tidy/darwin-avoid-spinlock.m @@ -0,0 +1,15 @@ +// RUN: %check_clang_tidy %s darwin-avoid-spinlock %t + +typedef int OSSpinLock; + +@implementation Foo +- (void)f { + int i = 1; + OSSpinlockLock(&i); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use os_unfair_lock_lock() or dispatch queue APIs instead of the deprecated OSSpinLock [darwin-avoid-spinlock] + OSSpinlockTry(&i); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use os_unfair_lock_lock() or dispatch queue APIs instead of the deprecated OSSpinLock [darwin-avoid-spinlock] + OSSpinlockUnlock(&i); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use os_unfair_lock_lock() or dispatch queue APIs instead of the deprecated OSSpinLock [darwin-avoid-spinlock] +} +@end Index: clang-tools-extra/trunk/test/clang-tidy/objc-avoid-spinlock.m =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/objc-avoid-spinlock.m +++ clang-tools-extra/trunk/test/clang-tidy/objc-avoid-spinlock.m @@ -1,15 +0,0 @@ -// RUN: %check_clang_tidy %s objc-avoid-spinlock %t - -typedef int OSSpinLock; - -@implementation Foo -- (void)f { - int i = 1; - OSSpinlockLock(&i); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use os_unfair_lock_lock() or dispatch queue APIs instead of the deprecated OSSpinLock [objc-avoid-spinlock] - OSSpinlockTry(&i); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use os_unfair_lock_lock() or dispatch queue APIs instead of the deprecated OSSpinLock [objc-avoid-spinlock] - OSSpinlockUnlock(&i); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use os_unfair_lock_lock() or dispatch queue APIs instead of the deprecated OSSpinLock [objc-avoid-spinlock] -} -@end