Simplify memory management with std::unique_ptr.

llvm-svn: 255831
This commit is contained in:
Rafael Espindola 2015-12-16 22:28:34 +00:00
parent 533336a368
commit b94ab5ffbd
3 changed files with 23 additions and 27 deletions

View File

@ -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();

View File

@ -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);
#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. "
std::unique_ptr<raw_ostream> OutStream = CreateInfoOutputFile();
(*OutStream) << "Statistics are disabled. "
<< "Build with asserts or with -DLLVM_ENABLE_STATS\n";
OutStream.flush();
delete &OutStream; // Close the file.
}
#endif
}

View File

@ -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.
}
@ -293,9 +290,8 @@ void TimerGroup::removeTimer(Timer &T) {
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) {