Add permissions(), map_file_pages(), and unmap_file_pages() to llvm::sys::fs and...
[oota-llvm.git] / include / llvm / Support / InstVisitor.h
1 //===- llvm/Support/InstVisitor.h - Define instruction visitors -*- 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
11 #ifndef LLVM_SUPPORT_INSTVISITOR_H
12 #define LLVM_SUPPORT_INSTVISITOR_H
13
14 #include "llvm/Function.h"
15 #include "llvm/Instructions.h"
16 #include "llvm/Module.h"
17 #include "llvm/Support/CallSite.h"
18 #include "llvm/Support/ErrorHandling.h"
19
20 namespace llvm {
21
22 // We operate on opaque instruction classes, so forward declare all instruction
23 // types now...
24 //
25 #define HANDLE_INST(NUM, OPCODE, CLASS)   class CLASS;
26 #include "llvm/Instruction.def"
27
28 #define DELEGATE(CLASS_TO_VISIT) \
29   return static_cast<SubClass*>(this)-> \
30                visit##CLASS_TO_VISIT(static_cast<CLASS_TO_VISIT&>(I))
31
32
33 /// @brief Base class for instruction visitors
34 ///
35 /// Instruction visitors are used when you want to perform different actions
36 /// for different kinds of instructions without having to use lots of casts
37 /// and a big switch statement (in your code, that is).
38 ///
39 /// To define your own visitor, inherit from this class, specifying your
40 /// new type for the 'SubClass' template parameter, and "override" visitXXX
41 /// functions in your class. I say "override" because this class is defined
42 /// in terms of statically resolved overloading, not virtual functions.
43 ///
44 /// For example, here is a visitor that counts the number of malloc
45 /// instructions processed:
46 ///
47 ///  /// Declare the class.  Note that we derive from InstVisitor instantiated
48 ///  /// with _our new subclasses_ type.
49 ///  ///
50 ///  struct CountAllocaVisitor : public InstVisitor<CountAllocaVisitor> {
51 ///    unsigned Count;
52 ///    CountAllocaVisitor() : Count(0) {}
53 ///
54 ///    void visitAllocaInst(AllocaInst &AI) { ++Count; }
55 ///  };
56 ///
57 ///  And this class would be used like this:
58 ///    CountAllocaVisitor CAV;
59 ///    CAV.visit(function);
60 ///    NumAllocas = CAV.Count;
61 ///
62 /// The defined has 'visit' methods for Instruction, and also for BasicBlock,
63 /// Function, and Module, which recursively process all contained instructions.
64 ///
65 /// Note that if you don't implement visitXXX for some instruction type,
66 /// the visitXXX method for instruction superclass will be invoked. So
67 /// if instructions are added in the future, they will be automatically
68 /// supported, if you handle one of their superclasses.
69 ///
70 /// The optional second template argument specifies the type that instruction
71 /// visitation functions should return. If you specify this, you *MUST* provide
72 /// an implementation of visitInstruction though!.
73 ///
74 /// Note that this class is specifically designed as a template to avoid
75 /// virtual function call overhead.  Defining and using an InstVisitor is just
76 /// as efficient as having your own switch statement over the instruction
77 /// opcode.
78 template<typename SubClass, typename RetTy=void>
79 class InstVisitor {
80   //===--------------------------------------------------------------------===//
81   // Interface code - This is the public interface of the InstVisitor that you
82   // use to visit instructions...
83   //
84
85 public:
86   // Generic visit method - Allow visitation to all instructions in a range
87   template<class Iterator>
88   void visit(Iterator Start, Iterator End) {
89     while (Start != End)
90       static_cast<SubClass*>(this)->visit(*Start++);
91   }
92
93   // Define visitors for functions and basic blocks...
94   //
95   void visit(Module &M) {
96     static_cast<SubClass*>(this)->visitModule(M);
97     visit(M.begin(), M.end());
98   }
99   void visit(Function &F) {
100     static_cast<SubClass*>(this)->visitFunction(F);
101     visit(F.begin(), F.end());
102   }
103   void visit(BasicBlock &BB) {
104     static_cast<SubClass*>(this)->visitBasicBlock(BB);
105     visit(BB.begin(), BB.end());
106   }
107
108   // Forwarding functions so that the user can visit with pointers AND refs.
109   void visit(Module       *M)  { visit(*M); }
110   void visit(Function     *F)  { visit(*F); }
111   void visit(BasicBlock   *BB) { visit(*BB); }
112   RetTy visit(Instruction *I)  { return visit(*I); }
113
114   // visit - Finally, code to visit an instruction...
115   //
116   RetTy visit(Instruction &I) {
117     switch (I.getOpcode()) {
118     default: llvm_unreachable("Unknown instruction type encountered!");
119       // Build the switch statement using the Instruction.def file...
120 #define HANDLE_INST(NUM, OPCODE, CLASS) \
121     case Instruction::OPCODE: return \
122            static_cast<SubClass*>(this)-> \
123                       visit##OPCODE(static_cast<CLASS&>(I));
124 #include "llvm/Instruction.def"
125     }
126   }
127
128   //===--------------------------------------------------------------------===//
129   // Visitation functions... these functions provide default fallbacks in case
130   // the user does not specify what to do for a particular instruction type.
131   // The default behavior is to generalize the instruction type to its subtype
132   // and try visiting the subtype.  All of this should be inlined perfectly,
133   // because there are no virtual functions to get in the way.
134   //
135
136   // When visiting a module, function or basic block directly, these methods get
137   // called to indicate when transitioning into a new unit.
138   //
139   void visitModule    (Module &M) {}
140   void visitFunction  (Function &F) {}
141   void visitBasicBlock(BasicBlock &BB) {}
142
143   // Define instruction specific visitor functions that can be overridden to
144   // handle SPECIFIC instructions.  These functions automatically define
145   // visitMul to proxy to visitBinaryOperator for instance in case the user does
146   // not need this generality.
147   //
148   // The one problem case we have to handle here though is that the PHINode
149   // class and opcode name are the exact same.  Because of this, we cannot
150   // define visitPHINode (the inst version) to forward to visitPHINode (the
151   // generic version) without multiply defined symbols and recursion.  To handle
152   // this, we do not autoexpand "Other" instructions, we do it manually.
153   //
154 #define HANDLE_INST(NUM, OPCODE, CLASS) \
155     RetTy visit##OPCODE(CLASS &I) { DELEGATE(CLASS); }
156 #include "llvm/Instruction.def"
157
158   // Specific Instruction type classes... note that all of the casts are
159   // necessary because we use the instruction classes as opaque types...
160   //
161   RetTy visitReturnInst(ReturnInst &I)            { DELEGATE(TerminatorInst);}
162   RetTy visitBranchInst(BranchInst &I)            { DELEGATE(TerminatorInst);}
163   RetTy visitSwitchInst(SwitchInst &I)            { DELEGATE(TerminatorInst);}
164   RetTy visitIndirectBrInst(IndirectBrInst &I)    { DELEGATE(TerminatorInst);}
165   RetTy visitResumeInst(ResumeInst &I)            { DELEGATE(TerminatorInst);}
166   RetTy visitUnreachableInst(UnreachableInst &I)  { DELEGATE(TerminatorInst);}
167   RetTy visitICmpInst(ICmpInst &I)                { DELEGATE(CmpInst);}
168   RetTy visitFCmpInst(FCmpInst &I)                { DELEGATE(CmpInst);}
169   RetTy visitAllocaInst(AllocaInst &I)            { DELEGATE(UnaryInstruction);}
170   RetTy visitLoadInst(LoadInst     &I)            { DELEGATE(UnaryInstruction);}
171   RetTy visitStoreInst(StoreInst   &I)            { DELEGATE(Instruction);}
172   RetTy visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) { DELEGATE(Instruction);}
173   RetTy visitAtomicRMWInst(AtomicRMWInst &I)      { DELEGATE(Instruction);}
174   RetTy visitFenceInst(FenceInst   &I)            { DELEGATE(Instruction);}
175   RetTy visitGetElementPtrInst(GetElementPtrInst &I){ DELEGATE(Instruction);}
176   RetTy visitPHINode(PHINode       &I)            { DELEGATE(Instruction);}
177   RetTy visitTruncInst(TruncInst &I)              { DELEGATE(CastInst);}
178   RetTy visitZExtInst(ZExtInst &I)                { DELEGATE(CastInst);}
179   RetTy visitSExtInst(SExtInst &I)                { DELEGATE(CastInst);}
180   RetTy visitFPTruncInst(FPTruncInst &I)          { DELEGATE(CastInst);}
181   RetTy visitFPExtInst(FPExtInst &I)              { DELEGATE(CastInst);}
182   RetTy visitFPToUIInst(FPToUIInst &I)            { DELEGATE(CastInst);}
183   RetTy visitFPToSIInst(FPToSIInst &I)            { DELEGATE(CastInst);}
184   RetTy visitUIToFPInst(UIToFPInst &I)            { DELEGATE(CastInst);}
185   RetTy visitSIToFPInst(SIToFPInst &I)            { DELEGATE(CastInst);}
186   RetTy visitPtrToIntInst(PtrToIntInst &I)        { DELEGATE(CastInst);}
187   RetTy visitIntToPtrInst(IntToPtrInst &I)        { DELEGATE(CastInst);}
188   RetTy visitBitCastInst(BitCastInst &I)          { DELEGATE(CastInst);}
189   RetTy visitSelectInst(SelectInst &I)            { DELEGATE(Instruction);}
190   RetTy visitVAArgInst(VAArgInst   &I)            { DELEGATE(UnaryInstruction);}
191   RetTy visitExtractElementInst(ExtractElementInst &I) { DELEGATE(Instruction);}
192   RetTy visitInsertElementInst(InsertElementInst &I) { DELEGATE(Instruction);}
193   RetTy visitShuffleVectorInst(ShuffleVectorInst &I) { DELEGATE(Instruction);}
194   RetTy visitExtractValueInst(ExtractValueInst &I){ DELEGATE(UnaryInstruction);}
195   RetTy visitInsertValueInst(InsertValueInst &I)  { DELEGATE(Instruction); }
196   RetTy visitLandingPadInst(LandingPadInst &I)    { DELEGATE(Instruction); }
197
198   // Call and Invoke are slightly different as they delegate first through
199   // a generic CallSite visitor.
200   RetTy visitCallInst(CallInst &I) {
201     return static_cast<SubClass*>(this)->visitCallSite(&I);
202   }
203   RetTy visitInvokeInst(InvokeInst &I) {
204     return static_cast<SubClass*>(this)->visitCallSite(&I);
205   }
206
207   // Next level propagators: If the user does not overload a specific
208   // instruction type, they can overload one of these to get the whole class
209   // of instructions...
210   //
211   RetTy visitCastInst(CastInst &I)                { DELEGATE(UnaryInstruction);}
212   RetTy visitBinaryOperator(BinaryOperator &I)    { DELEGATE(Instruction);}
213   RetTy visitCmpInst(CmpInst &I)                  { DELEGATE(Instruction);}
214   RetTy visitTerminatorInst(TerminatorInst &I)    { DELEGATE(Instruction);}
215   RetTy visitUnaryInstruction(UnaryInstruction &I){ DELEGATE(Instruction);}
216
217   // Provide a special visitor for a 'callsite' that visits both calls and
218   // invokes. When unimplemented, properly delegates to either the terminator or
219   // regular instruction visitor.
220   RetTy visitCallSite(CallSite CS) {
221     assert(CS);
222     Instruction &I = *CS.getInstruction();
223     if (CS.isCall())
224       DELEGATE(Instruction);
225
226     assert(CS.isInvoke());
227     DELEGATE(TerminatorInst);
228   }
229
230   // If the user wants a 'default' case, they can choose to override this
231   // function.  If this function is not overloaded in the user's subclass, then
232   // this instruction just gets ignored.
233   //
234   // Note that you MUST override this function if your return type is not void.
235   //
236   void visitInstruction(Instruction &I) {}  // Ignore unhandled instructions
237 };
238
239 #undef DELEGATE
240
241 } // End llvm namespace
242
243 #endif