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