-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[TableGen] Factor out timer code into a new TGTimer
class
#111054
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-tablegen @llvm/pr-subscribers-llvm-globalisel Author: Rahul Joshi (jurahul) ChangesFactor out the timer related functionality from Patch is 24.78 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/111054.diff 14 Files Affected:
diff --git a/llvm/include/llvm/TableGen/Record.h b/llvm/include/llvm/TableGen/Record.h
index 01e41541bf044b..f856ff4cbd34b5 100644
--- a/llvm/include/llvm/TableGen/Record.h
+++ b/llvm/include/llvm/TableGen/Record.h
@@ -51,6 +51,7 @@ class RecordVal;
class Resolver;
class StringInit;
class TypedInit;
+class TGTimer;
//===----------------------------------------------------------------------===//
// Type Classes
@@ -1785,11 +1786,13 @@ class Record {
}
RecordVal *getValue(const Init *Name) {
- return const_cast<RecordVal *>(static_cast<const Record *>(this)->getValue(Name));
+ return const_cast<RecordVal *>(
+ static_cast<const Record *>(this)->getValue(Name));
}
RecordVal *getValue(StringRef Name) {
- return const_cast<RecordVal *>(static_cast<const Record *>(this)->getValue(Name));
+ return const_cast<RecordVal *>(
+ static_cast<const Record *>(this)->getValue(Name));
}
void addTemplateArg(Init *Name) {
@@ -2033,29 +2036,7 @@ class RecordKeeper {
Init *getNewAnonymousName();
- /// Start phase timing; called if the --time-phases option is specified.
- void startPhaseTiming() {
- TimingGroup = new TimerGroup("TableGen", "TableGen Phase Timing");
- }
-
- /// Start timing a phase. Automatically stops any previous phase timer.
- void startTimer(StringRef Name) const;
-
- /// Stop timing a phase.
- void stopTimer();
-
- /// Start timing the overall backend. If the backend itself starts a timer,
- /// then this timer is cleared.
- void startBackendTimer(StringRef Name);
-
- /// Stop timing the overall backend.
- void stopBackendTimer();
-
- /// Stop phase timing and print the report.
- void stopPhaseTiming() {
- if (TimingGroup)
- delete TimingGroup;
- }
+ TGTimer &getTimer() const { return *Timer; }
//===--------------------------------------------------------------------===//
// High-level helper methods, useful for tablegen backends.
@@ -2089,16 +2070,9 @@ class RecordKeeper {
mutable std::map<std::string, std::vector<const Record *>> Cache;
GlobalMap ExtraGlobals;
- // TODO: Move timing related code out of RecordKeeper.
- // These members are for the phase timing feature. We need a timer group,
- // the last timer started, and a flag to say whether the last timer
- // is the special "backend overall timer."
- mutable TimerGroup *TimingGroup = nullptr;
- mutable Timer *LastTimer = nullptr;
- mutable bool BackendTimer = false;
-
/// The internal uniquer implementation of the RecordKeeper.
std::unique_ptr<detail::RecordKeeperImpl> Impl;
+ std::unique_ptr<TGTimer> Timer;
};
/// Sorting predicate to sort record pointers by name.
diff --git a/llvm/include/llvm/TableGen/TGTimer.h b/llvm/include/llvm/TableGen/TGTimer.h
new file mode 100644
index 00000000000000..85788f602bcc45
--- /dev/null
+++ b/llvm/include/llvm/TableGen/TGTimer.h
@@ -0,0 +1,58 @@
+//===- llvm/TableGen/TGTimer.h - Class for TableGen Timer -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the TableGen timer class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TABLEGEN_TGTIMER_H
+#define LLVM_TABLEGEN_TGTIMER_H
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Timer.h"
+
+namespace llvm {
+
+// Timer related functionality f or TableGen backends.
+class TGTimer {
+private:
+ TimerGroup *TimingGroup = nullptr;
+ Timer *LastTimer = nullptr;
+ bool BackendTimer = false; // Is last timer special backend overall timer?
+
+public:
+ TGTimer() = default;
+
+ /// Start phase timing; called if the --time-phases option is specified.
+ void startPhaseTiming() {
+ TimingGroup = new TimerGroup("TableGen", "TableGen Phase Timing");
+ }
+
+ /// Start timing a phase. Automatically stops any previous phase timer.
+ void startTimer(StringRef Name);
+
+ /// Stop timing a phase.
+ void stopTimer();
+
+ /// Start timing the overall backend. If the backend itself starts a timer,
+ /// then this timer is cleared.
+ void startBackendTimer(StringRef Name);
+
+ /// Stop timing the overall backend.
+ void stopBackendTimer();
+
+ /// Stop phase timing and print the report.
+ void stopPhaseTiming() {
+ delete TimingGroup;
+ TimingGroup = nullptr;
+ }
+};
+
+} // end namespace llvm
+
+#endif // LLVM_TABLEGEN_TGTIMER_H
diff --git a/llvm/lib/TableGen/CMakeLists.txt b/llvm/lib/TableGen/CMakeLists.txt
index c550840f147d78..84815c77369979 100644
--- a/llvm/lib/TableGen/CMakeLists.txt
+++ b/llvm/lib/TableGen/CMakeLists.txt
@@ -11,6 +11,7 @@ add_llvm_component_library(LLVMTableGen
TableGenBackendSkeleton.cpp
TGLexer.cpp
TGParser.cpp
+ TGTimer.cpp
ADDITIONAL_HEADER_DIRS
${LLVM_MAIN_INCLUDE_DIR}/llvm/TableGen
diff --git a/llvm/lib/TableGen/Main.cpp b/llvm/lib/TableGen/Main.cpp
index a4c41223c07620..55a99cbfc58acd 100644
--- a/llvm/lib/TableGen/Main.cpp
+++ b/llvm/lib/TableGen/Main.cpp
@@ -29,6 +29,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TGTimer.h"
#include "llvm/TableGen/TableGenBackend.h"
#include <memory>
#include <string>
@@ -98,13 +99,14 @@ static int createDependencyFile(const TGParser &Parser, const char *argv0) {
int llvm::TableGenMain(const char *argv0,
std::function<TableGenMainFn> MainFn) {
RecordKeeper Records;
+ TGTimer &Timer = Records.getTimer();
if (TimePhases)
- Records.startPhaseTiming();
+ Timer.startPhaseTiming();
// Parse the input file.
- Records.startTimer("Parse, build records");
+ Timer.startTimer("Parse, build records");
ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
MemoryBuffer::getFileOrSTDIN(InputFilename, /*IsText=*/true);
if (std::error_code EC = FileOrErr.getError())
@@ -124,10 +126,10 @@ int llvm::TableGenMain(const char *argv0,
if (Parser.ParseFile())
return 1;
- Records.stopTimer();
+ Timer.stopTimer();
// Write output to memory.
- Records.startBackendTimer("Backend overall");
+ Timer.startBackendTimer("Backend overall");
std::string OutString;
raw_string_ostream Out(OutString);
unsigned status = 0;
@@ -135,7 +137,7 @@ int llvm::TableGenMain(const char *argv0,
// case, attempt to apply the MainFn.
if (TableGen::Emitter::ApplyCallback(Records, Out))
status = MainFn ? MainFn(Out, Records) : 1;
- Records.stopBackendTimer();
+ Timer.stopBackendTimer();
if (status)
return 1;
@@ -148,7 +150,7 @@ int llvm::TableGenMain(const char *argv0,
return Ret;
}
- Records.startTimer("Write output");
+ Timer.startTimer("Write output");
bool WriteFile = true;
if (WriteIfChanged) {
// Only updates the real output file if there are any differences.
@@ -169,9 +171,9 @@ int llvm::TableGenMain(const char *argv0,
if (ErrorsPrinted == 0)
OutFile.keep();
}
-
- Records.stopTimer();
- Records.stopPhaseTiming();
+
+ Timer.stopTimer();
+ Timer.stopPhaseTiming();
if (ErrorsPrinted > 0)
return reportError(argv0, Twine(ErrorsPrinted) + " errors.\n");
diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp
index bebfb4b8c381c1..ef3f031d9992d6 100644
--- a/llvm/lib/TableGen/Record.cpp
+++ b/llvm/lib/TableGen/Record.cpp
@@ -28,6 +28,7 @@
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
+#include "llvm/TableGen/TGTimer.h"
#include <cassert>
#include <cstdint>
#include <map>
@@ -3210,7 +3211,9 @@ void Record::checkUnusedTemplateArgs() {
}
RecordKeeper::RecordKeeper()
- : Impl(std::make_unique<detail::RecordKeeperImpl>(*this)) {}
+ : Impl(std::make_unique<detail::RecordKeeperImpl>(*this)),
+ Timer(std::make_unique<TGTimer>()) {}
+
RecordKeeper::~RecordKeeper() = default;
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
@@ -3234,47 +3237,6 @@ Init *RecordKeeper::getNewAnonymousName() {
return AnonymousNameInit::get(*this, getImpl().AnonCounter++);
}
-// These functions implement the phase timing facility. Starting a timer
-// when one is already running stops the running one.
-
-void RecordKeeper::startTimer(StringRef Name) const {
- if (TimingGroup) {
- if (LastTimer && LastTimer->isRunning()) {
- LastTimer->stopTimer();
- if (BackendTimer) {
- LastTimer->clear();
- BackendTimer = false;
- }
- }
-
- LastTimer = new Timer("", Name, *TimingGroup);
- LastTimer->startTimer();
- }
-}
-
-void RecordKeeper::stopTimer() {
- if (TimingGroup) {
- assert(LastTimer && "No phase timer was started");
- LastTimer->stopTimer();
- }
-}
-
-void RecordKeeper::startBackendTimer(StringRef Name) {
- if (TimingGroup) {
- startTimer(Name);
- BackendTimer = true;
- }
-}
-
-void RecordKeeper::stopBackendTimer() {
- if (TimingGroup) {
- if (BackendTimer) {
- stopTimer();
- BackendTimer = false;
- }
- }
-}
-
ArrayRef<const Record *>
RecordKeeper::getAllDerivedDefinitions(StringRef ClassName) const {
// We cache the record vectors for single classes. Many backends request
diff --git a/llvm/lib/TableGen/TGTimer.cpp b/llvm/lib/TableGen/TGTimer.cpp
new file mode 100644
index 00000000000000..358a7b1b680f76
--- /dev/null
+++ b/llvm/lib/TableGen/TGTimer.cpp
@@ -0,0 +1,56 @@
+//===- TGTimer.cpp - TableGen Timer implementation --------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Implement the tablegen timer class.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/TableGen/TGTimer.h"
+using namespace llvm;
+
+#define DEBUG_TYPE "tblgen-timer"
+
+// These functions implement the phase timing facility. Starting a timer
+// when one is already running stops the running one.
+void TGTimer::startTimer(StringRef Name) {
+ if (TimingGroup) {
+ if (LastTimer && LastTimer->isRunning()) {
+ LastTimer->stopTimer();
+ if (BackendTimer) {
+ LastTimer->clear();
+ BackendTimer = false;
+ }
+ }
+
+ LastTimer = new Timer("", Name, *TimingGroup);
+ LastTimer->startTimer();
+ }
+}
+
+void TGTimer::stopTimer() {
+ if (TimingGroup) {
+ assert(LastTimer && "No phase timer was started");
+ LastTimer->stopTimer();
+ }
+}
+
+void TGTimer::startBackendTimer(StringRef Name) {
+ if (TimingGroup) {
+ startTimer(Name);
+ BackendTimer = true;
+ }
+}
+
+void TGTimer::stopBackendTimer() {
+ if (TimingGroup) {
+ if (BackendTimer) {
+ stopTimer();
+ BackendTimer = false;
+ }
+ }
+}
diff --git a/llvm/utils/TableGen/CallingConvEmitter.cpp b/llvm/utils/TableGen/CallingConvEmitter.cpp
index fefc407c354a5d..c8f263e15d96b7 100644
--- a/llvm/utils/TableGen/CallingConvEmitter.cpp
+++ b/llvm/utils/TableGen/CallingConvEmitter.cpp
@@ -14,6 +14,7 @@
#include "Common/CodeGenTarget.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TGTimer.h"
#include "llvm/TableGen/TableGenBackend.h"
#include <deque>
#include <set>
@@ -51,7 +52,7 @@ void CallingConvEmitter::run(raw_ostream &O) {
// Emit prototypes for all of the non-custom CC's so that they can forward ref
// each other.
- Records.startTimer("Emit prototypes");
+ Records.getTimer().startTimer("Emit prototypes");
O << "#ifndef GET_CC_REGISTER_LISTS\n\n";
for (const Record *CC : CCs) {
if (!CC->getValueAsBit("Custom")) {
@@ -71,7 +72,7 @@ void CallingConvEmitter::run(raw_ostream &O) {
}
// Emit each non-custom calling convention description in full.
- Records.startTimer("Emit full descriptions");
+ Records.getTimer().startTimer("Emit full descriptions");
for (const Record *CC : CCs) {
if (!CC->getValueAsBit("Custom")) {
EmitCallingConv(CC, O);
diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp
index 2cceb22afdb99b..d3b653b0fba27f 100644
--- a/llvm/utils/TableGen/DAGISelEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelEmitter.cpp
@@ -16,6 +16,7 @@
#include "Common/DAGISelMatcher.h"
#include "llvm/Support/Debug.h"
#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TGTimer.h"
#include "llvm/TableGen/TableGenBackend.h"
using namespace llvm;
@@ -132,7 +133,8 @@ struct PatternSortingPredicate {
} // End anonymous namespace
void DAGISelEmitter::run(raw_ostream &OS) {
- Records.startTimer("Parse patterns");
+ TGTimer &Timer = Records.getTimer();
+ Timer.startTimer("Parse patterns");
emitSourceFileHeader("DAG Instruction Selector for the " +
CGP.getTargetInfo().getName().str() + " target",
OS);
@@ -163,7 +165,7 @@ void DAGISelEmitter::run(raw_ostream &OS) {
});
// Add all the patterns to a temporary list so we can sort them.
- Records.startTimer("Sort patterns");
+ Timer.startTimer("Sort patterns");
std::vector<const PatternToMatch *> Patterns;
for (const PatternToMatch &PTM : CGP.ptms())
Patterns.push_back(&PTM);
@@ -173,7 +175,7 @@ void DAGISelEmitter::run(raw_ostream &OS) {
llvm::stable_sort(Patterns, PatternSortingPredicate(CGP));
// Convert each variant of each pattern into a Matcher.
- Records.startTimer("Convert to matchers");
+ Timer.startTimer("Convert to matchers");
SmallVector<Matcher *, 0> PatternMatchers;
for (const PatternToMatch *PTM : Patterns) {
for (unsigned Variant = 0;; ++Variant) {
@@ -187,12 +189,12 @@ void DAGISelEmitter::run(raw_ostream &OS) {
std::unique_ptr<Matcher> TheMatcher =
std::make_unique<ScopeMatcher>(std::move(PatternMatchers));
- Records.startTimer("Optimize matchers");
+ Timer.startTimer("Optimize matchers");
OptimizeMatcher(TheMatcher, CGP);
// Matcher->dump();
- Records.startTimer("Emit matcher table");
+ Timer.startTimer("Emit matcher table");
EmitMatcherTable(TheMatcher.get(), CGP, OS);
}
diff --git a/llvm/utils/TableGen/GlobalISelCombinerEmitter.cpp b/llvm/utils/TableGen/GlobalISelCombinerEmitter.cpp
index 78496fbe1b860b..2524a443f3454d 100644
--- a/llvm/utils/TableGen/GlobalISelCombinerEmitter.cpp
+++ b/llvm/utils/TableGen/GlobalISelCombinerEmitter.cpp
@@ -53,6 +53,7 @@
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
#include "llvm/TableGen/StringMatcher.h"
+#include "llvm/TableGen/TGTimer.h"
#include "llvm/TableGen/TableGenBackend.h"
#include <cstdint>
@@ -2718,7 +2719,8 @@ void GICombinerEmitter::run(raw_ostream &OS) {
InstructionOpcodeMatcher::initOpcodeValuesMap(Target);
LLTOperandMatcher::initTypeIDValuesMap();
- Records.startTimer("Gather rules");
+ TGTimer &Timer = Records.getTimer();
+ Timer.startTimer("Gather rules");
std::vector<RuleMatcher> Rules;
gatherRules(Rules, Combiner->getValueAsListOfDefs("Rules"));
if (ErrorsPrinted)
@@ -2727,7 +2729,7 @@ void GICombinerEmitter::run(raw_ostream &OS) {
if (StopAfterParse)
return;
- Records.startTimer("Creating Match Table");
+ Timer.startTimer("Creating Match Table");
unsigned MaxTemporaries = 0;
for (const auto &Rule : Rules)
MaxTemporaries = std::max(MaxTemporaries, Rule.countRendererFns());
@@ -2744,7 +2746,7 @@ void GICombinerEmitter::run(raw_ostream &OS) {
const MatchTable Table = buildMatchTable(Rules);
- Records.startTimer("Emit combiner");
+ Timer.startTimer("Emit combiner");
emitSourceFileHeader(getClassName().str() + " Combiner Match Table", OS);
diff --git a/llvm/utils/TableGen/InstrInfoEmitter.cpp b/llvm/utils/TableGen/InstrInfoEmitter.cpp
index 5653434ddd6827..a7039ff7e31e9a 100644
--- a/llvm/utils/TableGen/InstrInfoEmitter.cpp
+++ b/llvm/utils/TableGen/InstrInfoEmitter.cpp
@@ -28,6 +28,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TGTimer.h"
#include "llvm/TableGen/TableGenBackend.h"
#include <cassert>
#include <cstdint>
@@ -934,14 +935,15 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
const Record *InstrInfo = Target.getInstructionSet();
// Collect all of the operand info records.
- Records.startTimer("Collect operand info");
+ TGTimer &Timer = Records.getTimer();
+ Timer.startTimer("Collect operand info");
OperandInfoListTy OperandInfoList;
OperandInfoMapTy OperandInfoMap;
unsigned OperandInfoSize =
CollectOperandInfo(OperandInfoList, OperandInfoMap);
// Collect all of the instruction's implicit uses and defs.
- Records.startTimer("Collect uses/defs");
+ Timer.startTimer("Collect uses/defs");
std::map<std::vector<const Record *>, unsigned> EmittedLists;
std::vector<std::vector<const Record *>> ImplicitLists;
unsigned ImplicitListSize = 0;
@@ -979,7 +981,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
OS << "namespace llvm {\n\n";
// Emit all of the MCInstrDesc records in reverse ENUM ordering.
- Records.startTimer("Emit InstrDesc records");
+ Timer.startTimer("Emit InstrDesc records");
OS << "static_assert(sizeof(MCOperandInfo) % sizeof(MCPhysReg) == 0);\n";
OS << "static constexpr unsigned " << TargetName << "ImpOpBase = sizeof "
<< TargetName << "InstrTable::OperandInfo / (sizeof(MCPhysReg));\n\n";
@@ -998,13 +1000,13 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
OS << " }, {\n";
// Emit all of the operand info records.
- Records.startTimer("Emit operand info");
+ Timer.startTimer("Emit operand info");
EmitOperandInfo(OS, OperandInfoList);
OS << " }, {\n";
// Emit all of the instruction's implicit uses and defs.
- Records.startTimer("Emit uses/defs");
+ Timer.startTimer("Emit uses/defs");
for (auto &List : ImplicitLists) {
OS << " /* " << EmittedLists[List] << " */";
for (auto &Reg : List)
@@ -1015,7 +1017,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
OS << " }\n};\n\n";
// Emit the array of instruction names.
- Records.startTimer("Emit instruction names");
+ Timer.startTimer("Emit instruction names");
InstrNames.layout();
InstrNames.emitStringLiteralDef(OS, Twine("extern const char ") + TargetName +
"InstrNameData[]");
@@ -1076,7 +1078,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
}
// MCInstrInfo initialization routine.
- Records.startTimer("Emit initialization routine");
+ Timer.startTimer("Emit initialization routine");
OS << "static inline void Init" << TargetName
<< "MCInstrInfo(MCInstrInfo *II) {\n";
OS << " II->InitMCInstrInfo(" << TargetName << "Descs.Insts, " << TargetName
@@ -1156,22 +1158,22 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
- Records.startTimer("Emit operand name mappings");
+ Timer.startTimer("Emit operand name mappings");
emitOperandNameMappings(OS, Target, NumberedInstructions);
- Records.startTimer("Emit operand type mappings");
+ Timer.startTimer("Emit operand type mappings");
emitOperandTypeMappings(OS, Target, NumberedInstructions);
- Records.startTimer("Emit logical operand size mappings");
+ Timer.startTimer("Emit logical operand size mappings");
emitLogicalOperandSizeMappings(OS, TargetName, NumberedInstructions);
- Records.startTimer("Emit logical operand type mappings");
+ Timer.startTimer("Emit logical operand type mappings");
emitLogicalOperandTypeMappings(OS, TargetName, NumberedInstructions);
- Records.startTimer("Emit helper methods");
+ Timer.startTimer("Emit helper methods");
emitMCIIHelperMethods(OS, TargetName);
- Records.startTimer("Emit verifier methods");
+ Timer.startTimer("Emit verifier methods");
emitFeatureVerifier(OS, Target);
}
@@ -1357,11 +1359,12 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
}
-static void EmitInstrInfo(const RecordKeeper &RK, raw_ostream &OS) {
- RK.startTimer("Analyze DAG patterns");
- InstrInfoEmitter(RK).run(OS);
- RK.startT...
[truncated]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I thought all of this sort of machinery was handled in Support/Timer already?
Factor out the timer related functionality from `RecordKeeper` to a new `TGTimer` class in a new file.
2f44795
to
3bd258b
Compare
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/146/builds/1308 Here is the relevant piece of the build log for the reference
|
Factor out the timer related functionality from
RecordKeeper
to a newTGTimer
class in a new file.