[llvm] 51d8250 - ManagedStatic: remove from DebugCounter

Nicolai Hähnle via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 25 10:10:21 PDT 2022


Author: Nicolai Hähnle
Date: 2022-08-25T19:09:48+02:00
New Revision: 51d82502d98d3c5d60606e63b6c23bb5759fdb91

URL: https://github.com/llvm/llvm-project/commit/51d82502d98d3c5d60606e63b6c23bb5759fdb91
DIFF: https://github.com/llvm/llvm-project/commit/51d82502d98d3c5d60606e63b6c23bb5759fdb91.diff

LOG: ManagedStatic: remove from DebugCounter

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

Differential Revision: https://reviews.llvm.org/D129116

Added: 
    

Modified: 
    llvm/include/llvm/Support/DebugCounter.h
    llvm/lib/Support/DebugCounter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Support/DebugCounter.h b/llvm/include/llvm/Support/DebugCounter.h
index cd9474a4d9184..9fa4620ade3c8 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 @@ class DebugCounter {
   // 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 @@ class DebugCounter {
 #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 bc2df37e773d4..5f29d8967ff36 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,45 @@ class DebugCounterList : public cl::list<std::string, DebugCounter> {
   }
 };
 
-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<bool> 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());
+  }
+
+  static DebugCounterOwner &instance() {
+    static DebugCounterOwner O;
+    return O;
   }
 };
-} // namespace
-
-static ManagedStatic<DebugCounterList, CreateDebugCounterOption>
-    DebugCounterOption;
-static bool PrintDebugCounter;
-
-void llvm::initDebugCounterOptions() {
-  *DebugCounterOption;
-  static cl::opt<bool, true> 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<DebugCounter> 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() {
+  return DebugCounterOwner::instance().DC;
+}
 
 // This is called by the command line parser when it sees a value for the
 // debug-counter option defined above.


        


More information about the llvm-commits mailing list