//===- StandardInstrumentations.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 // //===----------------------------------------------------------------------===// /// \file /// /// This header defines a class that provides bookkeeping for all standard /// (i.e in-tree) pass instrumentations. /// //===----------------------------------------------------------------------===// #ifndef LLVM_PASSES_STANDARDINSTRUMENTATIONS_H #define LLVM_PASSES_STANDARDINSTRUMENTATIONS_H #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/OptBisect.h" #include "llvm/IR/PassTimingInfo.h" #include "llvm/IR/ValueHandle.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Transforms/IPO/SampleProfileProbe.h" #include <string> #include <utility> namespace llvm { class Module; class Function; class MachineFunction; class PassInstrumentationCallbacks; /// Instrumentation to print IR before/after passes. /// /// Needs state to be able to print module after pass that invalidates IR unit /// (typically Loop or SCC). class PrintIRInstrumentation { … }; class OptNoneInstrumentation { … }; class OptPassGateInstrumentation { … }; struct PrintPassOptions { … }; // Debug logging for transformation and analysis passes. class PrintPassInstrumentation { … }; class PreservedCFGCheckerInstrumentation { … }; // Base class for classes that report changes to the IR. // It presents an interface for such classes and provides calls // on various events as the new pass manager transforms the IR. // It also provides filtering of information based on hidden options // specifying which functions are interesting. // Calls are made for the following events/queries: // 1. The initial IR processed. // 2. To get the representation of the IR (of type \p T). // 3. When a pass does not change the IR. // 4. When a pass changes the IR (given both before and after representations // of type \p T). // 5. When an IR is invalidated. // 6. When a pass is run on an IR that is not interesting (based on options). // 7. When a pass is ignored (pass manager or adapter pass). // 8. To compare two IR representations (of type \p T). template <typename IRUnitT> class ChangeReporter { … }; // An abstract template base class that handles printing banners and // reporting when things have not changed or are filtered out. template <typename IRUnitT> class TextChangeReporter : public ChangeReporter<IRUnitT> { … }; // A change printer based on the string representation of the IR as created // by unwrapAndPrint. The string representation is stored in a std::string // to preserve it as the IR changes in each pass. Note that the banner is // included in this representation but it is massaged before reporting. class IRChangedPrinter : public TextChangeReporter<std::string> { … }; class IRChangedTester : public IRChangedPrinter { … }; // Information that needs to be saved for a basic block in order to compare // before and after the pass to determine if it was changed by a pass. template <typename T> class BlockDataT { … }; template <typename T> class OrderedChangedData { … }; // Do not need extra information for patch-style change reporter. class EmptyData { … }; // The data saved for comparing functions. template <typename T> class FuncDataT : public OrderedChangedData<BlockDataT<T>> { … }; // The data saved for comparing IRs. template <typename T> class IRDataT : public OrderedChangedData<FuncDataT<T>> { … }; // Abstract template base class for a class that compares two IRs. The // class is created with the 2 IRs to compare and then compare is called. // The static function analyzeIR is used to build up the IR representation. template <typename T> class IRComparer { … }; // A change printer that prints out in-line differences in the basic // blocks. It uses an InlineComparer to do the comparison so it shows // the differences prefixed with '-' and '+' for code that is removed // and added, respectively. Changes to the IR that do not affect basic // blocks are not reported as having changed the IR. The option // -print-module-scope does not affect this change reporter. class InLineChangePrinter : public TextChangeReporter<IRDataT<EmptyData>> { … }; class VerifyInstrumentation { … }; /// This class implements --time-trace functionality for new pass manager. /// It provides the pass-instrumentation callbacks that measure the pass /// execution time. They collect time tracing info by TimeProfiler. class TimeProfilingPassesHandler { … }; // Class that holds transitions between basic blocks. The transitions // are contained in a map of values to names of basic blocks. class DCData { … }; // A change reporter that builds a website with links to pdf files showing // dot control flow graphs with changed instructions shown in colour. class DotCfgChangeReporter : public ChangeReporter<IRDataT<DCData>> { … }; // Print IR on crash. class PrintCrashIRInstrumentation { … }; /// This class provides an interface to register all the standard pass /// instrumentations and manages their state (if any). class StandardInstrumentations { … }; extern template class ChangeReporter<std::string>; extern template class TextChangeReporter<std::string>; extern template class BlockDataT<EmptyData>; extern template class FuncDataT<EmptyData>; extern template class IRDataT<EmptyData>; extern template class ChangeReporter<IRDataT<EmptyData>>; extern template class TextChangeReporter<IRDataT<EmptyData>>; extern template class IRComparer<EmptyData>; } // namespace llvm #endif