summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: a05d37e)
raw | patch | inline | side by side (parent: a05d37e)
author | David Blaikie <dblaikie@gmail.com> | |
Thu, 24 Apr 2014 14:33:36 +0000 (14:33 +0000) | ||
committer | David Blaikie <dblaikie@gmail.com> | |
Thu, 24 Apr 2014 14:33:36 +0000 (14:33 +0000) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207118 91177308-0d34-0410-b5e6-96231b3b80d8
Let's get a bit experimental here... in theory our minimum compiler
versions support unordered_map.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207118 91177308-0d34-0410-b5e6-96231b3b80d8
lib/MC/MCAsmStreamer.cpp | patch | blob | history |
index 265d73dde3aac1a15862229983911206cf45aeb0..62a9e826744e63b98348b8dc367aa6de5e98edc2 100644 (file)
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
#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"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Path.h"
#include <cctype>
+#include <unordered_map>
using namespace llvm;
namespace {
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;
if (InstPrinter && IsVerboseAsm)
InstPrinter->setCommentStream(CommentStream);
}
- ~MCAsmStreamer() {}
inline void EmitEOL() {
// If we don't have any comments, just emit a \n.
}
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,