ManagedStatic: remove from DebugCounter

[Re-submit after earlier revert due to a test failure. Commit dce78646f0
("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
This commit is contained in:
Nicolai Hähnle 2022-07-04 12:52:08 +02:00
parent 366534f175
commit 0629cce293
2 changed files with 31 additions and 30 deletions

View File

@ -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] = {};

View File

@ -4,7 +4,6 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
using namespace llvm;
@ -44,38 +43,42 @@ 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<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());
}
};
} // namespace
static ManagedStatic<DebugCounterList, CreateDebugCounterOption>
DebugCounterOption;
static bool PrintDebugCounter;
} // anonymous namespace
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"));
void llvm::initDebugCounterOptions() { (void)DebugCounter::instance(); }
DebugCounter &DebugCounter::instance() {
static DebugCounterOwner O;
return O.DC;
}
static ManagedStatic<DebugCounter> DC;
// Print information when destroyed, iff command line option is specified.
DebugCounter::~DebugCounter() {
if (isCountingEnabled() && PrintDebugCounter)
print(dbgs());
}
DebugCounter &DebugCounter::instance() { return *DC; }
// This is called by the command line parser when it sees a value for the
// debug-counter option defined above.
void DebugCounter::push_back(const std::string &Val) {