[RemarkUtil] Refactor remarkutil tool to use a command registry.
In preperation to move all remark utilities into one tool. We use
command registry to breakdown each utility into a separate file.
For now we have 3 utilities for remarks
1. Convert: which is responsible for converting yaml remarks to
bitstream and vice-versa
2. Count: Analyse remarks and report count. This currently only supports
asm-remarks and annotation-summary remarks.
3. Diff remarks: Currently we only have a diff for size remarks using
`llvm-remark-size-diff`
The first two utilites have been simplified and seperated into two
files. The following commit will move `llvm-remark-size-diff` and fold
it to be inside `llvm-remarkutil` as a subcommand
Differential Revision: https://reviews.llvm.org/D156416
GitOrigin-RevId: 30d8e0837d68a11430cc4c0f24cd743e14219a7d
diff --git a/tools/llvm-remarkutil/RemarkUtilRegistry.cpp b/tools/llvm-remarkutil/RemarkUtilRegistry.cpp
new file mode 100644
index 0000000..244a16d
--- /dev/null
+++ b/tools/llvm-remarkutil/RemarkUtilRegistry.cpp
@@ -0,0 +1,41 @@
+//===- RemarkUtilRegistry.cpp: Implement a command registry. --------------===//
+//
+// 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 a simple subcommand registry.
+//
+//===----------------------------------------------------------------------===//
+#include "RemarkUtilRegistry.h"
+#include <unordered_map>
+
+namespace llvm {
+namespace remarkutil {
+
+using HandlerType = std::function<Error()>;
+
+static std::unordered_map<cl::SubCommand *, HandlerType> &getCommands() {
+ static std::unordered_map<cl::SubCommand *, HandlerType> Commands;
+ return Commands;
+}
+
+CommandRegistration::CommandRegistration(cl::SubCommand *SC,
+ HandlerType Command) {
+ assert(getCommands().count(SC) == 0 &&
+ "Attempting to overwrite a command handler");
+ assert(Command && "Attempting to register an empty std::function<Error()>");
+ getCommands()[SC] = Command;
+}
+
+HandlerType dispatch(cl::SubCommand *SC) {
+ auto It = getCommands().find(SC);
+ assert(It != getCommands().end() &&
+ "Attempting to dispatch on un-registered SubCommand.");
+ return It->second;
+}
+
+} // namespace remarkutil
+} // namespace llvm