Author: maskray Date: Wed Mar 7 08:57:42 2018 New Revision: 326909 URL: http://llvm.org/viewvc/llvm-project?rev=326909&view=rev Log: [clang-tidy] Add "portability" module and rename readability-simd-intrinsics to portability-simd-intrinsics
Reviewers: alexfh Subscribers: klimek, nemanjai, mgorny, xazax.hun, kbarton, cfe-commits Differential Revision: https://reviews.llvm.org/D44173 Added: clang-tools-extra/trunk/clang-tidy/portability/ clang-tools-extra/trunk/clang-tidy/portability/CMakeLists.txt clang-tools-extra/trunk/clang-tidy/portability/PortabilityTidyModule.cpp clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.cpp - copied, changed from r326809, clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.h - copied, changed from r326809, clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h clang-tools-extra/trunk/docs/clang-tidy/checks/portability-simd-intrinsics.rst - copied, changed from r326809, clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-ppc.cpp - copied, changed from r326809, clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-x86.cpp - copied, changed from r326809, clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp Removed: clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp Modified: clang-tools-extra/trunk/clang-tidy/CMakeLists.txt clang-tools-extra/trunk/clang-tidy/plugin/CMakeLists.txt clang-tools-extra/trunk/clang-tidy/plugin/ClangTidyPlugin.cpp clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp clang-tools-extra/trunk/docs/ReleaseNotes.rst clang-tools-extra/trunk/docs/clang-tidy/index.rst Modified: clang-tools-extra/trunk/clang-tidy/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/CMakeLists.txt?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/CMakeLists.txt Wed Mar 7 08:57:42 2018 @@ -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) Modified: clang-tools-extra/trunk/clang-tidy/plugin/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/plugin/CMakeLists.txt?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/plugin/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/plugin/CMakeLists.txt Wed Mar 7 08:57:42 2018 @@ -19,6 +19,7 @@ add_clang_library(clangTidyPlugin clangTidyMPIModule clangTidyObjCModule clangTidyPerformanceModule + clangTidyPortabilityModule clangTidyReadabilityModule clangTooling ) Modified: clang-tools-extra/trunk/clang-tidy/plugin/ClangTidyPlugin.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/plugin/ClangTidyPlugin.cpp?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/plugin/ClangTidyPlugin.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/plugin/ClangTidyPlugin.cpp Wed Mar 7 08:57:42 2018 @@ -118,6 +118,11 @@ extern volatile int PerformanceModuleAnc 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 = Added: clang-tools-extra/trunk/clang-tidy/portability/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/portability/CMakeLists.txt?rev=326909&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/portability/CMakeLists.txt (added) +++ clang-tools-extra/trunk/clang-tidy/portability/CMakeLists.txt Wed Mar 7 08:57:42 2018 @@ -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 + ) Added: clang-tools-extra/trunk/clang-tidy/portability/PortabilityTidyModule.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/portability/PortabilityTidyModule.cpp?rev=326909&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/portability/PortabilityTidyModule.cpp (added) +++ clang-tools-extra/trunk/clang-tidy/portability/PortabilityTidyModule.cpp Wed Mar 7 08:57:42 2018 @@ -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 Copied: clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.cpp (from r326809, clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.cpp?p2=clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.cpp&p1=clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp&r1=326809&r2=326909&rev=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.cpp Wed Mar 7 08:57:42 2018 @@ -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 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 Ma 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 Ma 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 Ma } } -} // namespace readability +} // namespace portability } // namespace tidy } // namespace clang Copied: clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.h (from r326809, clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.h?p2=clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.h&p1=clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h&r1=326809&r2=326909&rev=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/portability/SIMDIntrinsicsCheck.h Wed Mar 7 08:57:42 2018 @@ -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 Modified: clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt Wed Mar 7 08:57:42 2018 @@ -24,7 +24,6 @@ add_clang_library(clangTidyReadabilityMo RedundantStringCStrCheck.cpp RedundantSmartptrGetCheck.cpp RedundantStringInitCheck.cpp - SIMDIntrinsicsCheck.cpp SimplifyBooleanExprCheck.cpp StaticAccessedThroughInstanceCheck.cpp StaticDefinitionInAnonymousNamespaceCheck.cpp Modified: clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp Wed Mar 7 08:57:42 2018 @@ -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>( Removed: clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp?rev=326908&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.cpp (removed) @@ -1,152 +0,0 @@ -//===--- SIMDIntrinsicsCheck.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 "SIMDIntrinsicsCheck.h" -#include "clang/AST/ASTContext.h" -#include "clang/ASTMatchers/ASTMatchFinder.h" -#include "llvm/ADT/StringMap.h" -#include "llvm/ADT/Triple.h" -#include "llvm/Support/Regex.h" - -using namespace clang::ast_matchers; - -namespace clang { -namespace tidy { -namespace readability { - -namespace { - -// If the callee has parameter of VectorType or pointer to VectorType, -// or the return type is VectorType, we consider it a vector function -// and a candidate for checking. -AST_MATCHER(FunctionDecl, isVectorFunction) { - bool IsVector = Node.getReturnType()->isVectorType(); - for (const ParmVarDecl *Parm : Node.parameters()) { - QualType Type = Parm->getType(); - if (Type->isPointerType()) - Type = Type->getPointeeType(); - if (Type->isVectorType()) - IsVector = true; - } - return IsVector; -} - -} // namespace - -static StringRef TrySuggestPPC(StringRef Name) { - if (!Name.consume_front("vec_")) - return {}; - - static const llvm::StringMap<StringRef> Mapping{ - // [simd.alg] - {"max", "$std::max"}, - {"min", "$std::min"}, - - // [simd.binary] - {"add", "operator+ on $simd objects"}, - {"sub", "operator- on $simd objects"}, - {"mul", "operator* on $simd objects"}, - }; - - auto It = Mapping.find(Name); - if (It != Mapping.end()) - return It->second; - return {}; -} - -static StringRef TrySuggestX86(StringRef Name) { - if (!(Name.consume_front("_mm_") || Name.consume_front("_mm256_") || - Name.consume_front("_mm512_"))) - return {}; - - // [simd.alg] - if (Name.startswith("max_")) - return "$simd::max"; - if (Name.startswith("min_")) - return "$simd::min"; - - // [simd.binary] - if (Name.startswith("add_")) - return "operator+ on $simd objects"; - if (Name.startswith("sub_")) - return "operator- on $simd objects"; - if (Name.startswith("mul_")) - return "operator* on $simd objects"; - - return {}; -} - -SIMDIntrinsicsCheck::SIMDIntrinsicsCheck(StringRef Name, - ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), Suggest(Options.get("Suggest", 0) != 0) {} - -void SIMDIntrinsicsCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "Suggest", 0); -} - -void SIMDIntrinsicsCheck::registerMatchers(MatchFinder *Finder) { - if (!getLangOpts().CPlusPlus11) - return; - // libcxx implementation backports it to C++11 std::experimental::simd. - Std = getLangOpts().CPlusPlus2a ? "std" : "std::experimental"; - - Finder->addMatcher(callExpr(callee(functionDecl(allOf( - matchesName("^::(_mm_|_mm256_|_mm512_|vec_)"), - isVectorFunction()))), - unless(isExpansionInSystemHeader())) - .bind("call"), - this); -} - -void SIMDIntrinsicsCheck::check(const MatchFinder::MatchResult &Result) { - const auto *Call = Result.Nodes.getNodeAs<CallExpr>("call"); - assert(Call != nullptr); - const FunctionDecl *Callee = Call->getDirectCallee(); - if (!Callee) - return; - - StringRef Old = Callee->getName(); - StringRef New; - llvm::Triple::ArchType Arch = - Result.Context->getTargetInfo().getTriple().getArch(); - - 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; - } - - if (!New.empty()) { - std::string Message; - // If Suggest is true, give a P0214 alternative, otherwise point it out it - // is non-portable. - 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); - } else { - Message = (Twine("'") + Old + "' is a non-portable " + - llvm::Triple::getArchTypeName(Arch) + " intrinsic function") - .str(); - } - diag(Call->getExprLoc(), Message); - } -} - -} // namespace readability -} // namespace tidy -} // namespace clang Removed: clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h?rev=326908&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/readability/SIMDIntrinsicsCheck.h (removed) @@ -1,40 +0,0 @@ -//===--- SIMDIntrinsicsCheck.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_SIMD_INTRINSICS_CHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_SIMD_INTRINSICS_CHECK_H - -#include "../ClangTidy.h" - -namespace clang { -namespace tidy { -namespace readability { - -/// 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 -class SIMDIntrinsicsCheck : public ClangTidyCheck { -public: - SIMDIntrinsicsCheck(StringRef Name, ClangTidyContext *Context); - - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - - private: - const bool Suggest; - StringRef Std; -}; - -} // namespace readability -} // namespace tidy -} // namespace clang - -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_SIMD_INTRINSICS_CHECK_H Modified: clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt Wed Mar 7 08:57:42 2018 @@ -31,6 +31,7 @@ target_link_libraries(clang-tidy clangTidyMPIModule clangTidyObjCModule clangTidyPerformanceModule + clangTidyPortabilityModule clangTidyReadabilityModule clangTooling clangToolingCore Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Wed Mar 7 08:57:42 2018 @@ -554,6 +554,11 @@ extern volatile int PerformanceModuleAnc 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 = Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original) +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Wed Mar 7 08:57:42 2018 @@ -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 Copied: clang-tools-extra/trunk/docs/clang-tidy/checks/portability-simd-intrinsics.rst (from r326809, clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/portability-simd-intrinsics.rst?p2=clang-tools-extra/trunk/docs/clang-tidy/checks/portability-simd-intrinsics.rst&p1=clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst&r1=326809&r2=326909&rev=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/portability-simd-intrinsics.rst Wed Mar 7 08:57:42 2018 @@ -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 Removed: clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst?rev=326908&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simd-intrinsics.rst (removed) @@ -1,44 +0,0 @@ -.. title:: clang-tidy - readability-simd-intrinsics - -readability-simd-intrinsics -=========================== - -Finds SIMD intrinsics calls and suggests ``std::experimental::simd`` (`P0214`_) -alternatives. - -If the option ``Suggest`` is set to non-zero, for - -.. code-block:: c++ - - _mm_add_epi32(a, b); // x86 - vec_add(a, b); // Power - -the check suggests an alternative: ``operator+`` on ``std::experimental::simd`` -objects. - -Otherwise, it just complains the intrinsics are non-portable (and there are -`P0214`_ alternatives). - -Many architectures provide SIMD operations (e.g. x86 SSE/AVX, Power AltiVec/VSX, -ARM NEON). It is common that SIMD code implementing the same algorithm, is -written in multiple target-dispatching pieces to optimize for different -architectures or micro-architectures. - -The C++ standard proposal `P0214`_ and its extensions cover many common SIMD -operations. By migrating from target-dependent intrinsics to `P0214`_ -operations, the SIMD code can be simplified and pieces for different targets can -be unified. - -Refer to `P0214`_ for introduction and motivation for the data-parallel standard -library. - -Options -------- - -.. option:: Suggest - - If this option is set to non-zero (default is `0`), the check will suggest - `P0214`_ alternatives, otherwise it only points out the intrinsic function is - non-portable. - -.. _P0214: http://wg21.link/p0214 Modified: clang-tools-extra/trunk/docs/clang-tidy/index.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/index.rst?rev=326909&r1=326908&r2=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/index.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/index.rst Wed Mar 7 08:57:42 2018 @@ -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. ====================== ========================================================= Copied: clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-ppc.cpp (from r326809, clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-ppc.cpp?p2=clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-ppc.cpp&p1=clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp&r1=326809&r2=326909&rev=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-ppc.cpp Wed Mar 7 08:57:42 2018 @@ -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] } Copied: clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-x86.cpp (from r326809, clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-x86.cpp?p2=clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-x86.cpp&p1=clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp&r1=326809&r2=326909&rev=326909&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/portability-simd-intrinsics-x86.cpp Wed Mar 7 08:57:42 2018 @@ -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); Removed: clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp?rev=326908&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-ppc.cpp (removed) @@ -1,13 +0,0 @@ -// RUN: %check_clang_tidy %s readability-simd-intrinsics %t -- \ -// RUN: -config='{CheckOptions: [ \ -// RUN: {key: readability-simd-intrinsics.Suggest, value: 1} \ -// RUN: ]}' -- -target ppc64le -maltivec -std=c++11 - -vector int vec_add(vector int, vector int); - -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] -} Removed: clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp?rev=326908&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/readability-simd-intrinsics-x86.cpp (removed) @@ -1,25 +0,0 @@ -// RUN: %check_clang_tidy %s readability-simd-intrinsics %t -- \ -// RUN: -config='{CheckOptions: [ \ -// RUN: {key: readability-simd-intrinsics.Suggest, value: 1} \ -// RUN: ]}' -- -target x86_64 -std=c++11 - -typedef long long __m128i __attribute__((vector_size(16))); -typedef double __m256 __attribute__((vector_size(32))); - -__m128i _mm_add_epi32(__m128i, __m128i); -__m256 _mm256_load_pd(double const *); -void _mm256_store_pd(double *, __m256); - -int _mm_add_fake(int, int); - -void X86() { - __m128i i0, i1; - __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] - d0 = _mm256_load_pd(0); - _mm256_store_pd(0, d0); - - _mm_add_fake(0, 1); -} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits