aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-09-05 02:21:39 +0000
committerChris Lattner <sabre@nondot.org>2003-09-05 02:21:39 +0000
commit169726b1138ce2e8a4cbccac87fe7b5969831e9f (patch)
treedcf5ea0964ba3f80d4e1c9d413db7aab2ec14908
parentf2bbe376102d64857209f95261eb559b5c4574b5 (diff)
Check in a bunch of minor fixes, plus a whole lot of #if 0'd out code, which will hopefully be enabled in the near future
This does not make any functionality changes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8355 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/Type.cpp188
1 files changed, 163 insertions, 25 deletions
diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp
index bf902c112f..6a9bef21f1 100644
--- a/lib/VMCore/Type.cpp
+++ b/lib/VMCore/Type.cpp
@@ -1,4 +1,4 @@
-//===-- Type.cpp - Implement the Type class ----------------------*- C++ -*--=//
+//===-- Type.cpp - Implement the Type class -------------------------------===//
//
// This file implements the Type class for the VMCore library.
//
@@ -451,7 +451,7 @@ static bool TypesEqual(const Type *Ty, const Type *Ty2,
// Two really annoying special cases that breaks an otherwise nice simple
// algorithm is the fact that arraytypes have sizes that differentiates types,
- // and that method types can be varargs or not. Consider this now.
+ // and that function types can be varargs or not. Consider this now.
if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
if (ATy->getNumElements() != cast<ArrayType>(Ty2)->getNumElements())
return false;
@@ -483,13 +483,12 @@ class TypeMap : public AbstractTypeUser {
typedef std::map<ValType, PATypeHandle> MapTy;
MapTy Map;
public:
+ typedef typename MapTy::iterator iterator;
~TypeMap() { print("ON EXIT"); }
inline TypeClass *get(const ValType &V) {
- typename std::map<ValType, PATypeHandle>::iterator I
- = Map.find(V);
- // TODO: FIXME: When Types are not CONST.
- return (I != Map.end()) ? (TypeClass*)I->second.get() : 0;
+ iterator I = Map.find(V);
+ return I != Map.end() ? (TypeClass*)I->second.get() : 0;
}
inline void add(const ValType &V, TypeClass *T) {
@@ -497,13 +496,26 @@ public:
print("add");
}
+ iterator getEntryForType(TypeClass *Ty) {
+ iterator I = Map.find(ValType::get(Ty));
+ if (I == Map.end()) print("ERROR!");
+ assert(I != Map.end() && "Didn't find type entry!");
+ return I;
+ }
+
// containsEquivalent - Return true if the typemap contains a type that is
// structurally equivalent to the specified type.
//
- inline const TypeClass *containsEquivalent(const TypeClass *Ty) {
- for (typename MapTy::iterator I = Map.begin(), E = Map.end(); I != E; ++I)
- if (I->second.get() != Ty && TypesEqual(Ty, I->second.get()))
- return (TypeClass*)I->second.get();
+ inline TypeClass *containsEquivalent(TypeClass *Ty) { //iterator TyIt) {
+ //const TypeClass *Ty = (const TypeClass*)TyIt->second.get();
+ for (iterator I = Map.begin(), E = Map.end(); I != E; ++I)
+ if (I->second.get() != Ty && TypesEqual(Ty, I->second.get())) {
+ TypeClass *New = (TypeClass*)I->second.get();
+#if 0
+ Map.erase(TyIt); // The old entry is now dead!
+#endif
+ return New;
+ }
return 0;
}
@@ -518,8 +530,8 @@ public:
<< *OldTy << " replacement == " << (void*)NewTy
<< ", " << *NewTy << "\n";
#endif
- for (typename MapTy::iterator I = Map.begin(), E = Map.end(); I != E; ++I)
- if (I->second == OldTy) {
+ for (iterator I = Map.begin(), E = Map.end(); I != E; ++I)
+ if (I->second.get() == OldTy) {
// Check to see if the type just became concrete. If so, remove self
// from user list.
I->second.removeUserFromConcrete();
@@ -528,18 +540,24 @@ public:
}
void remove(const ValType &OldVal) {
- typename MapTy::iterator I = Map.find(OldVal);
+ iterator I = Map.find(OldVal);
assert(I != Map.end() && "TypeMap::remove, element not found!");
Map.erase(I);
}
+ void remove(iterator I) {
+ assert(I != Map.end() && "Cannot remove invalid iterator pointer!");
+ Map.erase(I);
+ }
+
void print(const char *Arg) const {
#ifdef DEBUG_MERGE_TYPES
std::cerr << "TypeMap<>::" << Arg << " table contents:\n";
unsigned i = 0;
- for (MapTy::const_iterator I = Map.begin(), E = Map.end(); I != E; ++I)
- std::cerr << " " << (++i) << ". " << I->second << " "
- << *I->second << "\n";
+ for (typename MapTy::const_iterator I = Map.begin(), E = Map.end();
+ I != E; ++I)
+ std::cerr << " " << (++i) << ". " << (void*)I->second.get() << " "
+ << *I->second.get() << "\n";
#endif
}
@@ -622,6 +640,8 @@ public:
ArgTypes.push_back(PATypeHandle(MVT.ArgTypes[i], this));
}
+ static FunctionValType get(const FunctionType *FT);
+
// Subclass should override this... to update self as usual
virtual void doRefinement(const DerivedType *OldType, const Type *NewType) {
if (RetTy == OldType) RetTy = NewType;
@@ -648,6 +668,17 @@ public:
// Define the actual map itself now...
static TypeMap<FunctionValType, FunctionType> FunctionTypes;
+FunctionValType FunctionValType::get(const FunctionType *FT) {
+ // Build up a FunctionValType
+ std::vector<const Type *> ParamTypes;
+ ParamTypes.reserve(FT->getParamTypes().size());
+ for (unsigned i = 0, e = FT->getParamTypes().size(); i != e; ++i)
+ ParamTypes.push_back(FT->getParamType(i));
+ return FunctionValType(FT->getReturnType(), ParamTypes, FT->isVarArg(),
+ FunctionTypes);
+}
+
+
// FunctionType::get - The factory function for the FunctionType class...
FunctionType *FunctionType::get(const Type *ReturnType,
const std::vector<const Type*> &Params,
@@ -664,6 +695,17 @@ FunctionType *FunctionType::get(const Type *ReturnType,
return MT;
}
+void FunctionType::dropAllTypeUses(bool inMap) {
+#if 0
+ //if (inMap) FunctionTypes.remove(FunctionTypes.getEntryForType(this));
+
+ // Drop all uses of other types, which might be recursive.
+ ResultType = Type::VoidTy;
+ ParamTys.clear();
+#endif
+}
+
+
//===----------------------------------------------------------------------===//
// Array Type Factory...
//
@@ -681,6 +723,9 @@ public:
: ValTypeBase<ArrayValType, ArrayType>(AVT), ValTy(AVT.ValTy, this),
Size(AVT.Size) {}
+ static ArrayValType get(const ArrayType *AT);
+
+
// Subclass should override this... to update self as usual
virtual void doRefinement(const DerivedType *OldType, const Type *NewType) {
assert(ValTy == OldType);
@@ -701,6 +746,11 @@ public:
static TypeMap<ArrayValType, ArrayType> ArrayTypes;
+ArrayValType ArrayValType::get(const ArrayType *AT) {
+ return ArrayValType(AT->getElementType(), AT->getNumElements(), ArrayTypes);
+}
+
+
ArrayType *ArrayType::get(const Type *ElementType, unsigned NumElements) {
assert(ElementType && "Can't get array of null types!");
@@ -717,6 +767,16 @@ ArrayType *ArrayType::get(const Type *ElementType, unsigned NumElements) {
return AT;
}
+void ArrayType::dropAllTypeUses(bool inMap) {
+#if 0
+ //if (inMap) ArrayTypes.remove(ArrayTypes.getEntryForType(this));
+ ElementType = Type::IntTy;
+#endif
+}
+
+
+
+
//===----------------------------------------------------------------------===//
// Struct Type Factory...
//
@@ -744,6 +804,8 @@ public:
ElTypes.push_back(PATypeHandle(SVT.ElTypes[i], this));
}
+ static StructValType get(const StructType *ST);
+
// Subclass should override this... to update self as usual
virtual void doRefinement(const DerivedType *OldType, const Type *NewType) {
for (unsigned i = 0; i < ElTypes.size(); ++i)
@@ -763,6 +825,17 @@ public:
static TypeMap<StructValType, StructType> StructTypes;
+StructValType StructValType::get(const StructType *ST) {
+ std::vector<const Type *> ElTypes;
+ ElTypes.reserve(ST->getElementTypes().size());
+ for (unsigned i = 0, e = ST->getElementTypes().size(); i != e; ++i)
+ ElTypes.push_back(ST->getElementTypes()[i]);
+
+ return StructValType(ElTypes, StructTypes);
+}
+
+
+
StructType *StructType::get(const std::vector<const Type*> &ETypes) {
StructValType STV(ETypes, StructTypes);
StructType *ST = StructTypes.get(STV);
@@ -777,6 +850,15 @@ StructType *StructType::get(const std::vector<const Type*> &ETypes) {
return ST;
}
+void StructType::dropAllTypeUses(bool inMap) {
+#if 0
+ //if (inMap) StructTypes.remove(StructTypes.getEntryForType(this));
+ ETypes.clear();
+#endif
+}
+
+
+
//===----------------------------------------------------------------------===//
// Pointer Type Factory...
//
@@ -795,6 +877,8 @@ public:
PointerValType(const PointerValType &PVT)
: ValTypeBase<PointerValType, PointerType>(PVT), ValTy(PVT.ValTy, this) {}
+ static PointerValType get(const PointerType *PT);
+
// Subclass should override this... to update self as usual
virtual void doRefinement(const DerivedType *OldType, const Type *NewType) {
assert(ValTy == OldType);
@@ -814,6 +898,11 @@ public:
static TypeMap<PointerValType, PointerType> PointerTypes;
+PointerValType PointerValType::get(const PointerType *PT) {
+ return PointerValType(PT->getElementType(), PointerTypes);
+}
+
+
PointerType *PointerType::get(const Type *ValueType) {
assert(ValueType && "Can't get a pointer to <null> type!");
PointerValType PVT(ValueType, PointerTypes);
@@ -830,6 +919,13 @@ PointerType *PointerType::get(const Type *ValueType) {
return PT;
}
+void PointerType::dropAllTypeUses(bool inMap) {
+#if 0
+ //if (inMap) PointerTypes.remove(PointerTypes.getEntryForType(this));
+ ElementType = Type::IntTy;
+#endif
+}
+
void debug_type_tables() {
FunctionTypes.dump();
ArrayTypes.dump();
@@ -891,12 +987,12 @@ void DerivedType::removeAbstractTypeUser(AbstractTypeUser *U) const {
}
-// refineAbstractTypeTo - This function is used to when it is discovered that
-// the 'this' abstract type is actually equivalent to the NewType specified.
-// This causes all users of 'this' to switch to reference the more concrete
-// type NewType and for 'this' to be deleted.
+// refineAbstractTypeToInternal - This function is used to when it is discovered
+// that the 'this' abstract type is actually equivalent to the NewType
+// specified. This causes all users of 'this' to switch to reference the more
+// concrete type NewType and for 'this' to be deleted.
//
-void DerivedType::refineAbstractTypeTo(const Type *NewType) {
+void DerivedType::refineAbstractTypeToInternal(const Type *NewType, bool inMap){
assert(isAbstract() && "refineAbstractTypeTo: Current type is not abstract!");
assert(this != NewType && "Can't refine to myself!");
@@ -924,6 +1020,14 @@ void DerivedType::refineAbstractTypeTo(const Type *NewType) {
//
addAbstractTypeUser(this);
+#if 0
+ // To make the situation simpler, we ask the subclass to remove this type from
+ // the type map, and to replace any type uses with uses of non-abstract types.
+ // This dramatically limits the amount of recursive type trouble we can find
+ // ourselves in.
+ dropAllTypeUses(inMap);
+#endif
+
// Count the number of self uses. Stop looping when sizeof(list) == NSU.
unsigned NumSelfUses = 0;
@@ -972,6 +1076,10 @@ void DerivedType::refineAbstractTypeTo(const Type *NewType) {
//
assert((NewTy == this || AbstractTypeUsers.back() == this) &&
"Only self uses should be left!");
+
+#if 0
+ assert(AbstractTypeUsers.size() == 1 && "This type should get deleted!");
+#endif
removeAbstractTypeUser(this);
}
@@ -1054,6 +1162,14 @@ void FunctionType::refineAbstractType(const DerivedType *OldType,
<< *OldType << "], " << (void*)NewType << " ["
<< *NewType << "])\n";
#endif
+
+ // Look up our current type map entry..
+#if 0
+ TypeMap<FunctionValType, FunctionType>::iterator TMI =
+ FunctionTypes.getEntryForType(this);
+ assert(TMI->second == this);
+#endif
+
// Find the type element we are refining...
if (ResultType == OldType) {
ResultType.removeUserFromConcrete();
@@ -1066,7 +1182,7 @@ void FunctionType::refineAbstractType(const DerivedType *OldType,
}
if (const FunctionType *MT = FunctionTypes.containsEquivalent(this)) {
- refineAbstractTypeTo(MT); // Different type altogether...
+ refineAbstractTypeToInternal(MT, false); // Different type altogether...
} else {
// If the type is currently thought to be abstract, rescan all of our
// subtypes to see if the type has just become concrete!
@@ -1088,12 +1204,19 @@ void ArrayType::refineAbstractType(const DerivedType *OldType,
<< *NewType << "])\n";
#endif
+#if 0
+ // Look up our current type map entry..
+ TypeMap<ArrayValType, ArrayType>::iterator TMI =
+ ArrayTypes.getEntryForType(this);
+ assert(TMI->second == this);
+#endif
+
assert(getElementType() == OldType);
ElementType.removeUserFromConcrete();
ElementType = NewType;
if (const ArrayType *AT = ArrayTypes.containsEquivalent(this)) {
- refineAbstractTypeTo(AT); // Different type altogether...
+ refineAbstractTypeToInternal(AT, false); // Different type altogether...
} else {
// If the type is currently thought to be abstract, rescan all of our
// subtypes to see if the type has just become concrete!
@@ -1114,6 +1237,14 @@ void StructType::refineAbstractType(const DerivedType *OldType,
<< *OldType << "], " << (void*)NewType << " ["
<< *NewType << "])\n";
#endif
+
+#if 0
+ // Look up our current type map entry..
+ TypeMap<StructValType, StructType>::iterator TMI =
+ StructTypes.getEntryForType(this);
+ assert(TMI->second == this);
+#endif
+
for (int i = ETypes.size()-1; i >= 0; --i)
if (ETypes[i] == OldType) {
ETypes[i].removeUserFromConcrete();
@@ -1123,7 +1254,7 @@ void StructType::refineAbstractType(const DerivedType *OldType,
}
if (const StructType *ST = StructTypes.containsEquivalent(this)) {
- refineAbstractTypeTo(ST); // Different type altogether...
+ refineAbstractTypeToInternal(ST, false); // Different type altogether...
} else {
// If the type is currently thought to be abstract, rescan all of our
// subtypes to see if the type has just become concrete!
@@ -1144,12 +1275,19 @@ void PointerType::refineAbstractType(const DerivedType *OldType,
<< *NewType << "])\n";
#endif
+#if 0
+ // Look up our current type map entry..
+ TypeMap<PointerValType, PointerType>::iterator TMI =
+ PointerTypes.getEntryForType(this);
+ assert(TMI->second == this);
+#endif
+
assert(ElementType == OldType);
ElementType.removeUserFromConcrete();
ElementType = NewType;
if (const PointerType *PT = PointerTypes.containsEquivalent(this)) {
- refineAbstractTypeTo(PT); // Different type altogether...
+ refineAbstractTypeToInternal(PT, false); // Different type altogether...
} else {
// If the type is currently thought to be abstract, rescan all of our
// subtypes to see if the type has just become concrete!