1 //===-- iConstPool.cpp - Implement ConstPool instructions --------*- C++ -*--=//
3 // This file implements the ConstPool* classes...
5 //===----------------------------------------------------------------------===//
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"
18 ConstPoolBool *ConstPoolBool::True = new ConstPoolBool(true);
19 ConstPoolBool *ConstPoolBool::False = new ConstPoolBool(false);
22 //===----------------------------------------------------------------------===//
24 //===----------------------------------------------------------------------===//
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!");
30 if (Name.size()) ST->insert(Name, this);
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);
40 case Type::LongTyID: return ConstPoolSInt::get(Ty, 0);
43 case Type::UShortTyID:
45 case Type::ULongTyID: return ConstPoolUInt::get(Ty, 0);
48 case Type::DoubleTyID: return ConstPoolFP::get(Ty, 0);
50 case Type::PointerTyID:
51 return ConstPoolPointerNull::get(cast<PointerType>(Ty));
58 #include "llvm/Assembly/Writer.h"
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.
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;
77 assert(isa<ConstPoolVal>(V) && "References remain to ConstPoolPointerRef!");
78 ConstPoolVal *CPV = cast<ConstPoolVal>(V);
79 CPV->destroyConstant();
81 // The constant should remove itself from our use list...
82 assert((use_empty() || use_back() == V) && "Constant not removed!");
85 // Value has no outstanding references it is safe to delete it now...
89 //===----------------------------------------------------------------------===//
90 // ConstPoolXXX Classes
91 //===----------------------------------------------------------------------===//
93 //===----------------------------------------------------------------------===//
94 // Normal Constructors
96 ConstPoolBool::ConstPoolBool(bool V) : ConstPoolVal(Type::BoolTy) {
100 ConstPoolInt::ConstPoolInt(const Type *Ty, uint64_t V) : ConstPoolVal(Ty) {
104 ConstPoolSInt::ConstPoolSInt(const Type *Ty, int64_t V) : ConstPoolInt(Ty, V) {
105 assert(isValueValidForType(Ty, V) && "Value too large for type!");
108 ConstPoolUInt::ConstPoolUInt(const Type *Ty, uint64_t V) : ConstPoolInt(Ty, V) {
109 assert(isValueValidForType(Ty, V) && "Value too large for type!");
112 ConstPoolFP::ConstPoolFP(const Type *Ty, double V) : ConstPoolVal(Ty) {
113 assert(isValueValidForType(Ty, V) && "Value too large for type!");
117 ConstPoolArray::ConstPoolArray(const ArrayType *T,
118 const vector<ConstPoolVal*> &V)
120 for (unsigned i = 0; i < V.size(); i++) {
121 assert(V[i]->getType() == T->getElementType());
122 Operands.push_back(Use(V[i], this));
126 ConstPoolStruct::ConstPoolStruct(const StructType *T,
127 const vector<ConstPoolVal*> &V)
129 const StructType::ElementTypes &ETypes = T->getElementTypes();
131 for (unsigned i = 0; i < V.size(); i++) {
132 assert(V[i]->getType() == ETypes[i]);
133 Operands.push_back(Use(V[i], this));
137 ConstPoolPointerReference::ConstPoolPointerReference(GlobalValue *GV)
138 : ConstPoolPointer(GV->getType()) {
139 Operands.push_back(Use(GV, this));
144 //===----------------------------------------------------------------------===//
145 // getStrValue implementations
147 string ConstPoolBool::getStrValue() const {
148 return Val ? "true" : "false";
151 string ConstPoolSInt::getStrValue() const {
152 return itostr(Val.Signed);
155 string ConstPoolUInt::getStrValue() const {
156 return utostr(Val.Unsigned);
159 string ConstPoolFP::getStrValue() const {
163 string ConstPoolArray::getStrValue() const {
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();
173 return Result + " ]";
176 string ConstPoolStruct::getStrValue() const {
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();
186 return Result + " }";
189 string ConstPoolPointerNull::getStrValue() const {
193 string ConstPoolPointerReference::getStrValue() const {
194 const GlobalValue *V = getValue();
195 if (V->hasName()) return "%" + V->getName();
197 SlotCalculator *Table = new SlotCalculator(V->getParent(), true);
198 int Slot = Table->getValSlot(V);
201 if (Slot >= 0) return string(" %") + itostr(Slot);
202 else return "<pointer reference badref>";
206 //===----------------------------------------------------------------------===//
207 // classof implementations
209 bool ConstPoolInt::classof(const ConstPoolVal *CPV) {
210 return CPV->getType()->isIntegral();
212 bool ConstPoolSInt::classof(const ConstPoolVal *CPV) {
213 return CPV->getType()->isSigned();
215 bool ConstPoolUInt::classof(const ConstPoolVal *CPV) {
216 return CPV->getType()->isUnsigned();
218 bool ConstPoolFP::classof(const ConstPoolVal *CPV) {
219 const Type *Ty = CPV->getType();
220 return Ty == Type::FloatTy || Ty == Type::DoubleTy;
222 bool ConstPoolArray::classof(const ConstPoolVal *CPV) {
223 return isa<ArrayType>(CPV->getType());
225 bool ConstPoolStruct::classof(const ConstPoolVal *CPV) {
226 return isa<StructType>(CPV->getType());
228 bool ConstPoolPointer::classof(const ConstPoolVal *CPV) {
229 return isa<PointerType>(CPV->getType());
233 //===----------------------------------------------------------------------===//
234 // isValueValidForType implementations
236 bool ConstPoolSInt::isValueValidForType(const Type *Ty, int64_t Val) {
237 switch (Ty->getPrimitiveID()) {
239 return false; // These can't be represented as integers!!!
242 case Type::SByteTyID:
243 return (Val <= INT8_MAX && Val >= INT8_MIN);
244 case Type::ShortTyID:
245 return (Val <= INT16_MAX && Val >= INT16_MIN);
247 return (Val <= INT32_MAX && Val >= INT32_MIN);
249 return true; // This is the largest type...
255 bool ConstPoolUInt::isValueValidForType(const Type *Ty, uint64_t Val) {
256 switch (Ty->getPrimitiveID()) {
258 return false; // These can't be represented as integers!!!
261 case Type::UByteTyID:
262 return (Val <= UINT8_MAX);
263 case Type::UShortTyID:
264 return (Val <= UINT16_MAX);
266 return (Val <= UINT32_MAX);
267 case Type::ULongTyID:
268 return true; // This is the largest type...
274 bool ConstPoolFP::isValueValidForType(const Type *Ty, double Val) {
275 switch (Ty->getPrimitiveID()) {
277 return false; // These can't be represented as floating point!
279 // TODO: Figure out how to test if a double can be cast to a float!
280 case Type::FloatTyID:
282 return (Val <= UINT8_MAX);
284 case Type::DoubleTyID:
285 return true; // This is the largest type...
289 //===----------------------------------------------------------------------===//
290 // Hash Function Implementations
292 unsigned ConstPoolSInt::hash(const Type *Ty, int64_t V) {
293 return unsigned(Ty->getPrimitiveID() ^ V);
296 unsigned ConstPoolUInt::hash(const Type *Ty, uint64_t V) {
297 return unsigned(Ty->getPrimitiveID() ^ V);
300 unsigned ConstPoolFP::hash(const Type *Ty, double V) {
301 return Ty->getPrimitiveID() ^ unsigned(V);
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);
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);
321 //===----------------------------------------------------------------------===//
322 // Factory Function Implementation
324 template<class ValType, class ConstPoolClass>
326 typedef pair<const Type*, ValType> ConstHashKey;
327 map<ConstHashKey, ConstPoolClass *> Map;
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;
335 inline void add(const Type *Ty, ValType V, ConstPoolClass *CP) {
336 Map.insert(make_pair(ConstHashKey(Ty, V), CP));
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) {
349 //---- ConstPoolUInt::get() and ConstPoolSInt::get() implementations...
351 static ValueMap<uint64_t, ConstPoolInt> IntConstants;
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));
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));
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);
373 //---- ConstPoolFP::get() implementation...
375 static ValueMap<double, ConstPoolFP> FPConstants;
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));
384 //---- ConstPoolArray::get() implementation...
386 static ValueMap<vector<ConstPoolVal*>, ConstPoolArray> ArrayConstants;
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));
396 // destroyConstant - Remove the constant from the constant table...
398 void ConstPoolArray::destroyConstant() {
399 ArrayConstants.remove(this);
400 destroyConstantImpl();
403 //---- ConstPoolStruct::get() implementation...
405 static ValueMap<vector<ConstPoolVal*>, ConstPoolStruct> StructConstants;
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));
415 // destroyConstant - Remove the constant from the constant table...
417 void ConstPoolStruct::destroyConstant() {
418 StructConstants.remove(this);
419 destroyConstantImpl();
422 //---- ConstPoolPointerNull::get() implementation...
424 static ValueMap<char, ConstPoolPointerNull> NullPtrConstants;
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));
433 //---- ConstPoolPointerReference::get() implementation...
435 ConstPoolPointerReference *ConstPoolPointerReference::get(GlobalValue *GV) {
436 assert(GV->getParent() && "Global Value must be attached to a module!");
438 // The Module handles the pointer reference sharing...
439 return GV->getParent()->getConstPoolPointerReference(GV);
443 void ConstPoolPointerReference::mutateReference(GlobalValue *NewGV) {
444 getValue()->getParent()->mutateConstPoolPointerReference(getValue(), NewGV);