summaryrefslogtreecommitdiff
path: root/include/llvm/iTerminators.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/iTerminators.h')
-rw-r--r--include/llvm/iTerminators.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/include/llvm/iTerminators.h b/include/llvm/iTerminators.h
new file mode 100644
index 0000000000..0d1cde0d3f
--- /dev/null
+++ b/include/llvm/iTerminators.h
@@ -0,0 +1,136 @@
+//===-- llvm/iTerminators.h - Termintator instruction nodes ------*- C++ -*--=//
+//
+// This file contains the declarations for all the subclasses of the
+// Instruction class, which is itself defined in the Instruction.h file. In
+// between these definitions and the Instruction class are classes that expose
+// the SSA properties of each instruction, and that form the SSA graph.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ITERMINATORS_H
+#define LLVM_ITERMINATORS_H
+
+#include "llvm/InstrTypes.h"
+#include "llvm/BasicBlock.h"
+#include "llvm/ConstPoolVals.h"
+
+//===----------------------------------------------------------------------===//
+// Classes to represent Basic Block "Terminator" instructions
+//===----------------------------------------------------------------------===//
+
+
+//===---------------------------------------------------------------------------
+// ReturnInst - Return a value (possibly void), from a method. Execution does
+// not continue in this method any longer.
+//
+class ReturnInst : public TerminatorInst {
+ Use Val; // Will be null if returning void...
+ ReturnInst(const ReturnInst &RI);
+public:
+ ReturnInst(Value *value = 0);
+ inline ~ReturnInst() { dropAllReferences(); }
+
+ virtual Instruction *clone() const { return new ReturnInst(*this); }
+
+ virtual string getOpcode() const { return "ret"; }
+
+ inline const Value *getReturnValue() const { return Val; }
+ inline Value *getReturnValue() { return Val; }
+
+ virtual void dropAllReferences();
+ virtual const Value *getOperand(unsigned i) const {
+ return (i == 0) ? Val : 0;
+ }
+ inline Value *getOperand(unsigned i) { return (i == 0) ? Val : 0; }
+ virtual bool setOperand(unsigned i, Value *Val);
+ virtual unsigned getNumOperands() const { return Val != 0; }
+
+ // Additionally, they must provide a method to get at the successors of this
+ // terminator instruction. If 'idx' is out of range, a null pointer shall be
+ // returned.
+ //
+ virtual const BasicBlock *getSuccessor(unsigned idx) const { return 0; }
+ virtual unsigned getNumSuccessors() const { return 0; }
+};
+
+
+//===---------------------------------------------------------------------------
+// BranchInst - Conditional or Unconditional Branch instruction.
+//
+class BranchInst : public TerminatorInst {
+ BasicBlockUse TrueDest, FalseDest;
+ Use Condition;
+
+ BranchInst(const BranchInst &BI);
+public:
+ // If cond = null, then is an unconditional br...
+ BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse = 0, Value *cond = 0);
+ inline ~BranchInst() { dropAllReferences(); }
+
+ virtual Instruction *clone() const { return new BranchInst(*this); }
+
+ virtual void dropAllReferences();
+
+ inline bool isUnconditional() const {
+ return Condition == 0 || !FalseDest;
+ }
+
+ virtual string getOpcode() const { return "br"; }
+
+ inline Value *getOperand(unsigned i) {
+ return (Value*)((const BranchInst *)this)->getOperand(i);
+ }
+ virtual const Value *getOperand(unsigned i) const;
+ virtual bool setOperand(unsigned i, Value *Val);
+ virtual unsigned getNumOperands() const { return isUnconditional() ? 1 : 3; }
+
+ // Additionally, they must provide a method to get at the successors of this
+ // terminator instruction. If 'idx' is out of range, a null pointer shall be
+ // returned.
+ //
+ virtual const BasicBlock *getSuccessor(unsigned idx) const;
+ virtual unsigned getNumSuccessors() const { return 1+!isUnconditional(); }
+};
+
+
+//===---------------------------------------------------------------------------
+// SwitchInst - Multiway switch
+//
+class SwitchInst : public TerminatorInst {
+public:
+ typedef pair<ConstPoolUse, BasicBlockUse> dest_value;
+private:
+ BasicBlockUse DefaultDest;
+ Use Val;
+ vector<dest_value> Destinations;
+
+ SwitchInst(const SwitchInst &RI);
+public:
+ typedef vector<dest_value>::iterator dest_iterator;
+ typedef vector<dest_value>::const_iterator dest_const_iterator;
+
+ SwitchInst(Value *Value, BasicBlock *Default);
+ inline ~SwitchInst() { dropAllReferences(); }
+
+ virtual Instruction *clone() const { return new SwitchInst(*this); }
+
+ void dest_push_back(ConstPoolVal *OnVal, BasicBlock *Dest);
+
+ virtual string getOpcode() const { return "switch"; }
+ inline Value *getOperand(unsigned i) {
+ return (Value*)((const SwitchInst*)this)->getOperand(i);
+ }
+ virtual const Value *getOperand(unsigned i) const;
+ virtual bool setOperand(unsigned i, Value *Val);
+ virtual unsigned getNumOperands() const;
+ virtual void dropAllReferences();
+
+ // Additionally, they must provide a method to get at the successors of this
+ // terminator instruction. If 'idx' is out of range, a null pointer shall be
+ // returned.
+ //
+ virtual const BasicBlock *getSuccessor(unsigned idx) const;
+ virtual unsigned getNumSuccessors() const { return 1+Destinations.size(); }
+};
+
+#endif