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:
parent
366534f175
commit
0629cce293
|
@ -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] = {};
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user