Remove a ton of extraneous #includes
[oota-llvm.git] / include / llvm / iTerminators.h
1 //===-- llvm/iTerminators.h - Termintator instruction nodes -----*- C++ -*-===//
2 //
3 // This file contains the declarations for all the subclasses of the Instruction
4 // class which represent "terminator" instructions.  Terminator instructions are
5 // the only instructions allowed and required to terminate a BasicBlock.
6 //
7 //===----------------------------------------------------------------------===//
8
9 #ifndef LLVM_ITERMINATORS_H
10 #define LLVM_ITERMINATORS_H
11
12 #include "llvm/InstrTypes.h"
13
14 //===---------------------------------------------------------------------------
15 // ReturnInst - Return a value (possibly void), from a function.  Execution does
16 //              not continue in this function any longer.
17 //
18 class ReturnInst : public TerminatorInst {
19   ReturnInst(const ReturnInst &RI) : TerminatorInst(Instruction::Ret) {
20     if (RI.Operands.size()) {
21       assert(RI.Operands.size() == 1 && "Return insn can only have 1 operand!");
22       Operands.reserve(1);
23       Operands.push_back(Use(RI.Operands[0], this));
24     }
25   }
26 public:
27   ReturnInst(Value *RetVal = 0, Instruction *InsertBefore = 0)
28     : TerminatorInst(Instruction::Ret, InsertBefore) {
29     if (RetVal) {
30       Operands.reserve(1);
31       Operands.push_back(Use(RetVal, this));
32     }
33   }
34
35   virtual Instruction *clone() const { return new ReturnInst(*this); }
36
37   inline const Value *getReturnValue() const {
38     return Operands.size() ? Operands[0].get() : 0; 
39   }
40   inline       Value *getReturnValue()       {
41     return Operands.size() ? Operands[0].get() : 0;
42   }
43
44   virtual const BasicBlock *getSuccessor(unsigned idx) const {
45     assert(0 && "ReturnInst has no successors!");
46     abort();
47     return 0;
48   }
49   virtual void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
50     assert(0 && "ReturnInst has no successors!");
51   }
52   virtual unsigned getNumSuccessors() const { return 0; }
53
54   // Methods for support type inquiry through isa, cast, and dyn_cast:
55   static inline bool classof(const ReturnInst *) { return true; }
56   static inline bool classof(const Instruction *I) {
57     return (I->getOpcode() == Instruction::Ret);
58   }
59   static inline bool classof(const Value *V) {
60     return isa<Instruction>(V) && classof(cast<Instruction>(V));
61   }
62 };
63
64
65 //===---------------------------------------------------------------------------
66 // BranchInst - Conditional or Unconditional Branch instruction.
67 //
68 class BranchInst : public TerminatorInst {
69   BranchInst(const BranchInst &BI);
70 public:
71   // If cond = null, then is an unconditional br...
72   BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *cond = 0,
73              Instruction *InsertBefore = 0);
74   BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0);
75
76   virtual Instruction *clone() const { return new BranchInst(*this); }
77
78   inline bool isUnconditional() const { return Operands.size() == 1; }
79   inline bool isConditional()   const { return Operands.size() == 3; }
80
81   inline Value *getCondition() const {
82     return isUnconditional() ? 0 : (Value*)Operands[2].get();
83   }
84
85   void setCondition(Value *V) {
86     assert(isConditional() && "Cannot set condition of unconditional branch!");
87     setOperand(2, V);
88   }
89
90   // setUnconditionalDest - Change the current branch to an unconditional branch
91   // targeting the specified block.
92   //
93   void setUnconditionalDest(BasicBlock *Dest) {
94     if (isConditional()) Operands.erase(Operands.begin()+1, Operands.end());
95     Operands[0] = (Value*)Dest;
96   }
97
98   virtual const BasicBlock *getSuccessor(unsigned i) const {
99     assert(i < getNumSuccessors() && "Successor # out of range for Branch!");
100     return (i == 0) ? cast<BasicBlock>(Operands[0].get()) : 
101                       cast<BasicBlock>(Operands[1].get());
102   }
103   inline BasicBlock *getSuccessor(unsigned idx) {
104     return (BasicBlock*)((const BranchInst *)this)->getSuccessor(idx);
105   }
106
107   virtual void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
108     assert(idx < getNumSuccessors() && "Successor # out of range for Branch!");
109     Operands[idx] = (Value*)NewSucc;
110   }
111
112   virtual unsigned getNumSuccessors() const { return 1+isConditional(); }
113
114   // Methods for support type inquiry through isa, cast, and dyn_cast:
115   static inline bool classof(const BranchInst *) { return true; }
116   static inline bool classof(const Instruction *I) {
117     return (I->getOpcode() == Instruction::Br);
118   }
119   static inline bool classof(const Value *V) {
120     return isa<Instruction>(V) && classof(cast<Instruction>(V));
121   }
122 };
123
124
125 //===---------------------------------------------------------------------------
126 // SwitchInst - Multiway switch
127 //
128 class SwitchInst : public TerminatorInst {
129   // Operand[0]    = Value to switch on
130   // Operand[1]    = Default basic block destination
131   // Operand[2n  ] = Value to match
132   // Operand[2n+1] = BasicBlock to go to on match
133   SwitchInst(const SwitchInst &RI);
134 public:
135   SwitchInst(Value *Value, BasicBlock *Default, Instruction *InsertBefore = 0);
136
137   virtual Instruction *clone() const { return new SwitchInst(*this); }
138
139   // Accessor Methods for Switch stmt
140   //
141   inline const Value *getCondition() const { return Operands[0]; }
142   inline       Value *getCondition()       { return Operands[0]; }
143   inline const BasicBlock *getDefaultDest() const {
144     return cast<BasicBlock>(Operands[1].get());
145   }
146   inline       BasicBlock *getDefaultDest()       {
147     return cast<BasicBlock>(Operands[1].get());
148   }
149
150   void dest_push_back(Constant *OnVal, BasicBlock *Dest);
151
152   virtual const BasicBlock *getSuccessor(unsigned idx) const {
153     assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!");
154     return cast<BasicBlock>(Operands[idx*2+1].get());
155   }
156   inline BasicBlock *getSuccessor(unsigned idx) {
157     assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!");
158     return cast<BasicBlock>(Operands[idx*2+1].get());
159   }
160
161   virtual void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
162     assert(idx < getNumSuccessors() && "Successor # out of range for switch!");
163     Operands[idx*2+1] = (Value*)NewSucc;
164   }
165
166   // getSuccessorValue - Return the value associated with the specified
167   // successor.
168   inline const Constant *getSuccessorValue(unsigned idx) const {
169     assert(idx < getNumSuccessors() && "Successor # out of range!");
170     return cast<Constant>(Operands[idx*2].get());
171   }
172   inline Constant *getSuccessorValue(unsigned idx) {
173     assert(idx < getNumSuccessors() && "Successor # out of range!");
174     return cast<Constant>(Operands[idx*2].get());
175   }
176   virtual unsigned getNumSuccessors() const { return Operands.size()/2; }
177
178   // Methods for support type inquiry through isa, cast, and dyn_cast:
179   static inline bool classof(const SwitchInst *) { return true; }
180   static inline bool classof(const Instruction *I) {
181     return (I->getOpcode() == Instruction::Switch);
182   }
183   static inline bool classof(const Value *V) {
184     return isa<Instruction>(V) && classof(cast<Instruction>(V));
185   }
186 };
187
188
189 //===---------------------------------------------------------------------------
190 // InvokeInst - Invoke instruction
191 //
192 class InvokeInst : public TerminatorInst {
193   InvokeInst(const InvokeInst &BI);
194 public:
195   InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
196              const std::vector<Value*> &Params, const std::string &Name = "",
197              Instruction *InsertBefore = 0);
198
199   virtual Instruction *clone() const { return new InvokeInst(*this); }
200
201   bool mayWriteToMemory() const { return true; }
202
203   // getCalledFunction - Return the function called, or null if this is an
204   // indirect function invocation...
205   //
206   inline const Function *getCalledFunction() const {
207     return dyn_cast<Function>(Operands[0].get());
208   }
209   inline Function *getCalledFunction() {
210     return dyn_cast<Function>(Operands[0].get());
211   }
212
213   // getCalledValue - Get a pointer to a function that is invoked by this inst.
214   inline const Value *getCalledValue() const { return Operands[0]; }
215   inline       Value *getCalledValue()       { return Operands[0]; }
216
217   // get*Dest - Return the destination basic blocks...
218   inline const BasicBlock *getNormalDest() const {
219     return cast<BasicBlock>(Operands[1].get());
220   }
221   inline       BasicBlock *getNormalDest() {
222     return cast<BasicBlock>(Operands[1].get());
223   }
224   inline const BasicBlock *getExceptionalDest() const {
225     return cast<BasicBlock>(Operands[2].get());
226   }
227   inline       BasicBlock *getExceptionalDest() {
228     return cast<BasicBlock>(Operands[2].get());
229   }
230
231   inline void setNormalDest(BasicBlock *B){
232     Operands[1] = (Value*)B;
233   }
234
235   inline void setExceptionalDest(BasicBlock *B){
236     Operands[2] = (Value*)B;
237   }
238
239   virtual const BasicBlock *getSuccessor(unsigned i) const {
240     assert(i < 2 && "Successor # out of range for invoke!");
241     return i == 0 ? getNormalDest() : getExceptionalDest();
242   }
243   inline BasicBlock *getSuccessor(unsigned i) {
244     assert(i < 2 && "Successor # out of range for invoke!");
245     return i == 0 ? getNormalDest() : getExceptionalDest();
246   }
247
248   virtual void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
249     assert(idx < 2 && "Successor # out of range for invoke!");
250     Operands[idx+1] = (Value*)NewSucc;
251   }
252
253   virtual unsigned getNumSuccessors() const { return 2; }
254
255   // Methods for support type inquiry through isa, cast, and dyn_cast:
256   static inline bool classof(const InvokeInst *) { return true; }
257   static inline bool classof(const Instruction *I) {
258     return (I->getOpcode() == Instruction::Invoke);
259   }
260   static inline bool classof(const Value *V) {
261     return isa<Instruction>(V) && classof(cast<Instruction>(V));
262   }
263 };
264
265 #endif