* Fix TODO
[oota-llvm.git] / lib / VMCore / ConstPoolVals.cpp
1 //===-- iConstPool.cpp - Implement ConstPool instructions --------*- C++ -*--=//
2 //
3 // This file implements the ConstPool* classes...
4 //
5 //===----------------------------------------------------------------------===//
6
7 #define __STDC_LIMIT_MACROS           // Get defs for INT64_MAX and friends...
8 #include "llvm/ConstPoolVals.h"
9 #include "llvm/Support/StringExtras.h"  // itostr
10 #include "llvm/DerivedTypes.h"
11 #include "llvm/SymbolTable.h"
12 #include "llvm/GlobalValue.h"
13 #include "llvm/Module.h"
14 #include "llvm/Analysis/SlotCalculator.h"
15 #include <algorithm>
16 #include <assert.h>
17
18 ConstPoolBool *ConstPoolBool::True  = new ConstPoolBool(true);
19 ConstPoolBool *ConstPoolBool::False = new ConstPoolBool(false);
20
21
22 //===----------------------------------------------------------------------===//
23 //                              ConstPoolVal Class
24 //===----------------------------------------------------------------------===//
25
26 // Specialize setName to take care of symbol table majik
27 void ConstPoolVal::setName(const string &Name, SymbolTable *ST) {
28   assert(ST && "Type::setName - Must provide symbol table argument!");
29
30   if (Name.size()) ST->insert(Name, this);
31 }
32
33 // Static constructor to create a '0' constant of arbitrary type...
34 ConstPoolVal *ConstPoolVal::getNullConstant(const Type *Ty) {
35   switch (Ty->getPrimitiveID()) {
36   case Type::BoolTyID:   return ConstPoolBool::get(false);
37   case Type::SByteTyID:
38   case Type::ShortTyID:
39   case Type::IntTyID:
40   case Type::LongTyID:   return ConstPoolSInt::get(Ty, 0);
41
42   case Type::UByteTyID:
43   case Type::UShortTyID:
44   case Type::UIntTyID:
45   case Type::ULongTyID:  return ConstPoolUInt::get(Ty, 0);
46
47   case Type::FloatTyID:
48   case Type::DoubleTyID: return ConstPoolFP::get(Ty, 0);
49
50   case Type::PointerTyID: 
51     return ConstPoolPointerNull::get(cast<PointerType>(Ty));
52   default:
53     return 0;
54   }
55 }
56
57 #ifndef NDEBUG
58 #include "llvm/Assembly/Writer.h"
59 #endif
60
61 void ConstPoolVal::destroyConstantImpl() {
62   // When a ConstPoolVal is destroyed, there may be lingering
63   // references to the constant by other constants in the constant pool.  These
64   // constants are implicitly dependant on the module that is being deleted,
65   // but they don't know that.  Because we only find out when the CPV is
66   // deleted, we must now notify all of our users (that should only be
67   // ConstPoolVals) that they are, in fact, invalid now and should be deleted.
68   //
69   while (!use_empty()) {
70     Value *V = use_back();
71 #ifndef NDEBUG      // Only in -g mode...
72     if (!isa<ConstPoolVal>(V)) {
73       cerr << "While deleting: " << this << endl;
74       cerr << "Use still stuck around after Def is destroyed: " << V << endl;
75     }
76 #endif
77     assert(isa<ConstPoolVal>(V) && "References remain to ConstPoolPointerRef!");
78     ConstPoolVal *CPV = cast<ConstPoolVal>(V);
79     CPV->destroyConstant();
80
81     // The constant should remove itself from our use list...
82     assert((use_empty() || use_back() == V) && "Constant not removed!");
83   }
84
85   // Value has no outstanding references it is safe to delete it now...
86   delete this;
87 }
88
89 //===----------------------------------------------------------------------===//
90 //                            ConstPoolXXX Classes
91 //===----------------------------------------------------------------------===//
92
93 //===----------------------------------------------------------------------===//
94 //                             Normal Constructors
95
96 ConstPoolBool::ConstPoolBool(bool V) : ConstPoolVal(Type::BoolTy) {
97   Val = V;
98 }
99
100 ConstPoolInt::ConstPoolInt(const Type *Ty, uint64_t V) : ConstPoolVal(Ty) {
101   Val.Unsigned = V;
102 }
103
104 ConstPoolSInt::ConstPoolSInt(const Type *Ty, int64_t V) : ConstPoolInt(Ty, V) {
105   assert(isValueValidForType(Ty, V) && "Value too large for type!");
106 }
107
108 ConstPoolUInt::ConstPoolUInt(const Type *Ty, uint64_t V) : ConstPoolInt(Ty, V) {
109   assert(isValueValidForType(Ty, V) && "Value too large for type!");
110 }
111
112 ConstPoolFP::ConstPoolFP(const Type *Ty, double V) : ConstPoolVal(Ty) {
113   assert(isValueValidForType(Ty, V) && "Value too large for type!");
114   Val = V;
115 }
116
117 ConstPoolArray::ConstPoolArray(const ArrayType *T,
118                                const vector<ConstPoolVal*> &V)
119   : ConstPoolVal(T) {
120   for (unsigned i = 0; i < V.size(); i++) {
121     assert(V[i]->getType() == T->getElementType());
122     Operands.push_back(Use(V[i], this));
123   }
124 }
125
126 ConstPoolStruct::ConstPoolStruct(const StructType *T,
127                                  const vector<ConstPoolVal*> &V)
128   : ConstPoolVal(T) {
129   const StructType::ElementTypes &ETypes = T->getElementTypes();
130   
131   for (unsigned i = 0; i < V.size(); i++) {
132     assert(V[i]->getType() == ETypes[i]);
133     Operands.push_back(Use(V[i], this));
134   }
135 }
136
137 ConstPoolPointerReference::ConstPoolPointerReference(GlobalValue *GV)
138   : ConstPoolPointer(GV->getType()) {
139   Operands.push_back(Use(GV, this));
140 }
141
142
143
144 //===----------------------------------------------------------------------===//
145 //                          getStrValue implementations
146
147 string ConstPoolBool::getStrValue() const {
148   return Val ? "true" : "false";
149 }
150
151 string ConstPoolSInt::getStrValue() const {
152   return itostr(Val.Signed);
153 }
154
155 string ConstPoolUInt::getStrValue() const {
156   return utostr(Val.Unsigned);
157 }
158
159 string ConstPoolFP::getStrValue() const {
160   return ftostr(Val);
161 }
162
163 string ConstPoolArray::getStrValue() const {
164   string Result = "[";
165   if (Operands.size()) {
166     Result += " " + Operands[0]->getType()->getDescription() + 
167               " " + cast<ConstPoolVal>(Operands[0])->getStrValue();
168     for (unsigned i = 1; i < Operands.size(); i++)
169       Result += ", " + Operands[i]->getType()->getDescription() + 
170                  " " + cast<ConstPoolVal>(Operands[i])->getStrValue();
171   }
172
173   return Result + " ]";
174 }
175
176 string ConstPoolStruct::getStrValue() const {
177   string Result = "{";
178   if (Operands.size()) {
179     Result += " " + Operands[0]->getType()->getDescription() + 
180               " " + cast<ConstPoolVal>(Operands[0])->getStrValue();
181     for (unsigned i = 1; i < Operands.size(); i++)
182       Result += ", " + Operands[i]->getType()->getDescription() + 
183                  " " + cast<ConstPoolVal>(Operands[i])->getStrValue();
184   }
185
186   return Result + " }";
187 }
188
189 string ConstPoolPointerNull::getStrValue() const {
190   return "null";
191 }
192
193 string ConstPoolPointerReference::getStrValue() const {
194   const GlobalValue *V = getValue();
195   if (V->hasName()) return "%" + V->getName();
196
197   SlotCalculator *Table = new SlotCalculator(V->getParent(), true);
198   int Slot = Table->getValSlot(V);
199   delete Table;
200
201   if (Slot >= 0) return string(" %") + itostr(Slot);
202   else return "<pointer reference badref>";
203 }
204
205
206 //===----------------------------------------------------------------------===//
207 //                           classof implementations
208
209 bool ConstPoolInt::classof(const ConstPoolVal *CPV) {
210   return CPV->getType()->isIntegral();
211 }
212 bool ConstPoolSInt::classof(const ConstPoolVal *CPV) {
213   return CPV->getType()->isSigned();
214 }
215 bool ConstPoolUInt::classof(const ConstPoolVal *CPV) {
216   return CPV->getType()->isUnsigned();
217 }
218 bool ConstPoolFP::classof(const ConstPoolVal *CPV) {
219   const Type *Ty = CPV->getType();
220   return Ty == Type::FloatTy || Ty == Type::DoubleTy;
221 }
222 bool ConstPoolArray::classof(const ConstPoolVal *CPV) {
223   return isa<ArrayType>(CPV->getType());
224 }
225 bool ConstPoolStruct::classof(const ConstPoolVal *CPV) {
226   return isa<StructType>(CPV->getType());
227 }
228 bool ConstPoolPointer::classof(const ConstPoolVal *CPV) {
229   return isa<PointerType>(CPV->getType());
230 }
231
232
233 //===----------------------------------------------------------------------===//
234 //                      isValueValidForType implementations
235
236 bool ConstPoolSInt::isValueValidForType(const Type *Ty, int64_t Val) {
237   switch (Ty->getPrimitiveID()) {
238   default:
239     return false;         // These can't be represented as integers!!!
240
241     // Signed types...
242   case Type::SByteTyID:
243     return (Val <= INT8_MAX && Val >= INT8_MIN);
244   case Type::ShortTyID:
245     return (Val <= INT16_MAX && Val >= INT16_MIN);
246   case Type::IntTyID:
247     return (Val <= INT32_MAX && Val >= INT32_MIN);
248   case Type::LongTyID:
249     return true;          // This is the largest type...
250   }
251   assert(0 && "WTF?");
252   return false;
253 }
254
255 bool ConstPoolUInt::isValueValidForType(const Type *Ty, uint64_t Val) {
256   switch (Ty->getPrimitiveID()) {
257   default:
258     return false;         // These can't be represented as integers!!!
259
260     // Unsigned types...
261   case Type::UByteTyID:
262     return (Val <= UINT8_MAX);
263   case Type::UShortTyID:
264     return (Val <= UINT16_MAX);
265   case Type::UIntTyID:
266     return (Val <= UINT32_MAX);
267   case Type::ULongTyID:
268     return true;          // This is the largest type...
269   }
270   assert(0 && "WTF?");
271   return false;
272 }
273
274 bool ConstPoolFP::isValueValidForType(const Type *Ty, double Val) {
275   switch (Ty->getPrimitiveID()) {
276   default:
277     return false;         // These can't be represented as floating point!
278
279     // TODO: Figure out how to test if a double can be cast to a float!
280   case Type::FloatTyID:
281     /*
282     return (Val <= UINT8_MAX);
283     */
284   case Type::DoubleTyID:
285     return true;          // This is the largest type...
286   }
287 };
288
289 //===----------------------------------------------------------------------===//
290 //                      Hash Function Implementations
291 #if 0
292 unsigned ConstPoolSInt::hash(const Type *Ty, int64_t V) {
293   return unsigned(Ty->getPrimitiveID() ^ V);
294 }
295
296 unsigned ConstPoolUInt::hash(const Type *Ty, uint64_t V) {
297   return unsigned(Ty->getPrimitiveID() ^ V);
298 }
299
300 unsigned ConstPoolFP::hash(const Type *Ty, double V) {
301   return Ty->getPrimitiveID() ^ unsigned(V);
302 }
303
304 unsigned ConstPoolArray::hash(const ArrayType *Ty,
305                               const vector<ConstPoolVal*> &V) {
306   unsigned Result = (Ty->getUniqueID() << 5) ^ (Ty->getUniqueID() * 7);
307   for (unsigned i = 0; i < V.size(); ++i)
308     Result ^= V[i]->getHash() << (i & 7);
309   return Result;
310 }
311
312 unsigned ConstPoolStruct::hash(const StructType *Ty,
313                                const vector<ConstPoolVal*> &V) {
314   unsigned Result = (Ty->getUniqueID() << 5) ^ (Ty->getUniqueID() * 7);
315   for (unsigned i = 0; i < V.size(); ++i)
316     Result ^= V[i]->getHash() << (i & 7);
317   return Result;
318 }
319 #endif
320
321 //===----------------------------------------------------------------------===//
322 //                      Factory Function Implementation
323
324 template<class ValType, class ConstPoolClass>
325 struct ValueMap {
326   typedef pair<const Type*, ValType> ConstHashKey;
327   map<ConstHashKey, ConstPoolClass *> Map;
328
329   inline ConstPoolClass *get(const Type *Ty, ValType V) {
330     map<ConstHashKey,ConstPoolClass *>::iterator I =
331       Map.find(ConstHashKey(Ty, V));
332     return (I != Map.end()) ? I->second : 0;
333   }
334
335   inline void add(const Type *Ty, ValType V, ConstPoolClass *CP) {
336     Map.insert(make_pair(ConstHashKey(Ty, V), CP));
337   }
338
339   inline void remove(ConstPoolClass *CP) {
340     for (map<ConstHashKey,ConstPoolClass *>::iterator I = Map.begin(),
341                                                       E = Map.end(); I != E;++I)
342       if (I->second == CP) {
343         Map.erase(I);
344         return;
345       }
346   }
347 };
348
349 //---- ConstPoolUInt::get() and ConstPoolSInt::get() implementations...
350 //
351 static ValueMap<uint64_t, ConstPoolInt> IntConstants;
352
353 ConstPoolSInt *ConstPoolSInt::get(const Type *Ty, int64_t V) {
354   ConstPoolSInt *Result = (ConstPoolSInt*)IntConstants.get(Ty, (uint64_t)V);
355   if (!Result)   // If no preexisting value, create one now...
356     IntConstants.add(Ty, V, Result = new ConstPoolSInt(Ty, V));
357   return Result;
358 }
359
360 ConstPoolUInt *ConstPoolUInt::get(const Type *Ty, uint64_t V) {
361   ConstPoolUInt *Result = (ConstPoolUInt*)IntConstants.get(Ty, V);
362   if (!Result)   // If no preexisting value, create one now...
363     IntConstants.add(Ty, V, Result = new ConstPoolUInt(Ty, V));
364   return Result;
365 }
366
367 ConstPoolInt *ConstPoolInt::get(const Type *Ty, unsigned char V) {
368   assert(V <= 127 && "Can only be used with very small positive constants!");
369   if (Ty->isSigned()) return ConstPoolSInt::get(Ty, V);
370   return ConstPoolUInt::get(Ty, V);
371 }
372
373 //---- ConstPoolFP::get() implementation...
374 //
375 static ValueMap<double, ConstPoolFP> FPConstants;
376
377 ConstPoolFP *ConstPoolFP::get(const Type *Ty, double V) {
378   ConstPoolFP *Result = FPConstants.get(Ty, V);
379   if (!Result)   // If no preexisting value, create one now...
380     FPConstants.add(Ty, V, Result = new ConstPoolFP(Ty, V));
381   return Result;
382 }
383
384 //---- ConstPoolArray::get() implementation...
385 //
386 static ValueMap<vector<ConstPoolVal*>, ConstPoolArray> ArrayConstants;
387
388 ConstPoolArray *ConstPoolArray::get(const ArrayType *Ty,
389                                     const vector<ConstPoolVal*> &V) {
390   ConstPoolArray *Result = ArrayConstants.get(Ty, V);
391   if (!Result)   // If no preexisting value, create one now...
392     ArrayConstants.add(Ty, V, Result = new ConstPoolArray(Ty, V));
393   return Result;
394 }
395
396 // destroyConstant - Remove the constant from the constant table...
397 //
398 void ConstPoolArray::destroyConstant() {
399   ArrayConstants.remove(this);
400   destroyConstantImpl();
401 }
402
403 //---- ConstPoolStruct::get() implementation...
404 //
405 static ValueMap<vector<ConstPoolVal*>, ConstPoolStruct> StructConstants;
406
407 ConstPoolStruct *ConstPoolStruct::get(const StructType *Ty,
408                                       const vector<ConstPoolVal*> &V) {
409   ConstPoolStruct *Result = StructConstants.get(Ty, V);
410   if (!Result)   // If no preexisting value, create one now...
411     StructConstants.add(Ty, V, Result = new ConstPoolStruct(Ty, V));
412   return Result;
413 }
414
415 // destroyConstant - Remove the constant from the constant table...
416 //
417 void ConstPoolStruct::destroyConstant() {
418   StructConstants.remove(this);
419   destroyConstantImpl();
420 }
421
422 //---- ConstPoolPointerNull::get() implementation...
423 //
424 static ValueMap<char, ConstPoolPointerNull> NullPtrConstants;
425
426 ConstPoolPointerNull *ConstPoolPointerNull::get(const PointerType *Ty) {
427   ConstPoolPointerNull *Result = NullPtrConstants.get(Ty, 0);
428   if (!Result)   // If no preexisting value, create one now...
429     NullPtrConstants.add(Ty, 0, Result = new ConstPoolPointerNull(Ty));
430   return Result;
431 }
432
433 //---- ConstPoolPointerReference::get() implementation...
434 //
435 ConstPoolPointerReference *ConstPoolPointerReference::get(GlobalValue *GV) {
436   assert(GV->getParent() && "Global Value must be attached to a module!");
437
438   // The Module handles the pointer reference sharing...
439   return GV->getParent()->getConstPoolPointerReference(GV);
440 }
441
442
443 void ConstPoolPointerReference::mutateReference(GlobalValue *NewGV) {
444   getValue()->getParent()->mutateConstPoolPointerReference(getValue(), NewGV);
445   Operands[0] = NewGV;
446 }