summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2014-04-24 14:33:36 +0000
committerDavid Blaikie <dblaikie@gmail.com>2014-04-24 14:33:36 +0000
commit293a2a3ada165cdfa55b4cf98ec1201907aea5ee (patch)
treef76497572d82d5684ef1ac4581d309b126eb2805 /llvm/lib/MC
parentf4aee52345951578ae6e1a049feeb354a7aa5377 (diff)
downloadbcm5719-llvm-293a2a3ada165cdfa55b4cf98ec1201907aea5ee.tar.gz
bcm5719-llvm-293a2a3ada165cdfa55b4cf98ec1201907aea5ee.zip
Fix memory leak of MCSymbolData in MCAsmStreamer.
Leak identified by LSan and reported by Kostya Serebryany. Let's get a bit experimental here... in theory our minimum compiler versions support unordered_map. llvm-svn: 207118
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/MCAsmStreamer.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 265d73dde3a..62a9e826744 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -9,6 +9,7 @@
#include "llvm/MC/MCStreamer.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCAsmBackend.h"
@@ -31,6 +32,7 @@
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Path.h"
#include <cctype>
+#include <unordered_map>
using namespace llvm;
namespace {
@@ -57,7 +59,9 @@ private:
EHPrivateExtern = 1 << 2 };
DenseMap<const MCSymbol*, unsigned> FlagMap;
- DenseMap<const MCSymbol*, MCSymbolData*> SymbolMap;
+ // Using std::unordered_map to ensure pointers to MCSymbolData remain valid
+ // over insertions/removals from the SymbolMap.
+ std::unordered_map<const MCSymbol*, MCSymbolData> SymbolMap;
void EmitRegisterName(int64_t Register);
void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
@@ -76,7 +80,6 @@ public:
if (InstPrinter && IsVerboseAsm)
InstPrinter->setCommentStream(CommentStream);
}
- ~MCAsmStreamer() {}
inline void EmitEOL() {
// If we don't have any comments, just emit a \n.
@@ -1470,12 +1473,11 @@ void MCAsmStreamer::FinishImpl() {
}
MCSymbolData &MCAsmStreamer::getOrCreateSymbolData(const MCSymbol *Symbol) {
- MCSymbolData *&Entry = SymbolMap[Symbol];
-
- if (!Entry)
- Entry = new MCSymbolData(*Symbol, nullptr, 0, nullptr);
-
- return *Entry;
+ auto Iter = SymbolMap.find(Symbol);
+ if (Iter == SymbolMap.end())
+ Iter = SymbolMap.insert(
+ Iter, std::make_pair(Symbol, MCSymbolData(*Symbol, nullptr, 0)));
+ return Iter->second;
}
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
OpenPOWER on IntegriCloud