summaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-xray/xray-registry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-xray/xray-registry.cpp')
-rw-r--r--llvm/tools/llvm-xray/xray-registry.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/tools/llvm-xray/xray-registry.cpp b/llvm/tools/llvm-xray/xray-registry.cpp
new file mode 100644
index 000000000000..e5c253d2e8f1
--- /dev/null
+++ b/llvm/tools/llvm-xray/xray-registry.cpp
@@ -0,0 +1,40 @@
+//===- xray-registry.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 "xray-registry.h"
+
+#include "llvm/Support/ManagedStatic.h"
+#include <unordered_map>
+
+namespace llvm {
+namespace xray {
+
+using HandlerType = std::function<Error()>;
+
+ManagedStatic<std::unordered_map<cl::SubCommand *, HandlerType>> Commands;
+
+CommandRegistration::CommandRegistration(cl::SubCommand *SC,
+ HandlerType Command) {
+ assert(Commands->count(SC) == 0 &&
+ "Attempting to overwrite a command handler");
+ assert(Command && "Attempting to register an empty std::function<Error()>");
+ (*Commands)[SC] = Command;
+}
+
+HandlerType dispatch(cl::SubCommand *SC) {
+ auto It = Commands->find(SC);
+ assert(It != Commands->end() &&
+ "Attempting to dispatch on un-registered SubCommand.");
+ return It->second;
+}
+
+} // namespace xray
+} // namespace llvm