diff options
Diffstat (limited to 'lib/Support/Timer.cpp')
-rw-r--r-- | lib/Support/Timer.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/Support/Timer.cpp b/lib/Support/Timer.cpp index e4c085d266..3672feb49d 100644 --- a/lib/Support/Timer.cpp +++ b/lib/Support/Timer.cpp @@ -17,7 +17,18 @@ #include <functional> #include <fstream> -static std::string LibSupportInfoOutputFilename; +// 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 +// 'GetLibSupportInfoOutputFile()' (below), which calls this function. +// LibSupportInfoOutputFilename used to be a global variable, but sometimes it +// would get destroyed before the Statistic, causing havoc to ensue. We "fix" +// this by creating the string the first time it is needed and never destroying +// it. +static std::string &getLibSupportInfoOutputFilename() { + static std::string *LibSupportInfoOutputFilename = new std::string(); + return *LibSupportInfoOutputFilename; +} namespace { #ifdef HAVE_MALLINFO @@ -30,7 +41,7 @@ namespace { cl::opt<std::string, true> InfoOutputFilename("info-output-file", cl::desc("File to append -stats and -timer output to"), - cl::Hidden, cl::location(LibSupportInfoOutputFilename)); + cl::Hidden, cl::location(getLibSupportInfoOutputFilename())); } static TimerGroup *DefaultTimerGroup = 0; @@ -232,6 +243,7 @@ void Timer::print(const Timer &Total, std::ostream &OS) { // GetLibSupportInfoOutputFile - Return a file stream to print our output on... std::ostream *GetLibSupportInfoOutputFile() { + std::string &LibSupportInfoOutputFilename = getLibSupportInfoOutputFilename(); if (LibSupportInfoOutputFilename.empty()) return &std::cerr; if (LibSupportInfoOutputFilename == "-") |