Load and Store now no longer derive from MemAccessInst. Indexing a load or
[oota-llvm.git] / include / llvm / iMemory.h
1 //===-- llvm/iMemory.h - Memory Operator node definitions --------*- C++ -*--=//
2 //
3 // This file contains the declarations of all of the memory related operators.
4 // This includes: malloc, free, alloca, load, store, getfield, putfield
5 //
6 //===----------------------------------------------------------------------===//
7
8 #ifndef LLVM_IMEMORY_H
9 #define LLVM_IMEMORY_H
10
11 #include "llvm/Instruction.h"
12 class PointerType;
13
14 //===----------------------------------------------------------------------===//
15 //                             AllocationInst Class
16 //===----------------------------------------------------------------------===//
17 //
18 // AllocationInst - This class is the common base class of MallocInst and
19 // AllocaInst.
20 //
21 class AllocationInst : public Instruction {
22 protected:
23   AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, 
24                  const std::string &Name = "");
25 public:
26
27   // isArrayAllocation - Return true if there is an allocation size parameter
28   // to the allocation instruction that is not 1.
29   //
30   bool isArrayAllocation() const;
31
32   // getArraySize - Get the number of element allocated, for a simple allocation
33   // of a single element, this will return a constant 1 value.
34   //
35   inline const Value *getArraySize() const { return Operands[0]; }
36   inline Value *getArraySize() { return Operands[0]; }
37
38   // getType - Overload to return most specific pointer type...
39   inline const PointerType *getType() const {
40     return (const PointerType*)Instruction::getType(); 
41   }
42
43   // getAllocatedType - Return the type that is being allocated by the
44   // instruction.
45   //
46   const Type *getAllocatedType() const;
47
48   virtual Instruction *clone() const = 0;
49
50   // Methods for support type inquiry through isa, cast, and dyn_cast:
51   static inline bool classof(const AllocationInst *) { return true; }
52   static inline bool classof(const Instruction *I) {
53     return I->getOpcode() == Instruction::Alloca ||
54            I->getOpcode() == Instruction::Malloc;
55   }
56   static inline bool classof(const Value *V) {
57     return isa<Instruction>(V) && classof(cast<Instruction>(V));
58   }
59 };
60
61
62 //===----------------------------------------------------------------------===//
63 //                                MallocInst Class
64 //===----------------------------------------------------------------------===//
65
66 struct MallocInst : public AllocationInst {
67   MallocInst(const Type *Ty, Value *ArraySize = 0, const std::string &Name = "")
68     : AllocationInst(Ty, ArraySize, Malloc, Name) {}
69
70   virtual Instruction *clone() const { 
71     return new MallocInst((Type*)getType(), (Value*)Operands[0].get());
72   }
73
74   // Methods for support type inquiry through isa, cast, and dyn_cast:
75   static inline bool classof(const MallocInst *) { return true; }
76   static inline bool classof(const Instruction *I) {
77     return (I->getOpcode() == Instruction::Malloc);
78   }
79   static inline bool classof(const Value *V) {
80     return isa<Instruction>(V) && classof(cast<Instruction>(V));
81   }
82 };
83
84
85 //===----------------------------------------------------------------------===//
86 //                                AllocaInst Class
87 //===----------------------------------------------------------------------===//
88
89 struct AllocaInst : public AllocationInst {
90   AllocaInst(const Type *Ty, Value *ArraySize = 0, const std::string &Name = "")
91     : AllocationInst(Ty, ArraySize, Alloca, Name) {}
92
93   virtual Instruction *clone() const { 
94     return new AllocaInst((Type*)getType(), (Value*)Operands[0].get());
95   }
96
97   // Methods for support type inquiry through isa, cast, and dyn_cast:
98   static inline bool classof(const AllocaInst *) { return true; }
99   static inline bool classof(const Instruction *I) {
100     return (I->getOpcode() == Instruction::Alloca);
101   }
102   static inline bool classof(const Value *V) {
103     return isa<Instruction>(V) && classof(cast<Instruction>(V));
104   }
105 };
106
107
108 //===----------------------------------------------------------------------===//
109 //                                 FreeInst Class
110 //===----------------------------------------------------------------------===//
111
112 struct FreeInst : public Instruction {
113   FreeInst(Value *Ptr);
114
115   virtual Instruction *clone() const { return new FreeInst(Operands[0]); }
116
117   virtual bool hasSideEffects() const { return true; }
118
119   // Methods for support type inquiry through isa, cast, and dyn_cast:
120   static inline bool classof(const FreeInst *) { return true; }
121   static inline bool classof(const Instruction *I) {
122     return (I->getOpcode() == Instruction::Free);
123   }
124   static inline bool classof(const Value *V) {
125     return isa<Instruction>(V) && classof(cast<Instruction>(V));
126   }
127 };
128
129
130 //===----------------------------------------------------------------------===//
131 //                              MemAccessInst Class
132 //===----------------------------------------------------------------------===//
133 //
134 // MemAccessInst - Common base class of GetElementPtrInst...
135 //
136 class MemAccessInst : public Instruction {
137 protected:
138   inline MemAccessInst(const Type *Ty, unsigned Opcode,
139                        const std::string &Nam = "")
140     : Instruction(Ty, Opcode, Nam) {}
141 public:
142   // getIndexedType - Returns the type of the element that would be loaded with
143   // a load instruction with the specified parameters.
144   //
145   // A null type is returned if the indices are invalid for the specified 
146   // pointer type.
147   //
148   static const Type *getIndexedType(const Type *Ptr, 
149                                     const std::vector<Value*> &Indices,
150                                     bool AllowStructLeaf = false);
151
152   inline op_iterator       idx_begin()       {
153     return op_begin()+getFirstIndexOperandNumber();
154   }
155   inline const_op_iterator idx_begin() const {
156     return op_begin()+getFirstIndexOperandNumber();
157   }
158   inline op_iterator       idx_end()         { return op_end(); }
159   inline const_op_iterator idx_end()   const { return op_end(); }
160
161
162   std::vector<Value*> copyIndices() const {
163     return std::vector<Value*>(idx_begin(), idx_end());
164   }
165
166   Value *getPointerOperand() {
167     return getOperand(getFirstIndexOperandNumber()-1);
168   }
169   const Value *getPointerOperand() const {
170     return getOperand(getFirstIndexOperandNumber()-1);
171   }
172   
173   virtual unsigned getFirstIndexOperandNumber() const = 0;
174
175   inline unsigned getNumIndices() const {  // Note: always non-negative
176     return (getNumOperands() - getFirstIndexOperandNumber());
177   }
178   
179   inline bool hasIndices() const {
180     return getNumIndices() > 0;
181   }
182
183   // Methods for support type inquiry through isa, cast, and dyn_cast:
184   static inline bool classof(const MemAccessInst *) { return true; }
185   static inline bool classof(const Instruction *I) {
186     return I->getOpcode() == GetElementPtr;
187   }
188   static inline bool classof(const Value *V) {
189     return isa<Instruction>(V) && classof(cast<Instruction>(V));
190   }
191 };
192
193
194 //===----------------------------------------------------------------------===//
195 //                                LoadInst Class
196 //===----------------------------------------------------------------------===//
197
198 class LoadInst : public Instruction {
199   LoadInst(const LoadInst &LI) : Instruction(LI.getType(), Load) {
200     Operands.reserve(1);
201     Operands.push_back(Use(LI.Operands[0], this));
202   }
203 public:
204   LoadInst(Value *Ptr, const std::string &Name = "");
205
206   virtual Instruction *clone() const { return new LoadInst(*this); }
207
208   Value *getPointerOperand() { return getOperand(0); }
209   const Value *getPointerOperand() const { return getOperand(0); }
210
211   // Methods for support type inquiry through isa, cast, and dyn_cast:
212   static inline bool classof(const LoadInst *) { return true; }
213   static inline bool classof(const Instruction *I) {
214     return (I->getOpcode() == Instruction::Load);
215   }
216   static inline bool classof(const Value *V) {
217     return isa<Instruction>(V) && classof(cast<Instruction>(V));
218   }
219 };
220
221
222 //===----------------------------------------------------------------------===//
223 //                                StoreInst Class
224 //===----------------------------------------------------------------------===//
225
226 class StoreInst : public Instruction {
227   StoreInst(const StoreInst &SI) : Instruction(SI.getType(), Store) {
228     Operands.reserve(2);
229     Operands.push_back(Use(SI.Operands[0], this));
230     Operands.push_back(Use(SI.Operands[1], this));
231   }
232 public:
233   StoreInst(Value *Val, Value *Ptr);
234   virtual Instruction *clone() const { return new StoreInst(*this); }
235
236   virtual bool hasSideEffects() const { return true; }
237
238   Value *getPointerOperand() { return getOperand(1); }
239   const Value *getPointerOperand() const { return getOperand(1); }
240
241   // Methods for support type inquiry through isa, cast, and dyn_cast:
242   static inline bool classof(const StoreInst *) { return true; }
243   static inline bool classof(const Instruction *I) {
244     return (I->getOpcode() == Instruction::Store);
245   }
246   static inline bool classof(const Value *V) {
247     return isa<Instruction>(V) && classof(cast<Instruction>(V));
248   }
249 };
250
251
252 //===----------------------------------------------------------------------===//
253 //                             GetElementPtrInst Class
254 //===----------------------------------------------------------------------===//
255
256 class GetElementPtrInst : public MemAccessInst {
257   GetElementPtrInst(const GetElementPtrInst &EPI)
258     : MemAccessInst((Type*)EPI.getType(), GetElementPtr) {
259     Operands.reserve(EPI.Operands.size());
260     for (unsigned i = 0, E = EPI.Operands.size(); i != E; ++i)
261       Operands.push_back(Use(EPI.Operands[i], this));
262   }
263 public:
264   GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
265                     const std::string &Name = "");
266   virtual Instruction *clone() const { return new GetElementPtrInst(*this); }
267   virtual unsigned getFirstIndexOperandNumber() const { return 1; }
268   
269   // getType - Overload to return most specific pointer type...
270   inline const PointerType *getType() const {
271     return (PointerType*)Instruction::getType();
272   }
273
274   // Methods for support type inquiry through isa, cast, and dyn_cast:
275   static inline bool classof(const GetElementPtrInst *) { return true; }
276   static inline bool classof(const Instruction *I) {
277     return (I->getOpcode() == Instruction::GetElementPtr);
278   }
279   static inline bool classof(const Value *V) {
280     return isa<Instruction>(V) && classof(cast<Instruction>(V));
281   }
282 };
283
284 #endif // LLVM_IMEMORY_H