//===- SSAFAnalysesCommon.h -------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Common code in SSAF analyses implementations // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_ANALYSES_SSAFANALYSESCOMMON_H #define LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_ANALYSES_SSAFANALYSESCOMMON_H #include "clang/AST/ASTContext.h" #include "clang/AST/ASTTypeTraits.h" #include "clang/AST/Decl.h" #include "llvm/Support/JSON.h" namespace clang::ssaf { ///\return a short descriptions of a json::Value std::string describeJSONValue(const llvm::json::Value &V); ///\return a short descriptions of a json::Array std::string describeJSONValue(const llvm::json::Array &A); ///\return a short descriptions of a json::Object std::string describeJSONValue(const llvm::json::Object &O); template llvm::Error makeErrAtNode(clang::ASTContext &Ctx, const NodeTy *N, llvm::StringRef Fmt, const Ts &...Args) { std::string LocStr = N->getBeginLoc().printToString(Ctx.getSourceManager()); return llvm::createStringError((Fmt + " at %s").str().c_str(), Args..., LocStr.c_str()); } template llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs) { std::string Fmt = ("saw %s but expected " + Expected).str(); std::string SawStr = describeJSONValue(Saw); return llvm::createStringError(Fmt.c_str(), SawStr.c_str(), ExpectedArgs...); } template bool hasPtrOrArrType(const DeclOrExpr *E) { return llvm::isa( E->getType().getCanonicalType()); } llvm::Error makeEntityNameErr(clang::ASTContext &Ctx, const clang::NamedDecl *D); /// Find all contributors in an AST. void findContributors(ASTContext &Ctx, std::vector &Contributors); /// Perform "MatchAction" on each Stmt and Decl belonging to the `Contributor`. /// \param Contributor /// \param MatchActionRef a reference (view) to a "MatchAction" void findMatchesIn( const NamedDecl *Contributor, llvm::function_ref MatchActionRef); } // namespace clang::ssaf #endif // LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_ANALYSES_SSAFANALYSESCOMMON_H