Add support for newer cleaner isa, cast, dyn_cast
[oota-llvm.git] / include / llvm / Instruction.h
1 //===-- llvm/Instruction.h - Instruction class definition --------*- C++ -*--=//
2 //
3 // This file contains the declaration of the Instruction class, which is the
4 // base class for all of the VM instructions.
5 //
6 //===----------------------------------------------------------------------===//
7
8 #ifndef LLVM_INSTRUCTION_H
9 #define LLVM_INSTRUCTION_H
10
11 #include "llvm/User.h"
12
13 class Type;
14 class BasicBlock;
15 class Method;
16 class MachineInstr;
17 class MachineCodeForVMInstr;
18
19 class Instruction : public User {
20   BasicBlock *Parent;
21   unsigned iType;      // InstructionType
22
23   MachineCodeForVMInstr* machineInstrVec;
24   friend class ValueHolder<Instruction,BasicBlock,Method>;
25   inline void setParent(BasicBlock *P) { Parent = P; }
26
27 public:
28   Instruction(const Type *Ty, unsigned iType, const string &Name = "");
29   virtual ~Instruction();  // Virtual dtor == good.
30
31   // Specialize setName to handle symbol table majik...
32   virtual void setName(const string &name, SymbolTable *ST = 0);
33   
34   // clone() - Create a copy of 'this' instruction that is identical in all ways
35   // except the following:
36   //   * The instruction has no parent
37   //   * The instruction has no name
38   //
39   virtual Instruction *clone() const = 0;
40   
41   // Accessor methods...
42   //
43   inline const BasicBlock *getParent() const { return Parent; }
44   inline       BasicBlock *getParent()       { return Parent; }
45   virtual bool hasSideEffects() const { return false; }  // Memory & Call insts
46
47   // ---------------------------------------------------------------------------
48   // Machine code accessors...
49   //
50   inline MachineCodeForVMInstr &getMachineInstrVec() const {
51     return *machineInstrVec; 
52   }
53   
54   // Add a machine instruction used to implement this instruction
55   //
56   void addMachineInstruction(MachineInstr* minstr);
57   
58   // ---------------------------------------------------------------------------
59   // Subclass classification... getInstType() returns a member of 
60   // one of the enums that is coming soon (down below)...
61   //
62   virtual const char *getOpcodeName() const = 0;
63   unsigned getOpcode() const { return iType; }
64
65   // getInstType is deprecated, use getOpcode() instead.
66   unsigned getInstType() const { return iType; }
67
68   inline bool isTerminator() const {   // Instance of TerminatorInst?
69     return iType >= FirstTermOp && iType < NumTermOps; 
70   }
71   inline bool isDefinition() const { return !isTerminator(); }
72   inline bool isUnaryOp() const {
73     return iType >= FirstUnaryOp && iType < NumUnaryOps;
74   }
75   inline bool isBinaryOp() const {
76     return iType >= FirstBinaryOp && iType < NumBinaryOps;
77   }
78
79   // isPHINode() - This is used frequently enough to allow it to exist
80   inline bool isPHINode() const { return iType == PHINode; }
81
82   // dropAllReferences() - This function is in charge of "letting go" of all
83   // objects that this Instruction refers to.  This first lets go of all
84   // references to hidden values generated code for this instruction,
85   // and then drops all references to its operands.
86   // 
87   void dropAllReferences();
88
89
90   // Methods for support type inquiry through isa, cast, and dyn_cast:
91   static inline bool isa(const Instruction *I) { return true; }
92   static inline bool isa(const Value *V) {
93     return V->getValueType() == Value::InstructionVal;
94   }
95   
96   //----------------------------------------------------------------------
97   // Exported enumerations...
98   //
99   enum TermOps {       // These terminate basic blocks
100     FirstTermOp = 1,
101     Ret = 1, Br, Switch, 
102     NumTermOps         // Must remain at end of enum
103   };
104
105   enum UnaryOps {
106     FirstUnaryOp = NumTermOps,
107     Not          = NumTermOps,      // Binary inverse
108
109     NumUnaryOps        // Must remain at end of enum
110   };
111
112   enum BinaryOps {
113     // Standard binary operators...
114     FirstBinaryOp = NumUnaryOps,
115     Add = NumUnaryOps, Sub, Mul, Div, Rem,
116
117     // Logical operators...
118     And, Or, Xor,
119
120     // Binary comparison operators...
121     SetEQ, SetNE, SetLE, SetGE, SetLT, SetGT,
122
123     NumBinaryOps
124   };
125
126   enum MemoryOps {
127     FirstMemoryOp = NumBinaryOps,
128     Malloc = NumBinaryOps, Free,     // Heap management instructions
129     Alloca,                          // Stack management instruction
130
131     Load, Store,                     // Memory manipulation instructions.
132     GetElementPtr,                   // Get addr of Structure or Array element
133
134     NumMemoryOps
135   };
136
137   enum OtherOps {
138     FirstOtherOp = NumMemoryOps,
139     PHINode      = NumMemoryOps,     // PHI node instruction
140     Cast,                            // Type cast...
141     Call,                            // Call a function
142
143     Shl, Shr,                        // Shift operations...
144
145     NumOps,                          // Must be the last 'op' defined.
146     UserOp1, UserOp2                 // May be used internally to a pass...
147   };
148 };
149
150 #endif