Explicitly pass ownership of the MemoryBuffer to AddNewSourceBuffer using std::unique_ptr
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 21 Aug 2014 20:44:56 +0000 (20:44 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 21 Aug 2014 20:44:56 +0000 (20:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216223 91177308-0d34-0410-b5e6-96231b3b80d8

12 files changed:
include/llvm/Support/SourceMgr.h
lib/AsmParser/Parser.cpp
lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
lib/MC/MCParser/AsmParser.cpp
lib/Object/IRObjectFile.cpp
lib/Support/SourceMgr.cpp
lib/Support/YAMLParser.cpp
lib/TableGen/Main.cpp
tools/llvm-mc/llvm-mc.cpp
tools/llvm-mcmarkup/llvm-mcmarkup.cpp
unittests/Support/SourceMgrTest.cpp
utils/FileCheck/FileCheck.cpp

index 4717553bd0de13ee47f478d7ae896eeee9fb65a2..19dad6b6ac5366470ac2e586d413f1cb9406dbff 100644 (file)
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/Twine.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/SMLoc.h"
 #include <string>
 
 namespace llvm {
-  class MemoryBuffer;
   class SourceMgr;
   class SMDiagnostic;
   class SMFixIt;
@@ -47,7 +47,7 @@ public:
 private:
   struct SrcBuffer {
     /// The memory buffer for the file.
-    MemoryBuffer *Buffer;
+    std::unique_ptr<MemoryBuffer> Buffer;
 
     /// This is the location of the parent include, or null if at the top level.
     SMLoc IncludeLoc;
@@ -96,7 +96,7 @@ public:
 
   const MemoryBuffer *getMemoryBuffer(unsigned i) const {
     assert(isValidBufferID(i));
-    return Buffers[i - 1].Buffer;
+    return Buffers[i - 1].Buffer.get();
   }
 
   unsigned getNumBuffers() const {
@@ -115,11 +115,12 @@ public:
 
   /// Add a new source buffer to this source manager. This takes ownership of
   /// the memory buffer.
-  unsigned AddNewSourceBuffer(MemoryBuffer *F, SMLoc IncludeLoc) {
+  unsigned AddNewSourceBuffer(std::unique_ptr<MemoryBuffer> F,
+                              SMLoc IncludeLoc) {
     SrcBuffer NB;
-    NB.Buffer = F;
+    NB.Buffer = std::move(F);
     NB.IncludeLoc = IncludeLoc;
-    Buffers.push_back(NB);
+    Buffers.push_back(std::move(NB));
     return Buffers.size();
   }
 
index 9bc9b241666e1f83a84c46bdf88badbe881ab159..d2384bd978d0adaa38fe708e46635005068bbf8d 100644 (file)
@@ -25,7 +25,7 @@ bool llvm::parseAssemblyInto(std::unique_ptr<MemoryBuffer> F, Module &M,
                              SMDiagnostic &Err) {
   SourceMgr SM;
   StringRef Buf = F->getBuffer();
-  SM.AddNewSourceBuffer(F.release(), SMLoc());
+  SM.AddNewSourceBuffer(std::move(F), SMLoc());
 
   return LLParser(Buf, SM, Err, &M).Run();
 }
index 7d0cb6b45d1ced1115983015a606064d5d489d72..35a2842c70fad11a005a6483cd31b36e28d7cf90 100644 (file)
@@ -110,14 +110,12 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode,
     HasDiagHandler = true;
   }
 
-  MemoryBuffer *Buffer;
-  if (isNullTerminated)
-    Buffer = MemoryBuffer::getMemBuffer(Str, "<inline asm>");
-  else
-    Buffer = MemoryBuffer::getMemBufferCopy(Str, "<inline asm>");
+  std::unique_ptr<MemoryBuffer> Buffer(
+      isNullTerminated ? MemoryBuffer::getMemBuffer(Str, "<inline asm>")
+                       : MemoryBuffer::getMemBufferCopy(Str, "<inline asm>"));
 
   // Tell SrcMgr about this buffer, it takes ownership of the buffer.
-  SrcMgr.AddNewSourceBuffer(Buffer, SMLoc());
+  SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc());
 
   std::unique_ptr<MCAsmParser> Parser(
       createMCAsmParser(SrcMgr, OutContext, OutStreamer, *MAI));
index aafc5e1850e9385d2c1fec9dc862b43b29dfba9c..5e44266e26ebc15242d7a217abc4bf1919ffcd19 100644 (file)
@@ -2123,8 +2123,8 @@ bool AsmParser::handleMacroEntry(const MCAsmMacro *M, SMLoc NameLoc) {
   // instantiation.
   OS << ".endmacro\n";
 
-  MemoryBuffer *Instantiation =
-      MemoryBuffer::getMemBufferCopy(OS.str(), "<instantiation>");
+  std::unique_ptr<MemoryBuffer> Instantiation(
+      MemoryBuffer::getMemBufferCopy(OS.str(), "<instantiation>"));
 
   // Create the macro instantiation object and add to the current macro
   // instantiation stack.
@@ -2134,7 +2134,7 @@ bool AsmParser::handleMacroEntry(const MCAsmMacro *M, SMLoc NameLoc) {
   ActiveMacros.push_back(MI);
 
   // Jump to the macro instantiation and prime the lexer.
-  CurBuffer = SrcMgr.AddNewSourceBuffer(Instantiation, SMLoc());
+  CurBuffer = SrcMgr.AddNewSourceBuffer(std::move(Instantiation), SMLoc());
   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)->getBuffer());
   Lex();
 
@@ -4310,8 +4310,8 @@ void AsmParser::instantiateMacroLikeBody(MCAsmMacro *M, SMLoc DirectiveLoc,
                                          raw_svector_ostream &OS) {
   OS << ".endr\n";
 
-  MemoryBuffer *Instantiation =
-      MemoryBuffer::getMemBufferCopy(OS.str(), "<instantiation>");
+  std::unique_ptr<MemoryBuffer> Instantiation(
+      MemoryBuffer::getMemBufferCopy(OS.str(), "<instantiation>"));
 
   // Create the macro instantiation object and add to the current macro
   // instantiation stack.
@@ -4321,7 +4321,7 @@ void AsmParser::instantiateMacroLikeBody(MCAsmMacro *M, SMLoc DirectiveLoc,
   ActiveMacros.push_back(MI);
 
   // Jump to the macro instantiation and prime the lexer.
-  CurBuffer = SrcMgr.AddNewSourceBuffer(Instantiation, SMLoc());
+  CurBuffer = SrcMgr.AddNewSourceBuffer(std::move(Instantiation), SMLoc());
   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)->getBuffer());
   Lex();
 }
index d6b4b6bd257516d1a5716a197d5804fd2d5d3045..2ef359c7f00d132d3bad4db09fe09f6b543ee8b0 100644 (file)
@@ -75,7 +75,7 @@ IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> Mod)
 
   std::unique_ptr<MemoryBuffer> Buffer(MemoryBuffer::getMemBuffer(InlineAsm));
   SourceMgr SrcMgr;
-  SrcMgr.AddNewSourceBuffer(Buffer.release(), SMLoc());
+  SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc());
   std::unique_ptr<MCAsmParser> Parser(
       createMCAsmParser(SrcMgr, MCCtx, *Streamer, *MAI));
 
index 003cb56e6cb5f22afa5b6f022f104ecf8f1d5325..f3a422c9d27c4f2dd6e0d0231f25af14e0c4259a 100644 (file)
@@ -42,11 +42,6 @@ SourceMgr::~SourceMgr() {
   // Delete the line # cache if allocated.
   if (LineNoCacheTy *Cache = getCache(LineNoCache))
     delete Cache;
-
-  while (!Buffers.empty()) {
-    delete Buffers.back().Buffer;
-    Buffers.pop_back();
-  }
 }
 
 unsigned SourceMgr::AddIncludeFile(const std::string &Filename,
@@ -67,7 +62,7 @@ unsigned SourceMgr::AddIncludeFile(const std::string &Filename,
   if (!NewBufOrErr)
     return 0;
 
-  return AddNewSourceBuffer(NewBufOrErr.get().release(), IncludeLoc);
+  return AddNewSourceBuffer(std::move(*NewBufOrErr), IncludeLoc);
 }
 
 unsigned SourceMgr::FindBufferContainingLoc(SMLoc Loc) const {
index 01cd926297a99f60944fda5e6019335d90c1bf36..07a326ee554f1f5edde4d207cd28fa45a25f4d62 100644 (file)
@@ -708,8 +708,10 @@ Scanner::Scanner(StringRef Input, SourceMgr &sm)
   , IsStartOfStream(true)
   , IsSimpleKeyAllowed(true)
   , Failed(false) {
-  InputBuffer = MemoryBuffer::getMemBuffer(Input, "YAML");
-  SM.AddNewSourceBuffer(InputBuffer, SMLoc());
+  std::unique_ptr<MemoryBuffer> InputBufferOwner(
+      MemoryBuffer::getMemBuffer(Input, "YAML"));
+  InputBuffer = InputBufferOwner.get();
+  SM.AddNewSourceBuffer(std::move(InputBufferOwner), SMLoc());
   Current = InputBuffer->getBufferStart();
   End = InputBuffer->getBufferEnd();
 }
@@ -719,7 +721,7 @@ Scanner::Scanner(std::unique_ptr<MemoryBuffer> Buffer, SourceMgr &SM_)
       Current(InputBuffer->getBufferStart()), End(InputBuffer->getBufferEnd()),
       Indent(-1), Column(0), Line(0), FlowLevel(0), IsStartOfStream(true),
       IsSimpleKeyAllowed(true), Failed(false) {
-  SM.AddNewSourceBuffer(Buffer.release(), SMLoc());
+  SM.AddNewSourceBuffer(std::move(Buffer), SMLoc());
 }
 
 Token &Scanner::peekNext() {
index e317fbfa373da2070fea70ee3f0f5dd2c4ffa760..d9c5601a5da4518057d7d801b0b9af4cff5ea3e2 100644 (file)
@@ -88,10 +88,9 @@ int TableGenMain(char *argv0, TableGenMainFn *MainFn) {
            << "': " << EC.message() << "\n";
     return 1;
   }
-  MemoryBuffer *F = FileOrErr.get().release();
 
   // Tell SrcMgr about this buffer, which is what TGParser will pick up.
-  SrcMgr.AddNewSourceBuffer(F, SMLoc());
+  SrcMgr.AddNewSourceBuffer(std::move(*FileOrErr), SMLoc());
 
   // Record the location of the include directory so that the lexer can find
   // it later.
index 4c5b230573b200d099071072f910906de7e52de2..42cde6e16f4c0d191d059922acc224c95490508e 100644 (file)
@@ -373,12 +373,12 @@ int main(int argc, char **argv) {
     errs() << ProgName << ": " << EC.message() << '\n';
     return 1;
   }
-  MemoryBuffer *Buffer = BufferPtr->release();
+  MemoryBuffer *Buffer = BufferPtr->get();
 
   SourceMgr SrcMgr;
 
   // Tell SrcMgr about this buffer, which is what the parser will pick up.
-  SrcMgr.AddNewSourceBuffer(Buffer, SMLoc());
+  SrcMgr.AddNewSourceBuffer(std::move(*BufferPtr), SMLoc());
 
   // Record the location of the include directories so that the lexer can find
   // it later.
index a878f1157d570961107df7359640fccdeb87e221..56543139d6faccad5cc56a6f12c8223f078348e3 100644 (file)
@@ -141,14 +141,15 @@ static void parseMCMarkup(StringRef Filename) {
     errs() << ToolName << ": " << EC.message() << '\n';
     return;
   }
-  MemoryBuffer *Buffer = BufferPtr->release();
+  std::unique_ptr<MemoryBuffer> &Buffer = BufferPtr.get();
 
   SourceMgr SrcMgr;
 
+  StringRef InputSource = Buffer->getBuffer();
+
   // Tell SrcMgr about this buffer, which is what the parser will pick up.
-  SrcMgr.AddNewSourceBuffer(Buffer, SMLoc());
+  SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc());
 
-  StringRef InputSource = Buffer->getBuffer();
   MarkupLexer Lex(InputSource);
   MarkupParser Parser(Lex, SrcMgr);
 
index 2b69fe984445ead0da586d1fb5ae4224d256ab79..26310c11ddbaa12f0730433e1b9f93d519795bb4 100644 (file)
@@ -23,8 +23,9 @@ public:
   std::string Output;
 
   void setMainBuffer(StringRef Text, StringRef BufferName) {
-    MemoryBuffer *MainBuffer = MemoryBuffer::getMemBuffer(Text, BufferName);
-    MainBufferID = SM.AddNewSourceBuffer(MainBuffer, llvm::SMLoc());
+    std::unique_ptr<MemoryBuffer> MainBuffer(
+        MemoryBuffer::getMemBuffer(Text, BufferName));
+    MainBufferID = SM.AddNewSourceBuffer(std::move(MainBuffer), llvm::SMLoc());
   }
 
   SMLoc getLoc(unsigned Offset) {
index e8365fc248af03e635242482128d784ae77178d5..9203c4cf33c89be1a883a4428b0db8a5b60354c5 100644 (file)
@@ -636,8 +636,9 @@ struct CheckString {
 ///
 /// \param PreserveHorizontal Don't squash consecutive horizontal whitespace
 /// characters to a single space.
-static MemoryBuffer *CanonicalizeInputFile(std::unique_ptr<MemoryBuffer> MB,
-                                           bool PreserveHorizontal) {
+static std::unique_ptr<MemoryBuffer>
+CanonicalizeInputFile(std::unique_ptr<MemoryBuffer> MB,
+                      bool PreserveHorizontal) {
   SmallString<128> NewFile;
   NewFile.reserve(MB->getBufferSize());
 
@@ -662,8 +663,8 @@ static MemoryBuffer *CanonicalizeInputFile(std::unique_ptr<MemoryBuffer> MB,
       ++Ptr;
   }
 
-  return MemoryBuffer::getMemBufferCopy(NewFile.str(),
-                                        MB->getBufferIdentifier());
+  return std::unique_ptr<MemoryBuffer>(
+      MemoryBuffer::getMemBufferCopy(NewFile.str(), MB->getBufferIdentifier()));
 }
 
 static bool IsPartOfWord(char c) {
@@ -838,25 +839,25 @@ static bool ReadCheckFile(SourceMgr &SM,
 
   // If we want to canonicalize whitespace, strip excess whitespace from the
   // buffer containing the CHECK lines. Remove DOS style line endings.
-  MemoryBuffer *F = CanonicalizeInputFile(std::move(FileOrErr.get()),
-                                          NoCanonicalizeWhiteSpace);
-
-  SM.AddNewSourceBuffer(F, SMLoc());
+  std::unique_ptr<MemoryBuffer> F =
+      CanonicalizeInputFile(std::move(*FileOrErr), NoCanonicalizeWhiteSpace);
 
   // Find all instances of CheckPrefix followed by : in the file.
   StringRef Buffer = F->getBuffer();
 
+  SM.AddNewSourceBuffer(std::move(F), SMLoc());
+
   std::vector<Pattern> ImplicitNegativeChecks;
   for (const auto &PatternString : ImplicitCheckNot) {
     // Create a buffer with fake command line content in order to display the
     // command line option responsible for the specific implicit CHECK-NOT.
     std::string Prefix = std::string("-") + ImplicitCheckNot.ArgStr + "='";
     std::string Suffix = "'";
-    MemoryBuffer *CmdLine = MemoryBuffer::getMemBufferCopy(
-        Prefix + PatternString + Suffix, "command line");
+    std::unique_ptr<MemoryBuffer> CmdLine(MemoryBuffer::getMemBufferCopy(
+        Prefix + PatternString + Suffix, "command line"));
     StringRef PatternInBuffer =
         CmdLine->getBuffer().substr(Prefix.size(), PatternString.size());
-    SM.AddNewSourceBuffer(CmdLine, SMLoc());
+    SM.AddNewSourceBuffer(std::move(CmdLine), SMLoc());
 
     ImplicitNegativeChecks.push_back(Pattern(Check::CheckNot));
     ImplicitNegativeChecks.back().ParsePattern(PatternInBuffer,
@@ -1272,18 +1273,18 @@ int main(int argc, char **argv) {
 
   // Remove duplicate spaces in the input file if requested.
   // Remove DOS style line endings.
-  MemoryBuffer *F =
-    CanonicalizeInputFile(std::move(File), NoCanonicalizeWhiteSpace);
-
-  SM.AddNewSourceBuffer(F, SMLoc());
-
-  /// VariableTable - This holds all the current filecheck variables.
-  StringMap<StringRef> VariableTable;
+  std::unique_ptr<MemoryBuffer> F =
+      CanonicalizeInputFile(std::move(File), NoCanonicalizeWhiteSpace);
 
   // Check that we have all of the expected strings, in order, in the input
   // file.
   StringRef Buffer = F->getBuffer();
 
+  SM.AddNewSourceBuffer(std::move(F), SMLoc());
+
+  /// VariableTable - This holds all the current filecheck variables.
+  StringMap<StringRef> VariableTable;
+
   bool hasError = false;
 
   unsigned i = 0, j = 0, e = CheckStrings.size();