LCOV - code coverage report
Current view: top level - include/llvm/IR - OptBisect.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 1 8 12.5 %
Date: 2018-10-20 13:21:21 Functions: 1 10 10.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- llvm/IR/OptBisect.h - LLVM Bisect support ----------------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : ///
      10             : /// \file
      11             : /// This file declares the interface for bisecting optimizations.
      12             : ///
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #ifndef LLVM_IR_OPTBISECT_H
      16             : #define LLVM_IR_OPTBISECT_H
      17             : 
      18             : #include "llvm/ADT/StringRef.h"
      19             : 
      20             : namespace llvm {
      21             : 
      22             : class Pass;
      23             : class Module;
      24             : class Function;
      25             : class BasicBlock;
      26             : class Region;
      27             : class Loop;
      28             : class CallGraphSCC;
      29             : 
      30             : /// Extensions to this class implement mechanisms to disable passes and
      31             : /// individual optimizations at compile time.
      32             : class OptPassGate {
      33             : public:
      34           0 :   virtual ~OptPassGate() = default;
      35             : 
      36           0 :   virtual bool shouldRunPass(const Pass *P, const Module &U) { return true; }
      37           0 :   virtual bool shouldRunPass(const Pass *P, const Function &U)  {return true; }
      38           0 :   virtual bool shouldRunPass(const Pass *P, const BasicBlock &U)  { return true; }
      39           0 :   virtual bool shouldRunPass(const Pass *P, const Region &U)  { return true; }
      40           0 :   virtual bool shouldRunPass(const Pass *P, const Loop &U)  { return true; }
      41           0 :   virtual bool shouldRunPass(const Pass *P, const CallGraphSCC &U)  { return true; }
      42             : };
      43             : 
      44             : /// This class implements a mechanism to disable passes and individual
      45             : /// optimizations at compile time based on a command line option
      46             : /// (-opt-bisect-limit) in order to perform a bisecting search for
      47             : /// optimization-related problems.
      48             : class OptBisect : public OptPassGate {
      49             : public:
      50             :   /// Default constructor, initializes the OptBisect state based on the
      51             :   /// -opt-bisect-limit command line argument.
      52             :   ///
      53             :   /// By default, bisection is disabled.
      54             :   ///
      55             :   /// Clients should not instantiate this class directly.  All access should go
      56             :   /// through LLVMContext.
      57             :   OptBisect();
      58             : 
      59       33108 :   virtual ~OptBisect() = default;
      60             : 
      61             :   /// Checks the bisect limit to determine if the specified pass should run.
      62             :   ///
      63             :   /// These functions immediately return true if bisection is disabled. If the
      64             :   /// bisect limit is set to -1, the functions print a message describing
      65             :   /// the pass and the bisect number assigned to it and return true.  Otherwise,
      66             :   /// the functions print a message with the bisect number assigned to the
      67             :   /// pass and indicating whether or not the pass will be run and return true if
      68             :   /// the bisect limit has not yet been exceeded or false if it has.
      69             :   ///
      70             :   /// Most passes should not call these routines directly. Instead, they are
      71             :   /// called through helper routines provided by the pass base classes.  For
      72             :   /// instance, function passes should call FunctionPass::skipFunction().
      73             :   bool shouldRunPass(const Pass *P, const Module &U) override;
      74             :   bool shouldRunPass(const Pass *P, const Function &U) override;
      75             :   bool shouldRunPass(const Pass *P, const BasicBlock &U) override;
      76             :   bool shouldRunPass(const Pass *P, const Region &U) override;
      77             :   bool shouldRunPass(const Pass *P, const Loop &U) override;
      78             :   bool shouldRunPass(const Pass *P, const CallGraphSCC &U) override;
      79             : 
      80             : private:
      81             :   bool checkPass(const StringRef PassName, const StringRef TargetDesc);
      82             : 
      83             :   bool BisectEnabled = false;
      84             :   unsigned LastBisectNum = 0;
      85             : };
      86             : 
      87             : } // end namespace llvm
      88             : 
      89             : #endif // LLVM_IR_OPTBISECT_H

Generated by: LCOV version 1.13