1c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//===- llvm/PassInfo.h - Pass Info class ------------------------*- C++ -*-===// 2c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// 3c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// The LLVM Compiler Infrastructure 4c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// 5c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// This file is distributed under the University of Illinois Open Source 6c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// License. See LICENSE.TXT for details. 7c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// 8c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//===----------------------------------------------------------------------===// 9c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// 10c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// This file defines and implements the PassInfo class. 11c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// 12c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//===----------------------------------------------------------------------===// 13c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#ifndef LLVM_PASSINFO_H 14c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#define LLVM_PASSINFO_H 15c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 16c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <cassert> 17c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <vector> 18c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 19c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesnamespace llvm { 20c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 21c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesclass Pass; 22c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesclass TargetMachine; 23c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 24c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//===--------------------------------------------------------------------------- 25c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/// PassInfo class - An instance of this class exists for every pass known by 26c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/// the system, and can be obtained from a live Pass by calling its 27c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/// getPassInfo() method. These objects are set up by the RegisterPass<> 28c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/// template. 29c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/// 30c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesclass PassInfo { 31c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinespublic: 32c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines typedef Pass* (*NormalCtor_t)(); 33c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines typedef Pass *(*TargetMachineCtor_t)(TargetMachine *); 34c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 35c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesprivate: 36c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const char *const PassName; // Nice name for Pass 37c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const char *const PassArgument; // Command Line argument to run this pass 38c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const void *PassID; 39c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const bool IsCFGOnlyPass; // Pass only looks at the CFG. 40c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const bool IsAnalysis; // True if an analysis pass. 41c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const bool IsAnalysisGroup; // True if an analysis group. 42c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass 43c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 44c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines NormalCtor_t NormalCtor; 45c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetMachineCtor_t TargetMachineCtor; 46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 47c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinespublic: 48c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// PassInfo ctor - Do not call this directly, this should only be invoked 49c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// through RegisterPass. 50c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines PassInfo(const char *name, const char *arg, const void *pi, 51c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines NormalCtor_t normal, bool isCFGOnly, bool is_analysis, 52c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetMachineCtor_t machine = nullptr) 53c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines : PassName(name), PassArgument(arg), PassID(pi), 54c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines IsCFGOnlyPass(isCFGOnly), 55c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal), 56c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetMachineCtor(machine) {} 57c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// PassInfo ctor - Do not call this directly, this should only be invoked 58c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// through RegisterPass. This version is for use by analysis groups; it 59c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// does not auto-register the pass. 60c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines PassInfo(const char *name, const void *pi) 61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines : PassName(name), PassArgument(""), PassID(pi), 62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines IsCFGOnlyPass(false), 63c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(nullptr), 64c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetMachineCtor(nullptr) {} 65c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 66c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getPassName - Return the friendly name for the pass, never returns null 67c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 68c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const char *getPassName() const { return PassName; } 69c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 70c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getPassArgument - Return the command line option that may be passed to 71c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 'opt' that will cause this pass to be run. This will return null if there 72c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// is no argument. 73c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 74c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const char *getPassArgument() const { return PassArgument; } 75c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 76c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getTypeInfo - Return the id object for the pass... 77c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// TODO : Rename 78c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const void *getTypeInfo() const { return PassID; } 79c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 80c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// Return true if this PassID implements the specified ID pointer. 81c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool isPassID(const void *IDPtr) const { 82c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return PassID == IDPtr; 83c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 84c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 85c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// isAnalysisGroup - Return true if this is an analysis group, not a normal 86c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// pass. 87c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 88c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool isAnalysisGroup() const { return IsAnalysisGroup; } 89c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool isAnalysis() const { return IsAnalysis; } 90c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 91c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// isCFGOnlyPass - return true if this pass only looks at the CFG for the 92c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// function. 93c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool isCFGOnlyPass() const { return IsCFGOnlyPass; } 94c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 95c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getNormalCtor - Return a pointer to a function, that when called, creates 96c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// an instance of the pass and returns it. This pointer may be null if there 97c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// is no default constructor for the pass. 98c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 99c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines NormalCtor_t getNormalCtor() const { 100c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return NormalCtor; 101c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 102c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void setNormalCtor(NormalCtor_t Ctor) { 103c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines NormalCtor = Ctor; 104c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 105c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 106c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getTargetMachineCtor - Return a pointer to a function, that when called 107c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// with a TargetMachine, creates an instance of the pass and returns it. 108c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// This pointer may be null if there is no constructor with a TargetMachine 109c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// for the pass. 110c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 111c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetMachineCtor_t getTargetMachineCtor() const { return TargetMachineCtor; } 112c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void setTargetMachineCtor(TargetMachineCtor_t Ctor) { 113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetMachineCtor = Ctor; 114c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 115c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 116c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// createPass() - Use this method to create an instance of this pass. 117c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Pass *createPass() const { 118c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines assert((!isAnalysisGroup() || NormalCtor) && 119c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "No default implementation found for analysis group!"); 120c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines assert(NormalCtor && 121c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "Cannot call createPass on PassInfo without default ctor!"); 122c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return NormalCtor(); 123c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 124c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 125c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// addInterfaceImplemented - This method is called when this pass is 126c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// registered as a member of an analysis group with the RegisterAnalysisGroup 127c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// template. 128c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 129c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void addInterfaceImplemented(const PassInfo *ItfPI) { 130c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ItfImpl.push_back(ItfPI); 131c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 132c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 133c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getInterfacesImplemented - Return a list of all of the analysis group 134c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// interfaces implemented by this pass. 135c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// 136c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const std::vector<const PassInfo*> &getInterfacesImplemented() const { 137c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return ItfImpl; 138c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 139c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 140c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesprivate: 141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void operator=(const PassInfo &) = delete; 142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PassInfo(const PassInfo &) = delete; 143c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}; 144c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 145c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines} 146c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 147c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#endif 148