[llvm] r255831 - Simplify memory management with std::unique_ptr.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 16 21:20:01 PST 2015


On Thu, Dec 17, 2015 at 9:28 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Wed Dec 16 16:28:34 2015
> New Revision: 255831
>
> URL: http://llvm.org/viewvc/llvm-project?rev=255831&view=rev
> Log:
> Simplify memory management with std::unique_ptr.
>
> Modified:
>     llvm/trunk/include/llvm/ADT/Statistic.h
>     llvm/trunk/lib/Support/Statistic.cpp
>     llvm/trunk/lib/Support/Timer.cpp
>
> Modified: llvm/trunk/include/llvm/ADT/Statistic.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Statistic.h?rev=255831&r1=255830&r2=255831&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/Statistic.h (original)
> +++ llvm/trunk/include/llvm/ADT/Statistic.h Wed Dec 16 16:28:34 2015
> @@ -28,9 +28,11 @@
>
>  #include "llvm/Support/Atomic.h"
>  #include "llvm/Support/Valgrind.h"
> +#include <memory>
>
>  namespace llvm {
>  class raw_ostream;
> +class raw_fd_ostream;
>
>  class Statistic {
>  public:
> @@ -170,6 +172,9 @@ void EnableStatistics();
>  /// \brief Check if statistics are enabled.
>  bool AreStatisticsEnabled();
>
> +/// \brief Return a file stream to print our output on.
> +std::unique_ptr<raw_fd_ostream> CreateInfoOutputFile();
> +
>  /// \brief Print statistics to the file returned by
> CreateInfoOutputFile().
>  void PrintStatistics();
>
>
> Modified: llvm/trunk/lib/Support/Statistic.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Statistic.cpp?rev=255831&r1=255830&r2=255831&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Statistic.cpp (original)
> +++ llvm/trunk/lib/Support/Statistic.cpp Wed Dec 16 16:28:34 2015
> @@ -34,9 +34,6 @@
>  #include <cstring>
>  using namespace llvm;
>
> -// CreateInfoOutputFile - Return a file stream to print our output on.
> -namespace llvm { extern raw_ostream *CreateInfoOutputFile(); }
> -
>  /// -stats - Command line option to cause transformations to emit stats
> about
>  /// what they did.
>  ///
> @@ -145,20 +142,18 @@ void llvm::PrintStatistics() {
>    if (Stats.Stats.empty()) return;
>
>    // Get the stream to write to.
> -  raw_ostream &OutStream = *CreateInfoOutputFile();
> -  PrintStatistics(OutStream);
> -  delete &OutStream;   // Close the file.
> +  std::unique_ptr<raw_ostream> OutStream = CreateInfoOutputFile();
> +  PrintStatistics(*OutStream);
>

Looks like now that this doesn't need explicit cleanup, you could remove
the variable, but that might be a bit unclear:

PrintStatistics(*CreateInfoOutputFile());

Can (or is it already) raw_ostream be made movable? In which case
CretaeInfoInputFile could return by value? (but I guess then you couldn't
take a non-const ref to it to pass it to something else anyway...)



> +
>  #else
>    // Check if the -stats option is set instead of checking
>    // !Stats.Stats.empty().  In release builds, Statistics operators
>    // do nothing, so stats are never Registered.
>    if (Enabled) {
>      // Get the stream to write to.
> -    raw_ostream &OutStream = *CreateInfoOutputFile();
> -    OutStream << "Statistics are disabled.  "
> -            << "Build with asserts or with -DLLVM_ENABLE_STATS\n";
> -    OutStream.flush();
> -    delete &OutStream;   // Close the file.
> +    std::unique_ptr<raw_ostream> OutStream = CreateInfoOutputFile();
> +    (*OutStream) << "Statistics are disabled.  "
> +                 << "Build with asserts or with -DLLVM_ENABLE_STATS\n";
>    }
>  #endif
>  }
>
> Modified: llvm/trunk/lib/Support/Timer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Timer.cpp?rev=255831&r1=255830&r2=255831&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Timer.cpp (original)
> +++ llvm/trunk/lib/Support/Timer.cpp Wed Dec 16 16:28:34 2015
> @@ -12,6 +12,7 @@
>
>  //===----------------------------------------------------------------------===//
>
>  #include "llvm/Support/Timer.h"
> +#include "llvm/ADT/Statistic.h"
>  #include "llvm/ADT/StringMap.h"
>  #include "llvm/Support/CommandLine.h"
>  #include "llvm/Support/FileSystem.h"
> @@ -22,9 +23,6 @@
>  #include "llvm/Support/raw_ostream.h"
>  using namespace llvm;
>
> -// CreateInfoOutputFile - Return a file stream to print our output on.
> -namespace llvm { extern raw_ostream *CreateInfoOutputFile(); }
> -
>  // getLibSupportInfoOutputFilename - This ugly hack is brought to you
> courtesy
>  // of constructor/destructor ordering being unspecified by C++.
> Basically the
>  // problem is that a Statistic object gets destroyed, which ends up
> calling
> @@ -52,28 +50,27 @@ namespace {
>                     cl::Hidden,
> cl::location(getLibSupportInfoOutputFilename()));
>  }
>
> -// CreateInfoOutputFile - Return a file stream to print our output on.
> -raw_ostream *llvm::CreateInfoOutputFile() {
> +// Return a file stream to print our output on.
> +std::unique_ptr<raw_fd_ostream> llvm::CreateInfoOutputFile() {
>    const std::string &OutputFilename = getLibSupportInfoOutputFilename();
>    if (OutputFilename.empty())
> -    return new raw_fd_ostream(2, false); // stderr.
> +    return llvm::make_unique<raw_fd_ostream>(2, false); // stderr.
>    if (OutputFilename == "-")
> -    return new raw_fd_ostream(1, false); // stdout.
> -
> +    return llvm::make_unique<raw_fd_ostream>(1, false); // stdout.
> +
>    // Append mode is used because the info output file is opened and closed
>    // each time -stats or -time-passes wants to print output to it. To
>    // compensate for this, the test-suite Makefiles have code to delete the
>    // info output file before running commands which write to it.
>    std::error_code EC;
> -  raw_ostream *Result = new raw_fd_ostream(OutputFilename, EC,
> -                                           sys::fs::F_Append |
> sys::fs::F_Text);
> +  auto Result = llvm::make_unique<raw_fd_ostream>(
> +      OutputFilename, EC, sys::fs::F_Append | sys::fs::F_Text);
>    if (!EC)
>      return Result;
> -
> +
>    errs() << "Error opening info-output-file '"
>      << OutputFilename << " for appending!\n";
> -  delete Result;
> -  return new raw_fd_ostream(2, false); // stderr.
> +  return llvm::make_unique<raw_fd_ostream>(2, false); // stderr.
>  }
>
>
> @@ -292,10 +289,9 @@ void TimerGroup::removeTimer(Timer &T) {
>    // them were started.
>    if (FirstTimer || TimersToPrint.empty())
>      return;
> -
> -  raw_ostream *OutStream = CreateInfoOutputFile();
> +
> +  std::unique_ptr<raw_ostream> OutStream = CreateInfoOutputFile();
>    PrintQueuedTimers(*OutStream);
> -  delete OutStream;   // Close the file.
>  }
>
>  void TimerGroup::addTimer(Timer &T) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151217/d1cd0d85/attachment.html>


More information about the llvm-commits mailing list