More minor reorganizations
[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;             // do not include header file MachineInstr.h
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);
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() {
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   // Exported enumerations...
91   //
92   enum TermOps {       // These terminate basic blocks
93     FirstTermOp = 1,
94     Ret = 1, Br, Switch, 
95     NumTermOps         // Must remain at end of enum
96   };
97
98   enum UnaryOps {
99     FirstUnaryOp = NumTermOps,
100     Not          = NumTermOps,      // Binary inverse
101
102     NumUnaryOps        // Must remain at end of enum
103   };
104
105   enum BinaryOps {
106     // Standard binary operators...
107     FirstBinaryOp = NumUnaryOps,
108     Add = NumUnaryOps, Sub, Mul, Div, Rem,
109
110     // Logical operators...
111     And, Or, Xor,
112
113     // Binary comparison operators...
114     SetEQ, SetNE, SetLE, SetGE, SetLT, SetGT,
115
116     NumBinaryOps
117   };
118
119   enum MemoryOps {
120     FirstMemoryOp = NumBinaryOps,
121     Malloc = NumBinaryOps, Free,     // Heap management instructions
122     Alloca,                          // Stack management instruction
123
124     Load, Store,                     // Memory manipulation instructions.
125     GetElementPtr,                   // Get addr of Structure or Array element
126
127     NumMemoryOps
128   };
129
130   enum OtherOps {
131     FirstOtherOp = NumMemoryOps,
132     PHINode      = NumMemoryOps,     // PHI node instruction
133     Cast,                            // Type cast...
134     Call,                            // Call a function
135
136     Shl, Shr,                        // Shift operations...
137
138     NumOps,                          // Must be the last 'op' defined.
139     UserOp1, UserOp2                 // May be used internally to a pass...
140   };
141 };
142
143 #endif