Index: clang-tidy/fuchsia/AddVisibilityCheck.h =================================================================== --- /dev/null +++ clang-tidy/fuchsia/AddVisibilityCheck.h @@ -0,0 +1,42 @@ +//===--- AddVisibilityCheck.h - clang-tidy-----------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_ADDVISIBILITYCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_ADDVISIBILITYCHECK_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace fuchsia { + +/// Check to find a given named function and suggest a fix to add +/// a __attribute__((visibility("hidden"))) to its definition. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-add-visibility.html +class AddVisibilityCheck : public ClangTidyCheck { +public: + AddVisibilityCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), Name(Options.get("Name", "")) {} + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + +private: + void loadNames(); + + std::string Name; +}; + +} // namespace fuchsia +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_ADDVISIBILITYCHECK_H Index: clang-tidy/fuchsia/AddVisibilityCheck.cpp =================================================================== --- /dev/null +++ clang-tidy/fuchsia/AddVisibilityCheck.cpp @@ -0,0 +1,49 @@ +//===--- AddVisibilityCheck.cpp - clang-tidy-------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "AddVisibilityCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "llvm/Support/ErrorOr.h" +#include "llvm/Support/MemoryBuffer.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace fuchsia { + +AST_MATCHER(FunctionDecl, hasVisibilityAttr) { + return Node.getLinkageAndVisibility().isVisibilityExplicit(); +} + +void AddVisibilityCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "Name", Name); +} + +void AddVisibilityCheck::registerMatchers(MatchFinder *Finder) { + if (Name.empty()) return; + Finder->addMatcher(functionDecl(allOf(hasName(Name), isDefinition(), + unless(hasVisibilityAttr()))) + .bind("x"), + this); +} + +void AddVisibilityCheck::check(const MatchFinder::MatchResult &Result) { + const auto *MatchedDecl = Result.Nodes.getNodeAs("x"); + diag(MatchedDecl->getLocStart(), "set visibility attr to hidden") + << MatchedDecl + << FixItHint::CreateInsertion( + MatchedDecl->getLocStart(), + "__attribute__((visibility(\"hidden\")))\n"); +} + +} // namespace fuchsia +} // namespace tidy +} // namespace clang Index: clang-tidy/fuchsia/CMakeLists.txt =================================================================== --- clang-tidy/fuchsia/CMakeLists.txt +++ clang-tidy/fuchsia/CMakeLists.txt @@ -1,6 +1,7 @@ set(LLVM_LINK_COMPONENTS support) add_clang_library(clangTidyFuchsiaModule + AddVisibilityCheck.cpp DefaultArgumentsCheck.cpp FuchsiaTidyModule.cpp MultipleInheritanceCheck.cpp Index: clang-tidy/fuchsia/FuchsiaTidyModule.cpp =================================================================== --- clang-tidy/fuchsia/FuchsiaTidyModule.cpp +++ clang-tidy/fuchsia/FuchsiaTidyModule.cpp @@ -10,6 +10,7 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "AddVisibilityCheck.h" #include "DefaultArgumentsCheck.h" #include "MultipleInheritanceCheck.h" #include "OverloadedOperatorCheck.h" @@ -27,6 +28,8 @@ class FuchsiaModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck( + "fuchsia-add-visibility"); CheckFactories.registerCheck( "fuchsia-default-arguments"); CheckFactories.registerCheck( Index: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -57,6 +57,12 @@ Improvements to clang-tidy -------------------------- +- New `fuchsia-add-visibility + `_ check + + Check to find a given named function and suggest a fix to add a + `__attribute__((visibility("hidden")))` to its definition. + - The 'misc-incorrect-roundings' check was renamed to `bugprone-incorrect-roundings `_ Index: docs/clang-tidy/checks/fuchsia-add-visibility.rst =================================================================== --- /dev/null +++ docs/clang-tidy/checks/fuchsia-add-visibility.rst @@ -0,0 +1,21 @@ +.. title:: clang-tidy - fuchsia-add-visibility + +fuchsia-add-visibility +====================== + +Check to find a given named function and suggest a fix to add +a `__attribute__((visibility("hidden")))` to its definition. + +For example, given the name 'func': + +.. code-block:: c++ + + void func() {} + +would be changed to + +.. code-block:: c++ + + __attribute__((visibility("hidden"))) + void func() {} + \ No newline at end of file Index: docs/clang-tidy/checks/list.rst =================================================================== --- docs/clang-tidy/checks/list.rst +++ docs/clang-tidy/checks/list.rst @@ -71,6 +71,7 @@ cppcoreguidelines-pro-type-vararg cppcoreguidelines-slicing cppcoreguidelines-special-member-functions + fuchsia-add-visibility fuchsia-default-arguments fuchsia-multiple-inheritance fuchsia-overloaded-operator Index: test/clang-tidy/fuchsia-add-visibility.cpp =================================================================== --- /dev/null +++ test/clang-tidy/fuchsia-add-visibility.cpp @@ -0,0 +1,10 @@ +// RUN: %check_clang_tidy %s fuchsia-add-visibility %t -- \ +// RUN: -config="{CheckOptions: [{key: fuchsia-add-visibility.Name, value: 'foo'}]}" \ +// RUN: -- -std=c++11 + +void foo(); + +void foo() {} +// CHECK-MESSAGES: [[@LINE-1]]:1: warning: set visibility attr to hidden +// CHECK-FIXES: __attribute__((visibility("hidden"))) +