//===-- ASTOps.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 // //===----------------------------------------------------------------------===// // // Operations on AST nodes that are used in flow-sensitive analysis. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_ASTOPS_H #define LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_ASTOPS_H #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Type.h" #include "clang/Analysis/FlowSensitive/StorageLocation.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SetVector.h" namespace clang { namespace dataflow { /// Skip past nodes that the CFG does not emit. These nodes are invisible to /// flow-sensitive analysis, and should be ignored as they will effectively not /// exist. /// /// * `ParenExpr` - The CFG takes the operator precedence into account, but /// otherwise omits the node afterwards. /// /// * `ExprWithCleanups` - The CFG will generate the appropriate calls to /// destructors and then omit the node. /// const Expr &ignoreCFGOmittedNodes(const Expr &E); const Stmt &ignoreCFGOmittedNodes(const Stmt &S); /// A set of `FieldDecl *`. Use `SmallSetVector` to guarantee deterministic /// iteration order. FieldSet; /// Returns the set of all fields in the type. FieldSet getObjectFields(QualType Type); /// Returns whether `Fields` and `FieldLocs` contain the same fields. bool containsSameFields(const FieldSet &Fields, const RecordStorageLocation::FieldToLoc &FieldLocs); /// Helper class for initialization of a record with an `InitListExpr`. /// `InitListExpr::inits()` contains the initializers for both the base classes /// and the fields of the record; this helper class separates these out into two /// different lists. In addition, it deals with special cases associated with /// unions. class RecordInitListHelper { … }; /// Specialization of `RecursiveASTVisitor` that visits those nodes that are /// relevant to the dataflow analysis; generally, these are the ones that also /// appear in the CFG. /// To start the traversal, call `TraverseStmt()` on the statement or body of /// the function to analyze. Don't call `TraverseDecl()` on the function itself; /// this won't work as `TraverseDecl()` contains code to avoid traversing nested /// functions. template <class Derived> class AnalysisASTVisitor : public RecursiveASTVisitor<Derived> { … }; /// A collection of several types of declarations, all referenced from the same /// function. struct ReferencedDecls { … }; /// Returns declarations that are declared in or referenced from `FD`. ReferencedDecls getReferencedDecls(const FunctionDecl &FD); /// Returns declarations that are declared in or referenced from `S`. ReferencedDecls getReferencedDecls(const Stmt &S); } // namespace dataflow } // namespace clang #endif // LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_ASTOPS_H