From 71336a9c14d2da7fd9ab094eed8c6f3695b864ee Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 31 Jul 2003 19:38:34 +0000 Subject: Fix the JIT in the Nightly tester. This was not a fun bug to track down. See the comments in the patch for details. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7457 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Timer.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'lib/Support/Timer.cpp') 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 #include -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 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 == "-") -- cgit v1.2.3