diff options
author | Fangrui Song <maskray@google.com> | 2018-03-07 16:57:42 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2018-03-07 16:57:42 +0000 |
commit | acb5dd35154d279ce7e204b5ed1188269646f317 (patch) | |
tree | 24958bc1cfd1c70b634033204547d1a28f57091f /clang-tidy/readability | |
parent | 5383c119dd185d9c4ef1707f0c89697f76ba87eb (diff) |
[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
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@326909 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clang-tidy/readability')
-rw-r--r-- | clang-tidy/readability/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang-tidy/readability/ReadabilityTidyModule.cpp | 3 | ||||
-rw-r--r-- | clang-tidy/readability/SIMDIntrinsicsCheck.cpp | 152 | ||||
-rw-r--r-- | clang-tidy/readability/SIMDIntrinsicsCheck.h | 40 |
4 files changed, 0 insertions, 196 deletions
diff --git a/clang-tidy/readability/CMakeLists.txt b/clang-tidy/readability/CMakeLists.txt index d750626f..95769ee9 100644 --- a/clang-tidy/readability/CMakeLists.txt +++ b/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-tidy/readability/ReadabilityTidyModule.cpp b/clang-tidy/readability/ReadabilityTidyModule.cpp index 619a4482..f39e4a1e 100644 --- a/clang-tidy/readability/ReadabilityTidyModule.cpp +++ b/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-tidy/readability/SIMDIntrinsicsCheck.cpp b/clang-tidy/readability/SIMDIntrinsicsCheck.cpp deleted file mode 100644 index 123e76d7..00000000 --- a/clang-tidy/readability/SIMDIntrinsicsCheck.cpp +++ /dev/null @@ -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 diff --git a/clang-tidy/readability/SIMDIntrinsicsCheck.h b/clang-tidy/readability/SIMDIntrinsicsCheck.h deleted file mode 100644 index 8c36cd7d..00000000 --- a/clang-tidy/readability/SIMDIntrinsicsCheck.h +++ /dev/null @@ -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 |