1 //===--- NoAssemblerCheck.cpp - clang-tidy---------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "NoAssemblerCheck.h" 10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 12 13 using namespace clang::ast_matchers; 14 15 namespace clang::tidy::hicpp { 16 17 namespace { AST_MATCHER(VarDecl,isAsm)18AST_MATCHER(VarDecl, isAsm) { return Node.hasAttr<clang::AsmLabelAttr>(); } 19 const ast_matchers::internal::VariadicDynCastAllOfMatcher<Decl, 20 FileScopeAsmDecl> 21 fileScopeAsmDecl; 22 } // namespace 23 registerMatchers(MatchFinder * Finder)24void NoAssemblerCheck::registerMatchers(MatchFinder *Finder) { 25 Finder->addMatcher(asmStmt().bind("asm-stmt"), this); 26 Finder->addMatcher(fileScopeAsmDecl().bind("asm-file-scope"), this); 27 Finder->addMatcher(varDecl(isAsm()).bind("asm-var"), this); 28 } 29 check(const MatchFinder::MatchResult & Result)30void NoAssemblerCheck::check(const MatchFinder::MatchResult &Result) { 31 SourceLocation ASMLocation; 32 if (const auto *ASM = Result.Nodes.getNodeAs<AsmStmt>("asm-stmt")) 33 ASMLocation = ASM->getAsmLoc(); 34 else if (const auto *ASM = 35 Result.Nodes.getNodeAs<FileScopeAsmDecl>("asm-file-scope")) 36 ASMLocation = ASM->getAsmLoc(); 37 else if (const auto *ASM = Result.Nodes.getNodeAs<VarDecl>("asm-var")) 38 ASMLocation = ASM->getLocation(); 39 else 40 llvm_unreachable("Unhandled case in matcher."); 41 42 diag(ASMLocation, "do not use inline assembler in safety-critical code"); 43 } 44 45 } // namespace clang::tidy::hicpp 46