Add comments
[oota-llvm.git] / lib / VMCore / Type.cpp
1 //===-- Type.cpp - Implement the Type class -------------------------------===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Type class for the VMCore library.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/DerivedTypes.h"
15 #include "llvm/SymbolTable.h"
16 #include "llvm/Constants.h"
17 #include "Support/DepthFirstIterator.h"
18 #include "Support/StringExtras.h"
19 #include "Support/STLExtras.h"
20 #include <algorithm>
21
22 using namespace llvm;
23
24 // DEBUG_MERGE_TYPES - Enable this #define to see how and when derived types are
25 // created and later destroyed, all in an effort to make sure that there is only
26 // a single canonical version of a type.
27 //
28 //#define DEBUG_MERGE_TYPES 1
29
30
31 //===----------------------------------------------------------------------===//
32 //                         Type Class Implementation
33 //===----------------------------------------------------------------------===//
34
35 static unsigned CurUID = 0;
36 static std::vector<const Type *> UIDMappings;
37
38 // Concrete/Abstract TypeDescriptions - We lazily calculate type descriptions
39 // for types as they are needed.  Because resolution of types must invalidate
40 // all of the abstract type descriptions, we keep them in a seperate map to make
41 // this easy.
42 static std::map<const Type*, std::string> ConcreteTypeDescriptions;
43 static std::map<const Type*, std::string> AbstractTypeDescriptions;
44
45 Type::Type(const std::string &name, PrimitiveID id)
46   : Value(Type::TypeTy, Value::TypeVal), ForwardType(0) {
47   if (!name.empty())
48     ConcreteTypeDescriptions[this] = name;
49   ID = id;
50   Abstract = false;
51   UID = CurUID++;       // Assign types UID's as they are created
52   UIDMappings.push_back(this);
53 }
54
55 void Type::setName(const std::string &Name, SymbolTable *ST) {
56   assert(ST && "Type::setName - Must provide symbol table argument!");
57
58   if (Name.size()) ST->insert(Name, this);
59 }
60
61
62 const Type *Type::getUniqueIDType(unsigned UID) {
63   assert(UID < UIDMappings.size() && 
64          "Type::getPrimitiveType: UID out of range!");
65   return UIDMappings[UID];
66 }
67
68 const Type *Type::getPrimitiveType(PrimitiveID IDNumber) {
69   switch (IDNumber) {
70   case VoidTyID  : return VoidTy;
71   case BoolTyID  : return BoolTy;
72   case UByteTyID : return UByteTy;
73   case SByteTyID : return SByteTy;
74   case UShortTyID: return UShortTy;
75   case ShortTyID : return ShortTy;
76   case UIntTyID  : return UIntTy;
77   case IntTyID   : return IntTy;
78   case ULongTyID : return ULongTy;
79   case LongTyID  : return LongTy;
80   case FloatTyID : return FloatTy;
81   case DoubleTyID: return DoubleTy;
82   case TypeTyID  : return TypeTy;
83   case LabelTyID : return LabelTy;
84   default:
85     return 0;
86   }
87 }
88
89 // isLosslesslyConvertibleTo - Return true if this type can be converted to
90 // 'Ty' without any reinterpretation of bits.  For example, uint to int.
91 //
92 bool Type::isLosslesslyConvertibleTo(const Type *Ty) const {
93   if (this == Ty) return true;
94   if ((!isPrimitiveType()    && !isa<PointerType>(this)) ||
95       (!isa<PointerType>(Ty) && !Ty->isPrimitiveType())) return false;
96
97   if (getPrimitiveID() == Ty->getPrimitiveID())
98     return true;  // Handles identity cast, and cast of differing pointer types
99
100   // Now we know that they are two differing primitive or pointer types
101   switch (getPrimitiveID()) {
102   case Type::UByteTyID:   return Ty == Type::SByteTy;
103   case Type::SByteTyID:   return Ty == Type::UByteTy;
104   case Type::UShortTyID:  return Ty == Type::ShortTy;
105   case Type::ShortTyID:   return Ty == Type::UShortTy;
106   case Type::UIntTyID:    return Ty == Type::IntTy;
107   case Type::IntTyID:     return Ty == Type::UIntTy;
108   case Type::ULongTyID:   return Ty == Type::LongTy;
109   case Type::LongTyID:    return Ty == Type::ULongTy;
110   case Type::PointerTyID: return isa<PointerType>(Ty);
111   default:
112     return false;  // Other types have no identity values
113   }
114 }
115
116 // getPrimitiveSize - Return the basic size of this type if it is a primitive
117 // type.  These are fixed by LLVM and are not target dependent.  This will
118 // return zero if the type does not have a size or is not a primitive type.
119 //
120 unsigned Type::getPrimitiveSize() const {
121   switch (getPrimitiveID()) {
122 #define HANDLE_PRIM_TYPE(TY,SIZE)  case TY##TyID: return SIZE;
123 #include "llvm/Type.def"
124   default: return 0;
125   }
126 }
127
128
129 /// getForwardedTypeInternal - This method is used to implement the union-find
130 /// algorithm for when a type is being forwarded to another type.
131 const Type *Type::getForwardedTypeInternal() const {
132   assert(ForwardType && "This type is not being forwarded to another type!");
133   
134   // Check to see if the forwarded type has been forwarded on.  If so, collapse
135   // the forwarding links.
136   const Type *RealForwardedType = ForwardType->getForwardedType();
137   if (!RealForwardedType)
138     return ForwardType;  // No it's not forwarded again
139
140   // Yes, it is forwarded again.  First thing, add the reference to the new
141   // forward type.
142   if (RealForwardedType->isAbstract())
143     cast<DerivedType>(RealForwardedType)->addRef();
144
145   // Now drop the old reference.  This could cause ForwardType to get deleted.
146   cast<DerivedType>(ForwardType)->dropRef();
147   
148   // Return the updated type.
149   ForwardType = RealForwardedType;
150   return ForwardType;
151 }
152
153 // getTypeDescription - This is a recursive function that walks a type hierarchy
154 // calculating the description for a type.
155 //
156 static std::string getTypeDescription(const Type *Ty,
157                                       std::vector<const Type *> &TypeStack) {
158   if (isa<OpaqueType>(Ty)) {                     // Base case for the recursion
159     std::map<const Type*, std::string>::iterator I =
160       AbstractTypeDescriptions.lower_bound(Ty);
161     if (I != AbstractTypeDescriptions.end() && I->first == Ty)
162       return I->second;
163     std::string Desc = "opaque"+utostr(Ty->getUniqueID());
164     AbstractTypeDescriptions.insert(std::make_pair(Ty, Desc));
165     return Desc;
166   }
167   
168   if (!Ty->isAbstract()) {                       // Base case for the recursion
169     std::map<const Type*, std::string>::iterator I =
170       ConcreteTypeDescriptions.find(Ty);
171     if (I != ConcreteTypeDescriptions.end()) return I->second;
172   }
173       
174   // Check to see if the Type is already on the stack...
175   unsigned Slot = 0, CurSize = TypeStack.size();
176   while (Slot < CurSize && TypeStack[Slot] != Ty) ++Slot; // Scan for type
177   
178   // This is another base case for the recursion.  In this case, we know 
179   // that we have looped back to a type that we have previously visited.
180   // Generate the appropriate upreference to handle this.
181   // 
182   if (Slot < CurSize)
183     return "\\" + utostr(CurSize-Slot);         // Here's the upreference
184
185   // Recursive case: derived types...
186   std::string Result;
187   TypeStack.push_back(Ty);    // Add us to the stack..
188       
189   switch (Ty->getPrimitiveID()) {
190   case Type::FunctionTyID: {
191     const FunctionType *FTy = cast<FunctionType>(Ty);
192     Result = getTypeDescription(FTy->getReturnType(), TypeStack) + " (";
193     for (FunctionType::ParamTypes::const_iterator
194            I = FTy->getParamTypes().begin(),
195            E = FTy->getParamTypes().end(); I != E; ++I) {
196       if (I != FTy->getParamTypes().begin())
197         Result += ", ";
198       Result += getTypeDescription(*I, TypeStack);
199     }
200     if (FTy->isVarArg()) {
201       if (!FTy->getParamTypes().empty()) Result += ", ";
202       Result += "...";
203     }
204     Result += ")";
205     break;
206   }
207   case Type::StructTyID: {
208     const StructType *STy = cast<StructType>(Ty);
209     Result = "{ ";
210     for (StructType::ElementTypes::const_iterator
211            I = STy->getElementTypes().begin(),
212            E = STy->getElementTypes().end(); I != E; ++I) {
213       if (I != STy->getElementTypes().begin())
214         Result += ", ";
215       Result += getTypeDescription(*I, TypeStack);
216     }
217     Result += " }";
218     break;
219   }
220   case Type::PointerTyID: {
221     const PointerType *PTy = cast<PointerType>(Ty);
222     Result = getTypeDescription(PTy->getElementType(), TypeStack) + " *";
223     break;
224   }
225   case Type::ArrayTyID: {
226     const ArrayType *ATy = cast<ArrayType>(Ty);
227     unsigned NumElements = ATy->getNumElements();
228     Result = "[";
229     Result += utostr(NumElements) + " x ";
230     Result += getTypeDescription(ATy->getElementType(), TypeStack) + "]";
231     break;
232   }
233   default:
234     Result = "<error>";
235     assert(0 && "Unhandled type in getTypeDescription!");
236   }
237
238   TypeStack.pop_back();       // Remove self from stack...
239
240   return Result;
241 }
242
243
244
245 static const std::string &getOrCreateDesc(std::map<const Type*,std::string>&Map,
246                                           const Type *Ty) {
247   std::map<const Type*, std::string>::iterator I = Map.find(Ty);
248   if (I != Map.end()) return I->second;
249     
250   std::vector<const Type *> TypeStack;
251   return Map[Ty] = getTypeDescription(Ty, TypeStack);
252 }
253
254
255 const std::string &Type::getDescription() const {
256   if (isAbstract())
257     return getOrCreateDesc(AbstractTypeDescriptions, this);
258   else
259     return getOrCreateDesc(ConcreteTypeDescriptions, this);
260 }
261
262
263 bool StructType::indexValid(const Value *V) const {
264   // Structure indexes require unsigned integer constants.
265   if (const ConstantUInt *CU = dyn_cast<ConstantUInt>(V))
266     return CU->getValue() < ETypes.size();
267   return false;
268 }
269
270 // getTypeAtIndex - Given an index value into the type, return the type of the
271 // element.  For a structure type, this must be a constant value...
272 //
273 const Type *StructType::getTypeAtIndex(const Value *V) const {
274   assert(isa<Constant>(V) && "Structure index must be a constant!!");
275   unsigned Idx = cast<ConstantUInt>(V)->getValue();
276   assert(Idx < ETypes.size() && "Structure index out of range!");
277   assert(indexValid(V) && "Invalid structure index!"); // Duplicate check
278   return ETypes[Idx];
279 }
280
281
282 //===----------------------------------------------------------------------===//
283 //                           Auxiliary classes
284 //===----------------------------------------------------------------------===//
285 //
286 // These classes are used to implement specialized behavior for each different
287 // type.
288 //
289 struct SignedIntType : public Type {
290   SignedIntType(const std::string &Name, PrimitiveID id) : Type(Name, id) {}
291
292   // isSigned - Return whether a numeric type is signed.
293   virtual bool isSigned() const { return 1; }
294
295   // isInteger - Equivalent to isSigned() || isUnsigned, but with only a single
296   // virtual function invocation.
297   //
298   virtual bool isInteger() const { return 1; }
299 };
300
301 struct UnsignedIntType : public Type {
302   UnsignedIntType(const std::string &N, PrimitiveID id) : Type(N, id) {}
303
304   // isUnsigned - Return whether a numeric type is signed.
305   virtual bool isUnsigned() const { return 1; }
306
307   // isInteger - Equivalent to isSigned() || isUnsigned, but with only a single
308   // virtual function invocation.
309   //
310   virtual bool isInteger() const { return 1; }
311 };
312
313 struct OtherType : public Type {
314   OtherType(const std::string &N, PrimitiveID id) : Type(N, id) {}
315 };
316
317 static struct TypeType : public Type {
318   TypeType() : Type("type", TypeTyID) {}
319 } TheTypeTy;   // Implement the type that is global.
320
321
322 //===----------------------------------------------------------------------===//
323 //                           Static 'Type' data
324 //===----------------------------------------------------------------------===//
325
326 static OtherType       TheVoidTy  ("void"  , Type::VoidTyID);
327 static OtherType       TheBoolTy  ("bool"  , Type::BoolTyID);
328 static SignedIntType   TheSByteTy ("sbyte" , Type::SByteTyID);
329 static UnsignedIntType TheUByteTy ("ubyte" , Type::UByteTyID);
330 static SignedIntType   TheShortTy ("short" , Type::ShortTyID);
331 static UnsignedIntType TheUShortTy("ushort", Type::UShortTyID);
332 static SignedIntType   TheIntTy   ("int"   , Type::IntTyID); 
333 static UnsignedIntType TheUIntTy  ("uint"  , Type::UIntTyID);
334 static SignedIntType   TheLongTy  ("long"  , Type::LongTyID);
335 static UnsignedIntType TheULongTy ("ulong" , Type::ULongTyID);
336 static OtherType       TheFloatTy ("float" , Type::FloatTyID);
337 static OtherType       TheDoubleTy("double", Type::DoubleTyID);
338 static OtherType       TheLabelTy ("label" , Type::LabelTyID);
339
340 Type *Type::VoidTy   = &TheVoidTy;
341 Type *Type::BoolTy   = &TheBoolTy;
342 Type *Type::SByteTy  = &TheSByteTy;
343 Type *Type::UByteTy  = &TheUByteTy;
344 Type *Type::ShortTy  = &TheShortTy;
345 Type *Type::UShortTy = &TheUShortTy;
346 Type *Type::IntTy    = &TheIntTy;
347 Type *Type::UIntTy   = &TheUIntTy;
348 Type *Type::LongTy   = &TheLongTy;
349 Type *Type::ULongTy  = &TheULongTy;
350 Type *Type::FloatTy  = &TheFloatTy;
351 Type *Type::DoubleTy = &TheDoubleTy;
352 Type *Type::TypeTy   = &TheTypeTy;
353 Type *Type::LabelTy  = &TheLabelTy;
354
355
356 //===----------------------------------------------------------------------===//
357 //                          Derived Type Constructors
358 //===----------------------------------------------------------------------===//
359
360 FunctionType::FunctionType(const Type *Result,
361                            const std::vector<const Type*> &Params, 
362                            bool IsVarArgs) : DerivedType(FunctionTyID), 
363     ResultType(PATypeHandle(Result, this)),
364     isVarArgs(IsVarArgs) {
365   bool isAbstract = Result->isAbstract();
366   ParamTys.reserve(Params.size());
367   for (unsigned i = 0; i < Params.size(); ++i) {
368     ParamTys.push_back(PATypeHandle(Params[i], this));
369     isAbstract |= Params[i]->isAbstract();
370   }
371
372   // Calculate whether or not this type is abstract
373   setAbstract(isAbstract);
374 }
375
376 StructType::StructType(const std::vector<const Type*> &Types)
377   : CompositeType(StructTyID) {
378   ETypes.reserve(Types.size());
379   bool isAbstract = false;
380   for (unsigned i = 0; i < Types.size(); ++i) {
381     assert(Types[i] != Type::VoidTy && "Void type in method prototype!!");
382     ETypes.push_back(PATypeHandle(Types[i], this));
383     isAbstract |= Types[i]->isAbstract();
384   }
385
386   // Calculate whether or not this type is abstract
387   setAbstract(isAbstract);
388 }
389
390 ArrayType::ArrayType(const Type *ElType, unsigned NumEl)
391   : SequentialType(ArrayTyID, ElType) {
392   NumElements = NumEl;
393
394   // Calculate whether or not this type is abstract
395   setAbstract(ElType->isAbstract());
396 }
397
398 PointerType::PointerType(const Type *E) : SequentialType(PointerTyID, E) {
399   // Calculate whether or not this type is abstract
400   setAbstract(E->isAbstract());
401 }
402
403 OpaqueType::OpaqueType() : DerivedType(OpaqueTyID) {
404   setAbstract(true);
405 #ifdef DEBUG_MERGE_TYPES
406   std::cerr << "Derived new type: " << *this << "\n";
407 #endif
408 }
409
410
411 // getAlwaysOpaqueTy - This function returns an opaque type.  It doesn't matter
412 // _which_ opaque type it is, but the opaque type must never get resolved.
413 //
414 static Type *getAlwaysOpaqueTy() {
415   static Type *AlwaysOpaqueTy = OpaqueType::get();
416   static PATypeHolder Holder(AlwaysOpaqueTy);
417   return AlwaysOpaqueTy;
418 }
419
420
421 //===----------------------------------------------------------------------===//
422 // dropAllTypeUses methods - These methods eliminate any possibly recursive type
423 // references from a derived type.  The type must remain abstract, so we make
424 // sure to use an always opaque type as an argument.
425 //
426
427 void FunctionType::dropAllTypeUses() {
428   ResultType = getAlwaysOpaqueTy();
429   ParamTys.clear();
430 }
431
432 void ArrayType::dropAllTypeUses() {
433   ElementType = getAlwaysOpaqueTy();
434 }
435
436 void StructType::dropAllTypeUses() {
437   ETypes.clear();
438   ETypes.push_back(PATypeHandle(getAlwaysOpaqueTy(), this));
439 }
440
441 void PointerType::dropAllTypeUses() {
442   ElementType = getAlwaysOpaqueTy();
443 }
444
445
446
447
448 // isTypeAbstract - This is a recursive function that walks a type hierarchy
449 // calculating whether or not a type is abstract.  Worst case it will have to do
450 // a lot of traversing if you have some whacko opaque types, but in most cases,
451 // it will do some simple stuff when it hits non-abstract types that aren't
452 // recursive.
453 //
454 bool Type::isTypeAbstract() {
455   if (!isAbstract())                           // Base case for the recursion
456     return false;                              // Primitive = leaf type
457   
458   if (isa<OpaqueType>(this))                   // Base case for the recursion
459     return true;                               // This whole type is abstract!
460
461   // We have to guard against recursion.  To do this, we temporarily mark this
462   // type as concrete, so that if we get back to here recursively we will think
463   // it's not abstract, and thus not scan it again.
464   setAbstract(false);
465
466   // Scan all of the sub-types.  If any of them are abstract, than so is this
467   // one!
468   for (Type::subtype_iterator I = subtype_begin(), E = subtype_end();
469        I != E; ++I)
470     if (const_cast<Type*>(*I)->isTypeAbstract()) {
471       setAbstract(true);        // Restore the abstract bit.
472       return true;              // This type is abstract if subtype is abstract!
473     }
474   
475   // Restore the abstract bit.
476   setAbstract(true);
477
478   // Nothing looks abstract here...
479   return false;
480 }
481
482
483 //===----------------------------------------------------------------------===//
484 //                      Type Structural Equality Testing
485 //===----------------------------------------------------------------------===//
486
487 // TypesEqual - Two types are considered structurally equal if they have the
488 // same "shape": Every level and element of the types have identical primitive
489 // ID's, and the graphs have the same edges/nodes in them.  Nodes do not have to
490 // be pointer equals to be equivalent though.  This uses an optimistic algorithm
491 // that assumes that two graphs are the same until proven otherwise.
492 //
493 static bool TypesEqual(const Type *Ty, const Type *Ty2,
494                        std::map<const Type *, const Type *> &EqTypes) {
495   if (Ty == Ty2) return true;
496   if (Ty->getPrimitiveID() != Ty2->getPrimitiveID()) return false;
497   if (isa<OpaqueType>(Ty))
498     return false;  // Two unequal opaque types are never equal
499
500   std::map<const Type*, const Type*>::iterator It = EqTypes.lower_bound(Ty);
501   if (It != EqTypes.end() && It->first == Ty)
502     return It->second == Ty2;    // Looping back on a type, check for equality
503
504   // Otherwise, add the mapping to the table to make sure we don't get
505   // recursion on the types...
506   EqTypes.insert(It, std::make_pair(Ty, Ty2));
507
508   // Two really annoying special cases that breaks an otherwise nice simple
509   // algorithm is the fact that arraytypes have sizes that differentiates types,
510   // and that function types can be varargs or not.  Consider this now.
511   //
512   if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
513     return TypesEqual(PTy->getElementType(),
514                       cast<PointerType>(Ty2)->getElementType(), EqTypes);
515   } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
516     const StructType::ElementTypes &STyE = STy->getElementTypes();
517     const StructType::ElementTypes &STyE2 =
518       cast<StructType>(Ty2)->getElementTypes();
519     if (STyE.size() != STyE2.size()) return false;
520     for (unsigned i = 0, e = STyE.size(); i != e; ++i)
521       if (!TypesEqual(STyE[i], STyE2[i], EqTypes))
522         return false;
523     return true;
524   } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
525     const ArrayType *ATy2 = cast<ArrayType>(Ty2);
526     return ATy->getNumElements() == ATy2->getNumElements() &&
527            TypesEqual(ATy->getElementType(), ATy2->getElementType(), EqTypes);
528   } else if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
529     const FunctionType *FTy2 = cast<FunctionType>(Ty2);
530     if (FTy->isVarArg() != FTy2->isVarArg() ||
531         FTy->getParamTypes().size() != FTy2->getParamTypes().size() ||
532         !TypesEqual(FTy->getReturnType(), FTy2->getReturnType(), EqTypes))
533       return false;
534     const FunctionType::ParamTypes &FTyP = FTy->getParamTypes();
535     const FunctionType::ParamTypes &FTy2P = FTy2->getParamTypes();
536     for (unsigned i = 0, e = FTyP.size(); i != e; ++i)
537       if (!TypesEqual(FTyP[i], FTy2P[i], EqTypes))
538         return false;
539     return true;
540   } else {
541     assert(0 && "Unknown derived type!");
542     return false;
543   }
544 }
545
546 static bool TypesEqual(const Type *Ty, const Type *Ty2) {
547   std::map<const Type *, const Type *> EqTypes;
548   return TypesEqual(Ty, Ty2, EqTypes);
549 }
550
551
552
553 //===----------------------------------------------------------------------===//
554 //                       Derived Type Factory Functions
555 //===----------------------------------------------------------------------===//
556
557 // TypeMap - Make sure that only one instance of a particular type may be
558 // created on any given run of the compiler... note that this involves updating
559 // our map if an abstract type gets refined somehow...
560 //
561 namespace llvm {
562 template<class ValType, class TypeClass>
563 class TypeMap {
564   typedef std::map<ValType, TypeClass *> MapTy;
565   MapTy Map;
566 public:
567   typedef typename MapTy::iterator iterator;
568   ~TypeMap() { print("ON EXIT"); }
569
570   inline TypeClass *get(const ValType &V) {
571     iterator I = Map.find(V);
572     return I != Map.end() ? I->second : 0;
573   }
574
575   inline void add(const ValType &V, TypeClass *T) {
576     Map.insert(std::make_pair(V, T));
577     print("add");
578   }
579
580   iterator getEntryForType(TypeClass *Ty) {
581     iterator I = Map.find(ValType::get(Ty));
582     if (I == Map.end()) print("ERROR!");
583     assert(I != Map.end() && "Didn't find type entry!");
584     assert(I->second == Ty && "Type entry wrong?");
585     return I;
586   }
587
588   /// finishRefinement - This method is called after we have updated an existing
589   /// type with its new components.  We must now either merge the type away with
590   /// some other type or reinstall it in the map with it's new configuration.
591   /// The specified iterator tells us what the type USED to look like.
592   void finishRefinement(iterator TyIt) {
593     TypeClass *Ty = TyIt->second;
594
595     // The old record is now out-of-date, because one of the children has been
596     // updated.  Remove the obsolete entry from the map.
597     Map.erase(TyIt);
598
599     // Determine whether there is a cycle through the type graph which passes
600     // back through this type.  Other cycles are ok though.
601     bool HasTypeCycle = false;
602     {
603       std::set<const Type*> VisitedTypes;
604       for (Type::subtype_iterator I = Ty->subtype_begin(),
605              E = Ty->subtype_end(); I != E; ++I) {
606         for (df_ext_iterator<const Type *, std::set<const Type*> > 
607                DFI = df_ext_begin(*I, VisitedTypes),
608                E = df_ext_end(*I, VisitedTypes); DFI != E; ++DFI)
609           if (*DFI == Ty) {
610             HasTypeCycle = true;
611             goto FoundCycle;
612           }
613       }
614     }
615   FoundCycle:
616
617     ValType Key = ValType::get(Ty);
618
619     // If there are no cycles going through this node, we can do a simple,
620     // efficient lookup in the map, instead of an inefficient nasty linear
621     // lookup.
622     if (!HasTypeCycle) {
623       iterator I = Map.find(Key);
624       if (I != Map.end()) {
625         // We already have this type in the table.  Get rid of the newly refined
626         // type.
627         assert(Ty->isAbstract() && "Replacing a non-abstract type?");
628         TypeClass *NewTy = I->second;
629         
630         // Refined to a different type altogether?
631         Ty->refineAbstractTypeTo(NewTy);
632         return;
633       }
634       
635     } else {
636       // Now we check to see if there is an existing entry in the table which is
637       // structurally identical to the newly refined type.  If so, this type
638       // gets refined to the pre-existing type.
639       //
640       for (iterator I = Map.begin(), E = Map.end(); I != E; ++I)
641         if (TypesEqual(Ty, I->second)) {
642           assert(Ty->isAbstract() && "Replacing a non-abstract type?");
643           TypeClass *NewTy = I->second;
644           
645           // Refined to a different type altogether?
646           Ty->refineAbstractTypeTo(NewTy);
647           return;
648         }
649     }
650
651     // If there is no existing type of the same structure, we reinsert an
652     // updated record into the map.
653     Map.insert(std::make_pair(Key, Ty));
654
655     // If the type is currently thought to be abstract, rescan all of our
656     // subtypes to see if the type has just become concrete!
657     if (Ty->isAbstract()) {
658       Ty->setAbstract(Ty->isTypeAbstract());
659
660       // If the type just became concrete, notify all users!
661       if (!Ty->isAbstract())
662         Ty->notifyUsesThatTypeBecameConcrete();
663     }
664   }
665   
666   void remove(const ValType &OldVal) {
667     iterator I = Map.find(OldVal);
668     assert(I != Map.end() && "TypeMap::remove, element not found!");
669     Map.erase(I);
670   }
671
672   void remove(iterator I) {
673     assert(I != Map.end() && "Cannot remove invalid iterator pointer!");
674     Map.erase(I);
675   }
676
677   void print(const char *Arg) const {
678 #ifdef DEBUG_MERGE_TYPES
679     std::cerr << "TypeMap<>::" << Arg << " table contents:\n";
680     unsigned i = 0;
681     for (typename MapTy::const_iterator I = Map.begin(), E = Map.end();
682          I != E; ++I)
683       std::cerr << " " << (++i) << ". " << (void*)I->second << " " 
684                 << *I->second << "\n";
685 #endif
686   }
687
688   void dump() const { print("dump output"); }
689 };
690 }
691
692
693 //===----------------------------------------------------------------------===//
694 // Function Type Factory and Value Class...
695 //
696
697 // FunctionValType - Define a class to hold the key that goes into the TypeMap
698 //
699 namespace llvm {
700 class FunctionValType {
701   const Type *RetTy;
702   std::vector<const Type*> ArgTypes;
703   bool isVarArg;
704 public:
705   FunctionValType(const Type *ret, const std::vector<const Type*> &args,
706                   bool IVA) : RetTy(ret), isVarArg(IVA) {
707     for (unsigned i = 0; i < args.size(); ++i)
708       ArgTypes.push_back(args[i]);
709   }
710
711   static FunctionValType get(const FunctionType *FT);
712
713   // Subclass should override this... to update self as usual
714   void doRefinement(const DerivedType *OldType, const Type *NewType) {
715     if (RetTy == OldType) RetTy = NewType;
716     for (unsigned i = 0, e = ArgTypes.size(); i != e; ++i)
717       if (ArgTypes[i] == OldType) ArgTypes[i] = NewType;
718   }
719
720   inline bool operator<(const FunctionValType &MTV) const {
721     if (RetTy < MTV.RetTy) return true;
722     if (RetTy > MTV.RetTy) return false;
723
724     if (ArgTypes < MTV.ArgTypes) return true;
725     return ArgTypes == MTV.ArgTypes && isVarArg < MTV.isVarArg;
726   }
727 };
728 }
729
730 // Define the actual map itself now...
731 static TypeMap<FunctionValType, FunctionType> FunctionTypes;
732
733 FunctionValType FunctionValType::get(const FunctionType *FT) {
734   // Build up a FunctionValType
735   std::vector<const Type *> ParamTypes;
736   ParamTypes.reserve(FT->getParamTypes().size());
737   for (unsigned i = 0, e = FT->getParamTypes().size(); i != e; ++i)
738     ParamTypes.push_back(FT->getParamType(i));
739   return FunctionValType(FT->getReturnType(), ParamTypes, FT->isVarArg());
740 }
741
742
743 // FunctionType::get - The factory function for the FunctionType class...
744 FunctionType *FunctionType::get(const Type *ReturnType, 
745                                 const std::vector<const Type*> &Params,
746                                 bool isVarArg) {
747   FunctionValType VT(ReturnType, Params, isVarArg);
748   FunctionType *MT = FunctionTypes.get(VT);
749   if (MT) return MT;
750
751   FunctionTypes.add(VT, MT = new FunctionType(ReturnType, Params, isVarArg));
752
753 #ifdef DEBUG_MERGE_TYPES
754   std::cerr << "Derived new type: " << MT << "\n";
755 #endif
756   return MT;
757 }
758
759 //===----------------------------------------------------------------------===//
760 // Array Type Factory...
761 //
762 namespace llvm {
763 class ArrayValType {
764   const Type *ValTy;
765   unsigned Size;
766 public:
767   ArrayValType(const Type *val, int sz) : ValTy(val), Size(sz) {}
768
769   static ArrayValType get(const ArrayType *AT) {
770     return ArrayValType(AT->getElementType(), AT->getNumElements());
771   }
772
773   // Subclass should override this... to update self as usual
774   void doRefinement(const DerivedType *OldType, const Type *NewType) {
775     assert(ValTy == OldType);
776     ValTy = NewType;
777   }
778
779   inline bool operator<(const ArrayValType &MTV) const {
780     if (Size < MTV.Size) return true;
781     return Size == MTV.Size && ValTy < MTV.ValTy;
782   }
783 };
784 }
785 static TypeMap<ArrayValType, ArrayType> ArrayTypes;
786
787
788 ArrayType *ArrayType::get(const Type *ElementType, unsigned NumElements) {
789   assert(ElementType && "Can't get array of null types!");
790
791   ArrayValType AVT(ElementType, NumElements);
792   ArrayType *AT = ArrayTypes.get(AVT);
793   if (AT) return AT;           // Found a match, return it!
794
795   // Value not found.  Derive a new type!
796   ArrayTypes.add(AVT, AT = new ArrayType(ElementType, NumElements));
797
798 #ifdef DEBUG_MERGE_TYPES
799   std::cerr << "Derived new type: " << *AT << "\n";
800 #endif
801   return AT;
802 }
803
804 //===----------------------------------------------------------------------===//
805 // Struct Type Factory...
806 //
807
808 namespace llvm {
809 // StructValType - Define a class to hold the key that goes into the TypeMap
810 //
811 class StructValType {
812   std::vector<const Type*> ElTypes;
813 public:
814   StructValType(const std::vector<const Type*> &args) : ElTypes(args) {}
815
816   static StructValType get(const StructType *ST) {
817     std::vector<const Type *> ElTypes;
818     ElTypes.reserve(ST->getElementTypes().size());
819     for (unsigned i = 0, e = ST->getElementTypes().size(); i != e; ++i)
820       ElTypes.push_back(ST->getElementTypes()[i]);
821     
822     return StructValType(ElTypes);
823   }
824
825   // Subclass should override this... to update self as usual
826   void doRefinement(const DerivedType *OldType, const Type *NewType) {
827     for (unsigned i = 0; i < ElTypes.size(); ++i)
828       if (ElTypes[i] == OldType) ElTypes[i] = NewType;
829   }
830
831   inline bool operator<(const StructValType &STV) const {
832     return ElTypes < STV.ElTypes;
833   }
834 };
835 }
836
837 static TypeMap<StructValType, StructType> StructTypes;
838
839 StructType *StructType::get(const std::vector<const Type*> &ETypes) {
840   StructValType STV(ETypes);
841   StructType *ST = StructTypes.get(STV);
842   if (ST) return ST;
843
844   // Value not found.  Derive a new type!
845   StructTypes.add(STV, ST = new StructType(ETypes));
846
847 #ifdef DEBUG_MERGE_TYPES
848   std::cerr << "Derived new type: " << *ST << "\n";
849 #endif
850   return ST;
851 }
852
853
854
855 //===----------------------------------------------------------------------===//
856 // Pointer Type Factory...
857 //
858
859 // PointerValType - Define a class to hold the key that goes into the TypeMap
860 //
861 namespace llvm {
862 class PointerValType {
863   const Type *ValTy;
864 public:
865   PointerValType(const Type *val) : ValTy(val) {}
866
867   static PointerValType get(const PointerType *PT) {
868     return PointerValType(PT->getElementType());
869   }
870
871   // Subclass should override this... to update self as usual
872   void doRefinement(const DerivedType *OldType, const Type *NewType) {
873     assert(ValTy == OldType);
874     ValTy = NewType;
875   }
876
877   bool operator<(const PointerValType &MTV) const {
878     return ValTy < MTV.ValTy;
879   }
880 };
881 }
882
883 static TypeMap<PointerValType, PointerType> PointerTypes;
884
885 PointerType *PointerType::get(const Type *ValueType) {
886   assert(ValueType && "Can't get a pointer to <null> type!");
887   PointerValType PVT(ValueType);
888
889   PointerType *PT = PointerTypes.get(PVT);
890   if (PT) return PT;
891
892   // Value not found.  Derive a new type!
893   PointerTypes.add(PVT, PT = new PointerType(ValueType));
894
895 #ifdef DEBUG_MERGE_TYPES
896   std::cerr << "Derived new type: " << *PT << "\n";
897 #endif
898   return PT;
899 }
900
901 namespace llvm {
902 void debug_type_tables() {
903   FunctionTypes.dump();
904   ArrayTypes.dump();
905   StructTypes.dump();
906   PointerTypes.dump();
907 }
908 }
909
910 //===----------------------------------------------------------------------===//
911 //                     Derived Type Refinement Functions
912 //===----------------------------------------------------------------------===//
913
914 // removeAbstractTypeUser - Notify an abstract type that a user of the class
915 // no longer has a handle to the type.  This function is called primarily by
916 // the PATypeHandle class.  When there are no users of the abstract type, it
917 // is annihilated, because there is no way to get a reference to it ever again.
918 //
919 void DerivedType::removeAbstractTypeUser(AbstractTypeUser *U) const {
920   // Search from back to front because we will notify users from back to
921   // front.  Also, it is likely that there will be a stack like behavior to
922   // users that register and unregister users.
923   //
924   unsigned i;
925   for (i = AbstractTypeUsers.size(); AbstractTypeUsers[i-1] != U; --i)
926     assert(i != 0 && "AbstractTypeUser not in user list!");
927
928   --i;  // Convert to be in range 0 <= i < size()
929   assert(i < AbstractTypeUsers.size() && "Index out of range!");  // Wraparound?
930
931   AbstractTypeUsers.erase(AbstractTypeUsers.begin()+i);
932       
933 #ifdef DEBUG_MERGE_TYPES
934   std::cerr << "  remAbstractTypeUser[" << (void*)this << ", "
935             << *this << "][" << i << "] User = " << U << "\n";
936 #endif
937     
938   if (AbstractTypeUsers.empty() && RefCount == 0 && isAbstract()) {
939 #ifdef DEBUG_MERGE_TYPES
940     std::cerr << "DELETEing unused abstract type: <" << *this
941               << ">[" << (void*)this << "]" << "\n";
942 #endif
943     delete this;                  // No users of this abstract type!
944   }
945 }
946
947
948 // refineAbstractTypeTo - This function is used to when it is discovered that
949 // the 'this' abstract type is actually equivalent to the NewType specified.
950 // This causes all users of 'this' to switch to reference the more concrete type
951 // NewType and for 'this' to be deleted.
952 //
953 void DerivedType::refineAbstractTypeTo(const Type *NewType) {
954   assert(isAbstract() && "refineAbstractTypeTo: Current type is not abstract!");
955   assert(this != NewType && "Can't refine to myself!");
956   assert(ForwardType == 0 && "This type has already been refined!");
957
958   // The descriptions may be out of date.  Conservatively clear them all!
959   AbstractTypeDescriptions.clear();
960
961 #ifdef DEBUG_MERGE_TYPES
962   std::cerr << "REFINING abstract type [" << (void*)this << " "
963             << *this << "] to [" << (void*)NewType << " "
964             << *NewType << "]!\n";
965 #endif
966
967   // Make sure to put the type to be refined to into a holder so that if IT gets
968   // refined, that we will not continue using a dead reference...
969   //
970   PATypeHolder NewTy(NewType);
971
972   // Any PATypeHolders referring to this type will now automatically forward to
973   // the type we are resolved to.
974   ForwardType = NewType;
975   if (NewType->isAbstract())
976     cast<DerivedType>(NewType)->addRef();
977
978   // Add a self use of the current type so that we don't delete ourself until
979   // after the function exits.
980   //
981   PATypeHolder CurrentTy(this);
982
983   // To make the situation simpler, we ask the subclass to remove this type from
984   // the type map, and to replace any type uses with uses of non-abstract types.
985   // This dramatically limits the amount of recursive type trouble we can find
986   // ourselves in.
987   dropAllTypeUses();
988
989   // Iterate over all of the uses of this type, invoking callback.  Each user
990   // should remove itself from our use list automatically.  We have to check to
991   // make sure that NewTy doesn't _become_ 'this'.  If it does, resolving types
992   // will not cause users to drop off of the use list.  If we resolve to ourself
993   // we succeed!
994   //
995   while (!AbstractTypeUsers.empty() && NewTy != this) {
996     AbstractTypeUser *User = AbstractTypeUsers.back();
997
998     unsigned OldSize = AbstractTypeUsers.size();
999 #ifdef DEBUG_MERGE_TYPES
1000     std::cerr << " REFINING user " << OldSize-1 << "[" << (void*)User
1001               << "] of abstract type [" << (void*)this << " "
1002               << *this << "] to [" << (void*)NewTy.get() << " "
1003               << *NewTy << "]!\n";
1004 #endif
1005     User->refineAbstractType(this, NewTy);
1006
1007     assert(AbstractTypeUsers.size() != OldSize &&
1008            "AbsTyUser did not remove self from user list!");
1009   }
1010
1011   // If we were successful removing all users from the type, 'this' will be
1012   // deleted when the last PATypeHolder is destroyed or updated from this type.
1013   // This may occur on exit of this function, as the CurrentTy object is
1014   // destroyed.
1015 }
1016
1017 // notifyUsesThatTypeBecameConcrete - Notify AbstractTypeUsers of this type that
1018 // the current type has transitioned from being abstract to being concrete.
1019 //
1020 void DerivedType::notifyUsesThatTypeBecameConcrete() {
1021 #ifdef DEBUG_MERGE_TYPES
1022   std::cerr << "typeIsREFINED type: " << (void*)this << " " << *this << "\n";
1023 #endif
1024
1025   unsigned OldSize = AbstractTypeUsers.size();
1026   while (!AbstractTypeUsers.empty()) {
1027     AbstractTypeUser *ATU = AbstractTypeUsers.back();
1028     ATU->typeBecameConcrete(this);
1029
1030     assert(AbstractTypeUsers.size() < OldSize-- &&
1031            "AbstractTypeUser did not remove itself from the use list!");
1032   }
1033 }
1034   
1035
1036
1037
1038 // refineAbstractType - Called when a contained type is found to be more
1039 // concrete - this could potentially change us from an abstract type to a
1040 // concrete type.
1041 //
1042 void FunctionType::refineAbstractType(const DerivedType *OldType,
1043                                       const Type *NewType) {
1044   assert((isAbstract() || !OldType->isAbstract()) &&
1045          "Refining a non-abstract type!");
1046 #ifdef DEBUG_MERGE_TYPES
1047   std::cerr << "FunctionTy::refineAbstractTy(" << (void*)OldType << "[" 
1048             << *OldType << "], " << (void*)NewType << " [" 
1049             << *NewType << "])\n";
1050 #endif
1051
1052   // Look up our current type map entry..
1053   TypeMap<FunctionValType, FunctionType>::iterator TMI =
1054     FunctionTypes.getEntryForType(this);
1055
1056   // Find the type element we are refining...
1057   if (ResultType == OldType) {
1058     ResultType.removeUserFromConcrete();
1059     ResultType = NewType;
1060   }
1061   for (unsigned i = 0, e = ParamTys.size(); i != e; ++i)
1062     if (ParamTys[i] == OldType) {
1063       ParamTys[i].removeUserFromConcrete();
1064       ParamTys[i] = NewType;
1065     }
1066
1067   FunctionTypes.finishRefinement(TMI);
1068 }
1069
1070 void FunctionType::typeBecameConcrete(const DerivedType *AbsTy) {
1071   refineAbstractType(AbsTy, AbsTy);
1072 }
1073
1074
1075 // refineAbstractType - Called when a contained type is found to be more
1076 // concrete - this could potentially change us from an abstract type to a
1077 // concrete type.
1078 //
1079 void ArrayType::refineAbstractType(const DerivedType *OldType,
1080                                    const Type *NewType) {
1081   assert((isAbstract() || !OldType->isAbstract()) &&
1082          "Refining a non-abstract type!");
1083 #ifdef DEBUG_MERGE_TYPES
1084   std::cerr << "ArrayTy::refineAbstractTy(" << (void*)OldType << "[" 
1085             << *OldType << "], " << (void*)NewType << " [" 
1086             << *NewType << "])\n";
1087 #endif
1088
1089   // Look up our current type map entry..
1090   TypeMap<ArrayValType, ArrayType>::iterator TMI =
1091     ArrayTypes.getEntryForType(this);
1092
1093   assert(getElementType() == OldType);
1094   ElementType.removeUserFromConcrete();
1095   ElementType = NewType;
1096
1097   ArrayTypes.finishRefinement(TMI);
1098 }
1099
1100 void ArrayType::typeBecameConcrete(const DerivedType *AbsTy) {
1101   refineAbstractType(AbsTy, AbsTy);
1102 }
1103
1104
1105 // refineAbstractType - Called when a contained type is found to be more
1106 // concrete - this could potentially change us from an abstract type to a
1107 // concrete type.
1108 //
1109 void StructType::refineAbstractType(const DerivedType *OldType,
1110                                     const Type *NewType) {
1111   assert((isAbstract() || !OldType->isAbstract()) &&
1112          "Refining a non-abstract type!");
1113 #ifdef DEBUG_MERGE_TYPES
1114   std::cerr << "StructTy::refineAbstractTy(" << (void*)OldType << "[" 
1115             << *OldType << "], " << (void*)NewType << " [" 
1116             << *NewType << "])\n";
1117 #endif
1118
1119   // Look up our current type map entry..
1120   TypeMap<StructValType, StructType>::iterator TMI =
1121     StructTypes.getEntryForType(this);
1122
1123   for (int i = ETypes.size()-1; i >= 0; --i)
1124     if (ETypes[i] == OldType) {
1125       ETypes[i].removeUserFromConcrete();
1126
1127       // Update old type to new type in the array...
1128       ETypes[i] = NewType;
1129     }
1130
1131   StructTypes.finishRefinement(TMI);
1132 }
1133
1134 void StructType::typeBecameConcrete(const DerivedType *AbsTy) {
1135   refineAbstractType(AbsTy, AbsTy);
1136 }
1137
1138 // refineAbstractType - Called when a contained type is found to be more
1139 // concrete - this could potentially change us from an abstract type to a
1140 // concrete type.
1141 //
1142 void PointerType::refineAbstractType(const DerivedType *OldType,
1143                                      const Type *NewType) {
1144   assert((isAbstract() || !OldType->isAbstract()) &&
1145          "Refining a non-abstract type!");
1146 #ifdef DEBUG_MERGE_TYPES
1147   std::cerr << "PointerTy::refineAbstractTy(" << (void*)OldType << "[" 
1148             << *OldType << "], " << (void*)NewType << " [" 
1149             << *NewType << "])\n";
1150 #endif
1151
1152   // Look up our current type map entry..
1153   TypeMap<PointerValType, PointerType>::iterator TMI =
1154     PointerTypes.getEntryForType(this);
1155
1156   assert(ElementType == OldType);
1157   ElementType.removeUserFromConcrete();
1158   ElementType = NewType;
1159
1160   PointerTypes.finishRefinement(TMI);
1161 }
1162
1163 void PointerType::typeBecameConcrete(const DerivedType *AbsTy) {
1164   refineAbstractType(AbsTy, AbsTy);
1165 }