diff options
16 files changed, 116 insertions, 35 deletions
diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt index a307ec024e9..8fd86a9830b 100644 --- a/clang-tools-extra/clang-tidy/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt @@ -41,6 +41,7 @@ add_subdirectory(mpi) add_subdirectory(objc) add_subdirectory(performance) add_subdirectory(plugin) +add_subdirectory(portability) add_subdirectory(readability) add_subdirectory(tool) add_subdirectory(utils) diff --git a/clang-tools-extra/clang-tidy/plugin/CMakeLists.txt b/clang-tools-extra/clang-tidy/plugin/CMakeLists.txt index 995c086515b..2175c1022ec 100644 --- a/clang-tools-extra/clang-tidy/plugin/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/plugin/CMakeLists.txt @@ -19,6 +19,7 @@ add_clang_library(clangTidyPlugin clangTidyMPIModule clangTidyObjCModule clangTidyPerformanceModule + clangTidyPortabilityModule clangTidyReadabilityModule clangTooling ) diff --git a/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp b/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp index 25c13c76cd8..dc567722171 100644 --- a/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp +++ b/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp @@ -118,6 +118,11 @@ extern volatile int PerformanceModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED PerformanceModuleAnchorDestination = PerformanceModuleAnchorSource; +// This anchor is used to force the linker to link the PortabilityModule. +extern volatile int PortabilityModuleAnchorSource; +static int LLVM_ATTRIBUTE_UNUSED PortabilityModuleAnchorDestination = + PortabilityModuleAnchorSource; + // This anchor is used to force the linker to link the ReadabilityModule. extern volatile int ReadabilityModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED ReadabilityModuleAnchorDestination = diff --git a/clang-tools-extra/clang-tidy/portability/CMakeLists.txt b/clang-tools-extra/clang-tidy/portability/CMakeLists.txt new file mode 100644 index 00000000000..0420a18a2a6 --- /dev/null +++ b/clang-tools-extra/clang-tidy/portability/CMakeLists.txt @@ -0,0 +1,15 @@ +set(LLVM_LINK_COMPONENTS support) + +add_clang_library(clangTidyPortabilityModule + PortabilityTidyModule.cpp + SIMDIntrinsicsCheck.cpp + + LINK_LIBS + clangAST + clangASTMatchers + clangBasic + clangLex + clangTidy + clangTidyUtils + clangTooling + ) diff --git a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp new file mode 100644 index 00000000000..013cbcfeae9 --- /dev/null +++ b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp @@ -0,0 +1,38 @@ +//===--- PortabilityTidyModule.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 "../ClangTidy.h" +#include "../ClangTidyModule.h" +#include "../ClangTidyModuleRegistry.h" +#include "SIMDIntrinsicsCheck.h" + +namespace clang { +namespace tidy { +namespace portability { + +class PortabilityModule : public ClangTidyModule { +public: + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck<SIMDIntrinsicsCheck>( + "portability-simd-intrinsics"); + } +}; + +// Register the PortabilityModule using this statically initialized variable. +static ClangTidyModuleRegistry::Add<PortabilityModule> + X("portability-module", "Adds portability-related checks."); + +} // namespace portability + +// This anchor is used to force the linker to link in the generated object file +// and thus register the PortabilityModule. +volatile int PortabilityModuleAnchorSource = 0; + +} // namespace tidy +} // namespace clang diff --git a/clang-tools-extra/clang-tidy/readability/SIMDIntrinsicsCheck.cpp b/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.cpp index 123e76d7ad1..d5434cc2e6c 100644 --- a/clang-tools-extra/clang-tidy/readability/SIMDIntrinsicsCheck.cpp +++ b/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.cpp @@ -18,7 +18,7 @@ using namespace clang::ast_matchers; namespace clang { namespace tidy { -namespace readability { +namespace portability { namespace { @@ -84,17 +84,21 @@ static StringRef TrySuggestX86(StringRef Name) { SIMDIntrinsicsCheck::SIMDIntrinsicsCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), Suggest(Options.get("Suggest", 0) != 0) {} + : ClangTidyCheck(Name, Context), Std(Options.get("Std", "")), + Suggest(Options.get("Suggest", 0) != 0) {} void SIMDIntrinsicsCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "Std", ""); Options.store(Opts, "Suggest", 0); } void SIMDIntrinsicsCheck::registerMatchers(MatchFinder *Finder) { if (!getLangOpts().CPlusPlus11) return; + // If Std is not specified, infer it from the language options. // libcxx implementation backports it to C++11 std::experimental::simd. - Std = getLangOpts().CPlusPlus2a ? "std" : "std::experimental"; + if (Std.empty()) + Std = getLangOpts().CPlusPlus2a ? "std" : "std::experimental"; Finder->addMatcher(callExpr(callee(functionDecl(allOf( matchesName("^::(_mm_|_mm256_|_mm512_|vec_)"), @@ -116,20 +120,23 @@ void SIMDIntrinsicsCheck::check(const MatchFinder::MatchResult &Result) { llvm::Triple::ArchType Arch = Result.Context->getTargetInfo().getTriple().getArch(); + // We warn or suggest if this SIMD intrinsic function has a std::simd + // replacement. switch (Arch) { - default: - break; - case llvm::Triple::ppc: - case llvm::Triple::ppc64: - case llvm::Triple::ppc64le: - New = TrySuggestPPC(Old); - break; - case llvm::Triple::x86: - case llvm::Triple::x86_64: - New = TrySuggestX86(Old); - break; + default: + break; + case llvm::Triple::ppc: + case llvm::Triple::ppc64: + case llvm::Triple::ppc64le: + New = TrySuggestPPC(Old); + break; + case llvm::Triple::x86: + case llvm::Triple::x86_64: + New = TrySuggestX86(Old); + break; } + // We have found a std::simd replacement. if (!New.empty()) { std::string Message; // If Suggest is true, give a P0214 alternative, otherwise point it out it @@ -137,7 +144,8 @@ void SIMDIntrinsicsCheck::check(const MatchFinder::MatchResult &Result) { if (Suggest) { Message = (Twine("'") + Old + "' can be replaced by " + New).str(); Message = llvm::Regex("\\$std").sub(Std, Message); - Message = llvm::Regex("\\$simd").sub(Std.str() + "::simd", Message); + Message = + llvm::Regex("\\$simd").sub((Std.str() + "::simd").str(), Message); } else { Message = (Twine("'") + Old + "' is a non-portable " + llvm::Triple::getArchTypeName(Arch) + " intrinsic function") @@ -147,6 +155,6 @@ void SIMDIntrinsicsCheck::check(const MatchFinder::MatchResult &Result) { } } -} // namespace readability +} // namespace portability } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/readability/SIMDIntrinsicsCheck.h b/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.h index 8c36cd7d644..ebcc8554514 100644 --- a/clang-tools-extra/clang-tidy/readability/SIMDIntrinsicsCheck.h +++ b/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.h @@ -12,14 +12,16 @@ #include "../ClangTidy.h" +#include "llvm/ADT/SmallString.h" + namespace clang { namespace tidy { -namespace readability { +namespace portability { /// Find SIMD intrinsics calls and suggest std::experimental::simd alternatives. /// /// For the user-facing documentation see: -/// http://clang.llvm.org/extra/clang-tidy/checks/readability-simd-intrinsics.html +/// http://clang.llvm.org/extra/clang-tidy/checks/portability-simd-intrinsics.html class SIMDIntrinsicsCheck : public ClangTidyCheck { public: SIMDIntrinsicsCheck(StringRef Name, ClangTidyContext *Context); @@ -29,11 +31,11 @@ public: void check(const ast_matchers::MatchFinder::MatchResult &Result) override; private: + llvm::SmallString<32> Std; const bool Suggest; - StringRef Std; }; -} // namespace readability +} // namespace portability } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt index d750626f355..95769ee9d4d 100644 --- a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt @@ -24,7 +24,6 @@ add_clang_library(clangTidyReadabilityModule RedundantStringCStrCheck.cpp RedundantSmartptrGetCheck.cpp RedundantStringInitCheck.cpp - SIMDIntrinsicsCheck.cpp SimplifyBooleanExprCheck.cpp StaticAccessedThroughInstanceCheck.cpp StaticDefinitionInAnonymousNamespaceCheck.cpp diff --git a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp index 619a44829d2..f39e4a1e5f6 100644 --- a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp @@ -31,7 +31,6 @@ #include "RedundantSmartptrGetCheck.h" #include "RedundantStringCStrCheck.h" #include "RedundantStringInitCheck.h" -#include "SIMDIntrinsicsCheck.h" #include "SimplifyBooleanExprCheck.h" #include "StaticAccessedThroughInstanceCheck.h" #include "StaticDefinitionInAnonymousNamespaceCheck.h" @@ -93,8 +92,6 @@ public: "readability-redundant-string-cstr"); CheckFactories.registerCheck<RedundantStringInitCheck>( "readability-redundant-string-init"); - CheckFactories.registerCheck<SIMDIntrinsicsCheck>( - "readability-simd-intrinsics"); CheckFactories.registerCheck<SimplifyBooleanExprCheck>( "readability-simplify-boolean-expr"); CheckFactories.registerCheck<UniqueptrDeleteReleaseCheck>( diff --git a/clang-tools-extra/clang-tidy/tool/CMakeLists.txt b/clang-tools-extra/clang-tidy/tool/CMakeLists.txt index 07f2671ea95..1b4ec468e47 100644 --- a/clang-tools-extra/clang-tidy/tool/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/tool/CMakeLists.txt @@ -31,6 +31,7 @@ target_link_libraries(clang-tidy clangTidyMPIModule clangTidyObjCModule clangTidyPerformanceModule + clangTidyPortabilityModule clangTidyReadabilityModule clangTooling clangToolingCore diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp index e362b32e720..7d13e9da6fb 100644 --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -554,6 +554,11 @@ extern volatile int PerformanceModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED PerformanceModuleAnchorDestination = PerformanceModuleAnchorSource; +// This anchor is used to force the linker to link the PortabilityModule. +extern volatile int PortabilityModuleAnchorSource; +static int LLVM_ATTRIBUTE_UNUSED PortabilityModuleAnchorDestination = + PortabilityModuleAnchorSource; + // This anchor is used to force the linker to link the ReadabilityModule. extern volatile int ReadabilityModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED ReadabilityModuleAnchorDestination = diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index ef7e74eeb1c..596bfa8ae30 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -57,6 +57,8 @@ The improvements are... Improvements to clang-tidy -------------------------- +- New module ``portability``. + - New `bugprone-throw-keyword-missing <http://clang.llvm.org/extra/clang-tidy/checks/bugprone-throw-keyword-missing.html>`_ check @@ -95,10 +97,10 @@ Improvements to clang-tidy Finds and replaces deprecated uses of ``std::uncaught_exception`` to ``std::uncaught_exceptions``. -- New `readability-simd-intrinsics - <http://clang.llvm.org/extra/clang-tidy/checks/readability-simd-intrinsics.html>`_ check +- New `portability-simd-intrinsics + <http://clang.llvm.org/extra/clang-tidy/checks/portability-simd-intrinsics.html>`_ check - Warns if SIMD intrinsics are used which can be replaced by + Warns or suggests alternatives if SIMD intrinsics are used which can be replaced by ``std::experimental::simd`` operations. - New alias `hicpp-avoid-goto diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-simd-intrinsics.rst b/clang-tools-extra/docs/clang-tidy/checks/portability-simd-intrinsics.rst index 49d442c6cd9..2cd9d9f75f0 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/readability-simd-intrinsics.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/portability-simd-intrinsics.rst @@ -1,6 +1,6 @@ -.. title:: clang-tidy - readability-simd-intrinsics +.. title:: clang-tidy - portability-simd-intrinsics -readability-simd-intrinsics +portability-simd-intrinsics =========================== Finds SIMD intrinsics calls and suggests ``std::experimental::simd`` (`P0214`_) @@ -41,4 +41,9 @@ Options `P0214`_ alternatives, otherwise it only points out the intrinsic function is non-portable. +.. option:: Std + + The namespace used to suggest `P0214`_ alternatives. If not specified, `std::` + for `-std=c++2a` and `std::experimental::` for `-std=c++11`. + .. _P0214: http://wg21.link/p0214 diff --git a/clang-tools-extra/docs/clang-tidy/index.rst b/clang-tools-extra/docs/clang-tidy/index.rst index 35292d00792..33bceaaab44 100644 --- a/clang-tools-extra/docs/clang-tidy/index.rst +++ b/clang-tools-extra/docs/clang-tidy/index.rst @@ -71,6 +71,8 @@ Name prefix Description ``mpi-`` Checks related to MPI (Message Passing Interface). ``objc-`` Checks related to Objective-C coding conventions. ``performance-`` Checks that target performance-related issues. +``portability-`` Checks that target portability-related issues that don't + relate to any particular coding style. ``readability-`` Checks that target readability-related issues that don't relate to any particular coding style. ====================== ========================================================= diff --git a/clang-tools-extra/test/clang-tidy/readability-simd-intrinsics-ppc.cpp b/clang-tools-extra/test/clang-tidy/portability-simd-intrinsics-ppc.cpp index 387384b084c..be0ef760d8d 100644 --- a/clang-tools-extra/test/clang-tidy/readability-simd-intrinsics-ppc.cpp +++ b/clang-tools-extra/test/clang-tidy/portability-simd-intrinsics-ppc.cpp @@ -1,6 +1,6 @@ -// RUN: %check_clang_tidy %s readability-simd-intrinsics %t -- \ +// RUN: %check_clang_tidy %s portability-simd-intrinsics %t -- \ // RUN: -config='{CheckOptions: [ \ -// RUN: {key: readability-simd-intrinsics.Suggest, value: 1} \ +// RUN: {key: portability-simd-intrinsics.Suggest, value: 1} \ // RUN: ]}' -- -target ppc64le -maltivec -std=c++11 vector int vec_add(vector int, vector int); @@ -9,5 +9,5 @@ void PPC() { vector int i0, i1; vec_add(i0, i1); -// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'vec_add' can be replaced by operator+ on std::experimental::simd objects [readability-simd-intrinsics] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'vec_add' can be replaced by operator+ on std::experimental::simd objects [portability-simd-intrinsics] } diff --git a/clang-tools-extra/test/clang-tidy/readability-simd-intrinsics-x86.cpp b/clang-tools-extra/test/clang-tidy/portability-simd-intrinsics-x86.cpp index 8ab3556b55f..1fb22891f8e 100644 --- a/clang-tools-extra/test/clang-tidy/readability-simd-intrinsics-x86.cpp +++ b/clang-tools-extra/test/clang-tidy/portability-simd-intrinsics-x86.cpp @@ -1,6 +1,6 @@ -// RUN: %check_clang_tidy %s readability-simd-intrinsics %t -- \ +// RUN: %check_clang_tidy %s portability-simd-intrinsics %t -- \ // RUN: -config='{CheckOptions: [ \ -// RUN: {key: readability-simd-intrinsics.Suggest, value: 1} \ +// RUN: {key: portability-simd-intrinsics.Suggest, value: 1} \ // RUN: ]}' -- -target x86_64 -std=c++11 typedef long long __m128i __attribute__((vector_size(16))); @@ -17,7 +17,7 @@ void X86() { __m256 d0; _mm_add_epi32(i0, i1); -// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: '_mm_add_epi32' can be replaced by operator+ on std::experimental::simd objects [readability-simd-intrinsics] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: '_mm_add_epi32' can be replaced by operator+ on std::experimental::simd objects [portability-simd-intrinsics] d0 = _mm256_load_pd(0); _mm256_store_pd(0, d0); |