1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

finish cleaning up StructLayoutMap.

llvm-svn: 91612
This commit is contained in:
Chris Lattner 2009-12-17 20:00:21 +00:00
parent 9afe974318
commit b944c6eca5

View File

@ -321,18 +321,24 @@ class StructLayoutMap : public AbstractTypeUser {
typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
LayoutInfoTy LayoutInfo;
void RemoveEntry(LayoutInfoTy::iterator I, bool WasAbstract) {
I->second->~StructLayout();
free(I->second);
if (WasAbstract)
I->first->removeAbstractTypeUser(this);
LayoutInfo.erase(I);
}
/// refineAbstractType - The callback method invoked when an abstract type is
/// resolved to another type. An object must override this method to update
/// its internal state to reference NewType instead of OldType.
///
virtual void refineAbstractType(const DerivedType *OldTy,
const Type *) {
const StructType *STy = cast<const StructType>(OldTy);
LayoutInfoTy::iterator Iter = LayoutInfo.find(STy);
Iter->second->~StructLayout();
free(Iter->second);
LayoutInfo.erase(Iter);
OldTy->removeAbstractTypeUser(this);
LayoutInfoTy::iterator I = LayoutInfo.find(cast<const StructType>(OldTy));
assert(I != LayoutInfo.end() && "Using type but not in map?");
RemoveEntry(I, true);
}
/// typeBecameConcrete - The other case which AbstractTypeUsers must be aware
@ -341,12 +347,9 @@ class StructLayoutMap : public AbstractTypeUser {
/// This method notifies ATU's when this occurs for a type.
///
virtual void typeBecameConcrete(const DerivedType *AbsTy) {
const StructType *STy = cast<const StructType>(AbsTy);
LayoutInfoTy::iterator Iter = LayoutInfo.find(STy);
Iter->second->~StructLayout();
free(Iter->second);
LayoutInfo.erase(Iter);
AbsTy->removeAbstractTypeUser(this);
LayoutInfoTy::iterator I = LayoutInfo.find(cast<const StructType>(AbsTy));
assert(I != LayoutInfo.end() && "Using type but not in map?");
RemoveEntry(I, true);
}
public:
@ -368,13 +371,7 @@ public:
void InvalidateEntry(const StructType *Ty) {
LayoutInfoTy::iterator I = LayoutInfo.find(Ty);
if (I == LayoutInfo.end()) return;
I->second->~StructLayout();
free(I->second);
LayoutInfo.erase(I);
if (Ty->isAbstract())
Ty->removeAbstractTypeUser(this);
RemoveEntry(I, Ty->isAbstract());
}
StructLayout *&operator[](const StructType *STy) {
@ -424,8 +421,7 @@ const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
if (!LayoutMap) return; // No cache.
StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
STM->InvalidateEntry(Ty);
static_cast<StructLayoutMap*>(LayoutMap)->InvalidateEntry(Ty);
}
std::string TargetData::getStringRepresentation() const {