Skip to content
Snippets Groups Projects
Commit 68ef6943 authored by Chris Lattner's avatar Chris Lattner
Browse files

stop leaking all named struct types with an empty name. Thanks

to Benjamin Kramer for steering me in the right direction here.

llvm-svn: 135031
parent 3517f142
No related branches found
No related tags found
No related merge requests found
......@@ -81,14 +81,12 @@ LLVMContextImpl::~LLVMContextImpl() {
SmallVector<MDNode*, 8> MDNodes;
MDNodes.reserve(MDNodeSet.size() + NonUniquedMDNodes.size());
for (FoldingSetIterator<MDNode> I = MDNodeSet.begin(), E = MDNodeSet.end();
I != E; ++I) {
I != E; ++I)
MDNodes.push_back(&*I);
}
MDNodes.append(NonUniquedMDNodes.begin(), NonUniquedMDNodes.end());
for (SmallVectorImpl<MDNode *>::iterator I = MDNodes.begin(),
E = MDNodes.end(); I != E; ++I) {
E = MDNodes.end(); I != E; ++I)
(*I)->destroy();
}
assert(MDNodeSet.empty() && NonUniquedMDNodes.empty() &&
"Destroying all MDNodes didn't empty the Context's sets.");
// Destroy MDStrings.
......@@ -103,7 +101,10 @@ LLVMContextImpl::~LLVMContextImpl() {
DeleteContainerSeconds(PointerTypes);
DeleteContainerSeconds(ASPointerTypes);
for (StringMap<StructType *>::iterator I = NamedStructTypes.begin(), E = NamedStructTypes.end(); I != E; ++I) {
for (StringMap<StructType *>::iterator I = NamedStructTypes.begin(),
E = NamedStructTypes.end(); I != E; ++I)
delete I->getValue();
}
for (SmallPtrSet<StructType*, 16>::iterator I = EmptyNamedStructTypes.begin(),
E = EmptyNamedStructTypes.end(); I != E; ++I)
delete *I;
}
......@@ -179,6 +179,7 @@ public:
std::map<std::vector<Type*>, FunctionType*> FunctionTypes;
std::map<std::vector<Type*>, StructType*> AnonStructTypes;
StringMap<StructType*> NamedStructTypes;
SmallPtrSet<StructType*, 16> EmptyNamedStructTypes;
unsigned NamedStructTypesUniqueID;
DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes;
......
......@@ -412,7 +412,10 @@ void StructType::setBody(ArrayRef<Type*> Elements, bool isPacked) {
StructType *StructType::createNamed(LLVMContext &Context, StringRef Name) {
StructType *ST = new StructType(Context);
ST->setName(Name);
if (!Name.empty())
ST->setName(Name);
else
Context.pImpl->EmptyNamedStructTypes.insert(ST);
return ST;
}
......@@ -423,11 +426,16 @@ void StructType::setName(StringRef Name) {
if (SymbolTableEntry) {
getContext().pImpl->NamedStructTypes.erase(getName());
SymbolTableEntry = 0;
} else {
getContext().pImpl->EmptyNamedStructTypes.erase(this);
}
// If this is just removing the name, we're done.
if (Name.empty())
if (Name.empty()) {
// Keep track of types with no names so we can free them.
getContext().pImpl->EmptyNamedStructTypes.insert(this);
return;
}
// Look up the entry for the name.
StringMapEntry<StructType*> *Entry =
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment