From 0629cce2939017a66101f94976a70743cfe0eb6c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Mon, 4 Jul 2022 12:52:08 +0200 Subject: [PATCH] ManagedStatic: remove from DebugCounter [Re-submit after earlier revert due to a test failure. Commit dce78646f07 ("clang-tblgen build: avoid duplicate inclusion of libLLVMSupport") is believe to address the root cause of the test failure.] Follow the pattern used in MLIR for the cl::opt instances. v2: - make DebugCounter::isCountingEnabled public so that the DebugCounterOwner doesn't have to be a nested class. This simplifies later changes v3: - remove the indirection via DebugCounterOwner::instance() Differential Revision: https://reviews.llvm.org/D129116 --- llvm/include/llvm/Support/DebugCounter.h | 4 +-- llvm/lib/Support/DebugCounter.cpp | 57 +++++++++++++++++--------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/llvm/include/llvm/Support/DebugCounter.h b/llvm/include/llvm/Support/DebugCounter.h index cd9474a..9fa4620a 100644 --- a/llvm/include/llvm/Support/DebugCounter.h +++ b/llvm/include/llvm/Support/DebugCounter.h @@ -55,8 +55,6 @@ class raw_ostream; class DebugCounter { public: - ~DebugCounter(); - /// Returns a reference to the singleton instance. static DebugCounter &instance(); @@ -149,7 +147,6 @@ public: // contexts where we're certain we won't spawn threads. static void enableAllCounters() { instance().Enabled = true; } -private: static bool isCountingEnabled() { // Compile to nothing when debugging is off #ifdef NDEBUG @@ -159,6 +156,7 @@ private: #endif } +private: unsigned addCounter(const std::string &Name, const std::string &Desc) { unsigned Result = RegisteredCounters.insert(Name); Counters[Result] = {}; diff --git a/llvm/lib/Support/DebugCounter.cpp b/llvm/lib/Support/DebugCounter.cpp index bc2df37..26293bf 100644 --- a/llvm/lib/Support/DebugCounter.cpp +++ b/llvm/lib/Support/DebugCounter.cpp @@ -4,7 +4,6 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Format.h" -#include "llvm/Support/ManagedStatic.h" using namespace llvm; @@ -44,37 +43,41 @@ private: } }; -struct CreateDebugCounterOption { - static void *call() { - return new DebugCounterList( - "debug-counter", cl::Hidden, - cl::desc("Comma separated list of debug counter skip and count"), - cl::CommaSeparated, cl::location(DebugCounter::instance())); +// All global objects associated to the DebugCounter, including the DebugCounter +// itself, are owned by a single global instance of the DebugCounterOwner +// struct. This makes it easier to control the order in which constructors and +// destructors are run. +struct DebugCounterOwner { + DebugCounter DC; + DebugCounterList DebugCounterOption{ + "debug-counter", cl::Hidden, + cl::desc("Comma separated list of debug counter skip and count"), + cl::CommaSeparated, cl::location(DC)}; + cl::opt PrintDebugCounter{ + "print-debug-counter", cl::Hidden, cl::init(false), cl::Optional, + cl::desc("Print out debug counter info after all counters accumulated")}; + + DebugCounterOwner() { + // Our destructor uses the debug stream. By referencing it here, we + // ensure that its destructor runs after our destructor. + (void)dbgs(); + } + + // Print information when destroyed, iff command line option is specified. + ~DebugCounterOwner() { + if (DC.isCountingEnabled() && PrintDebugCounter) + DC.print(dbgs()); } }; -} // namespace - -static ManagedStatic - DebugCounterOption; -static bool PrintDebugCounter; - -void llvm::initDebugCounterOptions() { - *DebugCounterOption; - static cl::opt RegisterPrintDebugCounter( - "print-debug-counter", cl::Hidden, cl::location(PrintDebugCounter), - cl::init(false), cl::Optional, - cl::desc("Print out debug counter info after all counters accumulated")); -} -static ManagedStatic DC; +} // anonymous namespace -// Print information when destroyed, iff command line option is specified. -DebugCounter::~DebugCounter() { - if (isCountingEnabled() && PrintDebugCounter) - print(dbgs()); -} +void llvm::initDebugCounterOptions() { (void)DebugCounter::instance(); } -DebugCounter &DebugCounter::instance() { return *DC; } +DebugCounter &DebugCounter::instance() { + static DebugCounterOwner O; + return O.DC; +} // This is called by the command line parser when it sees a value for the // debug-counter option defined above. -- 2.7.4