[llvm] r207118 - Fix memory leak of MCSymbolData in MCAsmStreamer.
NAKAMURA Takumi
geek4civic at gmail.com
Thu Apr 24 08:52:50 PDT 2014
Thanks! test/MC became fine!
2014-04-24 23:33 GMT+09:00 David Blaikie <dblaikie at gmail.com>:
> Author: dblaikie
> Date: Thu Apr 24 09:33:36 2014
> New Revision: 207118
>
> URL: http://llvm.org/viewvc/llvm-project?rev=207118&view=rev
> Log:
> 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.
>
> Modified:
> llvm/trunk/lib/MC/MCAsmStreamer.cpp
>
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=207118&r1=207117&r2=207118&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Thu Apr 24 09:33:36 2014
> @@ -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,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list