//===- ThreadSafetyTraverse.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 // //===----------------------------------------------------------------------===// // // This file defines a framework for doing generic traversals and rewriting // operations over the Thread Safety TIL. // // UNDER CONSTRUCTION. USE AT YOUR OWN RISK. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYTRAVERSE_H #define LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYTRAVERSE_H #include "clang/AST/Decl.h" #include "clang/Analysis/Analyses/ThreadSafetyTIL.h" #include "clang/Analysis/Analyses/ThreadSafetyUtil.h" #include "clang/Basic/LLVM.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Casting.h" #include <cstdint> #include <ostream> namespace clang { namespace threadSafety { namespace til { // Defines an interface used to traverse SExprs. Traversals have been made as // generic as possible, and are intended to handle any kind of pass over the // AST, e.g. visitors, copying, non-destructive rewriting, destructive // (in-place) rewriting, hashing, typing, etc. // // Traversals implement the functional notion of a "fold" operation on SExprs. // Each SExpr class provides a traverse method, which does the following: // * e->traverse(v): // // compute a result r_i for each subexpression e_i // for (i = 1..n) r_i = v.traverse(e_i); // // combine results into a result for e, where X is the class of e // return v.reduceX(*e, r_1, .. r_n). // // A visitor can control the traversal by overriding the following methods: // * v.traverse(e): // return v.traverseByCase(e), which returns v.traverseX(e) // * v.traverseX(e): (X is the class of e) // return e->traverse(v). // * v.reduceX(*e, r_1, .. r_n): // compute a result for a node of type X // // The reduceX methods control the kind of traversal (visitor, copy, etc.). // They are defined in derived classes. // // Class R defines the basic interface types (R_SExpr). template <class Self, class R> class Traversal { … }; // Base class for simple reducers that don't much care about the context. class SimpleReducerBase { … }; // Base class for traversals that rewrite an SExpr to another SExpr. class CopyReducerBase : public SimpleReducerBase { … }; // Base class for visit traversals. class VisitReducerBase : public SimpleReducerBase { … }; // Implements a traversal that visits each subexpression, and returns either // true or false. template <class Self> class VisitReducer : public Traversal<Self, VisitReducerBase>, public VisitReducerBase { … }; // Basic class for comparison operations over expressions. template <typename Self> class Comparator { … }; class EqualsComparator : public Comparator<EqualsComparator> { … }; class MatchComparator : public Comparator<MatchComparator> { … }; // inline std::ostream& operator<<(std::ostream& SS, StringRef R) { // return SS.write(R.data(), R.size()); // } // Pretty printer for TIL expressions template <typename Self, typename StreamType> class PrettyPrinter { … }; class StdPrinter : public PrettyPrinter<StdPrinter, std::ostream> { … }; } // namespace til } // namespace threadSafety } // namespace clang #endif // LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYTRAVERSE_H