//===- llvm/DefaultPasses.h - Default Pass Support code --------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// This file defines the infrastructure for registering the standard pass list.
// This defines sets of standard optimizations that plugins can modify and
// front ends can use.
//===----------------------------------------------------------------------===//

#ifndef LLVM_DEFAULT_PASS_SUPPORT_H
#define LLVM_DEFAULT_PASS_SUPPORT_H

namespace llvm {

class PassManagerBase;

/// Unique identifiers for the default standard passes.  The addresses of
/// these symbols are used to uniquely identify passes from the default list.
namespace DefaultStandardPasses {
extern unsigned char AggressiveDCEID;
extern unsigned char ArgumentPromotionID;
extern unsigned char BasicAliasAnalysisID;
extern unsigned char CFGSimplificationID;
extern unsigned char ConstantMergeID;
extern unsigned char CorrelatedValuePropagationID;
extern unsigned char DeadArgEliminationID;
extern unsigned char DeadStoreEliminationID;
extern unsigned char EarlyCSEID;
extern unsigned char FunctionAttrsID;
extern unsigned char FunctionInliningID;
extern unsigned char GVNID;
extern unsigned char GlobalDCEID;
extern unsigned char GlobalOptimizerID;
extern unsigned char GlobalsModRefID;
extern unsigned char IPSCCPID;
extern unsigned char IndVarSimplifyID;
extern unsigned char InlinerPlaceholderID;
extern unsigned char InstructionCombiningID;
extern unsigned char JumpThreadingID;
extern unsigned char LICMID;
extern unsigned char LoopDeletionID;
extern unsigned char LoopIdiomID;
extern unsigned char LoopRotateID;
extern unsigned char LoopUnrollID;
extern unsigned char LoopUnswitchID;
extern unsigned char MemCpyOptID;
extern unsigned char PruneEHID;
extern unsigned char ReassociateID;
extern unsigned char SCCPID;
extern unsigned char ScalarReplAggregatesID;
extern unsigned char SimplifyLibCallsID;
extern unsigned char StripDeadPrototypesID;
extern unsigned char TailCallEliminationID;
extern unsigned char TypeBasedAliasAnalysisID;
}

/// StandardPass - The class responsible for maintaining the lists of standard 
class StandardPass {
  friend class RegisterStandardPassLists;
  public:
  /// Predefined standard sets of passes
  enum StandardSet {
    AliasAnalysis,
    Function,
    Module,
    LTO
  };
  /// Flags to specify whether a pass should be enabled.  Passes registered
  /// with the standard sets may specify a minimum optimization level and one
  /// or more flags that must be set when constructing the set for the pass to
  /// be used.
  enum OptimizationFlags {
    /// Optimize for size was requested.
    OptimizeSize = 1<<0,
    /// Allow passes which may make global module changes.
    UnitAtATime = 1<<1,
    /// UnrollLoops - Allow loop unrolling.
    UnrollLoops = 1<<2,
    /// Allow library calls to be simplified.
    SimplifyLibCalls = 1<<3,
    /// Whether the module may have code using exceptions.
    HaveExceptions = 1<<4,
    // Run an inliner pass as part of this set.
    RunInliner = 1<<5
  };
  enum OptimizationFlagComponents {
    /// The low bits are used to store the optimization level.  When requesting
    /// passes, this should store the requested optimisation level.  When
    /// setting passes, this should set the minimum optimization level at which
    /// the pass will run.
    OptimizationLevelMask=0xf,
    /// The maximum optimisation level at which the pass is run.
    MaxOptimizationLevelMask=0xf0,
    // Flags that must be set
    RequiredFlagMask=0xff00,
    // Flags that may not be set.
    DisallowedFlagMask=0xff0000,
    MaxOptimizationLevelShift=4,
    RequiredFlagShift=8,
    DisallowedFlagShift=16
  };
  /// Returns the optimisation level from a set of flags.
  static unsigned OptimizationLevel(unsigned flags) {
      return flags & OptimizationLevelMask;
  }
  /// Returns the maximum optimization level for this set of flags
  static unsigned MaxOptimizationLevel(unsigned flags) {
      return (flags & MaxOptimizationLevelMask) >> 4;
  }
  /// Constructs a set of flags from the specified minimum and maximum
  /// optimisation level
  static unsigned OptimzationFlags(unsigned minLevel=0, unsigned maxLevel=0xf,
      unsigned requiredFlags=0, unsigned disallowedFlags=0) {
    return ((minLevel & OptimizationLevelMask) |
            ((maxLevel<<MaxOptimizationLevelShift) & MaxOptimizationLevelMask)
            | ((requiredFlags<<RequiredFlagShift) & RequiredFlagMask)
            | ((disallowedFlags<<DisallowedFlagShift) & DisallowedFlagMask));
  }
  /// Returns the flags that must be set for this to match
  static unsigned RequiredFlags(unsigned flags) {
      return (flags & RequiredFlagMask) >> RequiredFlagShift;
  }
  /// Returns the flags that must not be set for this to match
  static unsigned DisallowedFlags(unsigned flags) {
      return (flags & DisallowedFlagMask) >> DisallowedFlagShift;
  }
  /// Register a standard pass in the specified set.  If flags is non-zero,
  /// then the pass will only be returned when the specified flags are set.
  template<typename passName>
  class RegisterStandardPass {
    public:
    RegisterStandardPass(StandardSet set, unsigned char *runBefore=0,
        unsigned flags=0, unsigned char *ID=0) {
      // Use the pass's ID if one is not specified
      RegisterDefaultPass(PassInfo::NormalCtor_t(callDefaultCtor<passName>),
               ID ? ID : (unsigned char*)&passName::ID, runBefore, set, flags);
    }
  };
  /// Adds the passes from the specified set to the provided pass manager
  static void AddPassesFromSet(PassManagerBase *PM,
                               StandardSet set,
                               unsigned flags=0,
                               bool VerifyEach=false,
                               Pass *inliner=0);
  private:
  /// Registers the default passes.  This is set by RegisterStandardPassLists
  /// and is called lazily.
  static void (*RegisterDefaultPasses)(void);
  /// Creates the verifier pass that is inserted when a VerifyEach is passed to
  /// AddPassesFromSet()
  static Pass* (*CreateVerifierPass)(void);
  /// Registers the pass
  static void RegisterDefaultPass(PassInfo::NormalCtor_t constructor,
                                  unsigned char *newPass,
                                  unsigned char *oldPass,
                                  StandardSet set,
                                  unsigned flags=0);
};

} // namespace llvm

#endif
