1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Add hooks to free all memory allocated by the singleton factories in these

files.  Patch contributed by Morten Ofstad!

llvm-svn: 17995
This commit is contained in:
Chris Lattner 2004-11-19 16:39:44 +00:00
parent 783a12cad5
commit 7a2566c4ff
2 changed files with 68 additions and 0 deletions

View File

@ -612,6 +612,16 @@ namespace {
typedef std::map<const TypeClass*, MapIterator> AbstractTypeMapTy;
AbstractTypeMapTy AbstractTypeMap;
friend void Constant::clearAllValueMaps();
private:
void clear(std::vector<Constant *> &Constants) {
for(MapIterator I = Map.begin(); I != Map.end(); ++I)
Constants.push_back(I->second);
Map.clear();
AbstractTypeMap.clear();
}
public:
// getOrCreate - Return the specified constant from the map, creating it if
// necessary.
@ -1401,3 +1411,29 @@ const char *ConstantExpr::getOpcodeName() const {
return Instruction::getOpcodeName(getOpcode());
}
/// clearAllValueMaps - This method frees all internal memory used by the
/// constant subsystem, which can be used in environments where this memory
/// is otherwise reported as a leak.
void Constant::clearAllValueMaps() {
std::vector<Constant *> Constants;
DoubleConstants.clear(Constants);
FloatConstants.clear(Constants);
SIntConstants.clear(Constants);
UIntConstants.clear(Constants);
AggZeroConstants.clear(Constants);
ArrayConstants.clear(Constants);
StructConstants.clear(Constants);
PackedConstants.clear(Constants);
NullPtrConstants.clear(Constants);
UndefValueConstants.clear(Constants);
ExprConstants.clear(Constants);
for (std::vector<Constant *>::iterator I = Constants.begin(),
E = Constants.end(); I != E; ++I)
(*I)->dropAllReferences();
for (std::vector<Constant *>::iterator I = Constants.begin(),
E = Constants.end(); I != E; ++I)
(*I)->destroyConstantImpl();
Constants.clear();
}

View File

@ -656,6 +656,17 @@ class TypeMap {
/// this map.
///
std::multimap<unsigned, PATypeHolder> TypesByHash;
friend void Type::clearAllTypeMaps();
private:
void clear(std::vector<Type *> &DerivedTypes) {
for (typename std::map<ValType, PATypeHolder>::iterator I = Map.begin(),
E = Map.end(); I != E; ++I)
DerivedTypes.push_back(I->second.get());
TypesByHash.clear();
Map.clear();
}
public:
typedef typename std::map<ValType, PATypeHolder>::iterator iterator;
~TypeMap() { print("ON EXIT"); }
@ -1301,4 +1312,25 @@ std::ostream &operator<<(std::ostream &OS, const Type &T) {
}
}
/// clearAllTypeMaps - This method frees all internal memory used by the
/// type subsystem, which can be used in environments where this memory is
/// otherwise reported as a leak.
void Type::clearAllTypeMaps() {
std::vector<Type *> DerivedTypes;
FunctionTypes.clear(DerivedTypes);
PointerTypes.clear(DerivedTypes);
StructTypes.clear(DerivedTypes);
ArrayTypes.clear(DerivedTypes);
PackedTypes.clear(DerivedTypes);
for(std::vector<Type *>::iterator I = DerivedTypes.begin(),
E = DerivedTypes.end(); I != E; ++I)
(*I)->ContainedTys.clear();
for(std::vector<Type *>::iterator I = DerivedTypes.begin(),
E = DerivedTypes.end(); I != E; ++I)
delete *I;
DerivedTypes.clear();
}
// vim: sw=2