summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCContext.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-03-15 06:15:35 +0000
committerChris Lattner <sabre@nondot.org>2010-03-15 06:15:35 +0000
commit133487696abe700b10a096680db651b37c6b8846 (patch)
tree534bec27466954615e2add43352b214313f57a72 /llvm/lib/MC/MCContext.cpp
parent0db1d6500ac67c372fe55f2a82daadecc873df98 (diff)
downloadbcm5719-llvm-133487696abe700b10a096680db651b37c6b8846.tar.gz
bcm5719-llvm-133487696abe700b10a096680db651b37c6b8846.zip
fix a memory leak yjasskin pointed out: MCSymbol is bump pointer
allocated and thus not freed. This is cool except that it contains and std::string so the string data didn't get freed. In any case there is no reason to redundantly store the string data in the MCSymbol anyway, just make the MCSymbol ref the string data in the MCContext StringMap. llvm-svn: 98536
Diffstat (limited to 'llvm/lib/MC/MCContext.cpp')
-rw-r--r--llvm/lib/MC/MCContext.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index ae9a30a95f4..70c89a2333a 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -23,18 +23,25 @@ MCContext::~MCContext() {
// we don't need to free them here.
}
-MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name) {
+MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name, bool isTemporary) {
assert(!Name.empty() && "Normal symbols cannot be unnamed!");
- MCSymbol *&Entry = Symbols[Name];
- if (Entry) return Entry;
+
+ // Do the lookup and get the entire StringMapEntry. We want access to the
+ // key if we are creating the entry.
+ StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
+ if (Entry.getValue()) return Entry.getValue();
- return Entry = new (*this) MCSymbol(Name, false);
+ // Ok, the entry doesn't already exist. Have the MCSymbol object itself refer
+ // to the copy of the string that is embedded in the StringMapEntry.
+ MCSymbol *Result = new (*this) MCSymbol(Entry.getKey(), isTemporary);
+ Entry.setValue(Result);
+ return Result;
}
-MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name) {
+MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name, bool isTemporary) {
SmallString<128> NameSV;
Name.toVector(NameSV);
- return GetOrCreateSymbol(NameSV.str());
+ return GetOrCreateSymbol(NameSV.str(), isTemporary);
}
MCSymbol *MCContext::CreateTempSymbol() {
@@ -50,10 +57,7 @@ MCSymbol *MCContext::GetOrCreateTemporarySymbol(StringRef Name) {
return GetOrCreateTemporarySymbol(Twine(MAI.getPrivateGlobalPrefix()) +
"tmp" + Twine(NextUniqueID++));
- // Otherwise create as usual.
- MCSymbol *&Entry = Symbols[Name];
- if (Entry) return Entry;
- return Entry = new (*this) MCSymbol(Name, true);
+ return GetOrCreateSymbol(Name, true);
}
MCSymbol *MCContext::GetOrCreateTemporarySymbol(const Twine &Name) {
OpenPOWER on IntegriCloud