diff --git a/include/HAL/TargetSystemRegistry.h b/include/HAL/TargetSystemRegistry.h index 9fd0070ef..ec2cd1405 100644 --- a/include/HAL/TargetSystemRegistry.h +++ b/include/HAL/TargetSystemRegistry.h @@ -24,6 +24,16 @@ namespace qssc::hal::registry { class TargetSystemRegistry : public qssc::plugin::registry::PluginRegistry { using PluginRegistry = qssc::plugin::registry::PluginRegistry; public: + template + struct InitRegistry { + template + InitRegistry(llvm::StringRef name, Args &&... args) { + registered = TargetSystemRegistry::registerPlugin(name, std::forward(args)...); + } + + bool registered = false; + }; + template static bool registerPlugin(llvm::StringRef name, llvm::StringRef description, const TargetSystemInfo::PluginFactoryFunction &pluginFactory) { diff --git a/include/Plugin/PluginRegistry.h b/include/Plugin/PluginRegistry.h index f0d105afb..458007510 100644 --- a/include/Plugin/PluginRegistry.h +++ b/include/Plugin/PluginRegistry.h @@ -23,6 +23,17 @@ namespace qssc::plugin::registry { struct PluginRegistry { public: + struct InitRegistry { + template + InitRegistry(llvm::StringRef name, Args &&... args) { + registered = PluginRegistry::registerPlugin(name, std::forward(args)...); + } + + bool registered = false; + }; + + PluginRegistry(const PluginRegistry&) = delete; + template static bool registerPlugin(llvm::StringRef name, Args &&... args) { auto &pluginRegistry = instance(); diff --git a/mock_target/MockTarget.cpp b/mock_target/MockTarget.cpp index 40fd28659..9ba576ff6 100644 --- a/mock_target/MockTarget.cpp +++ b/mock_target/MockTarget.cpp @@ -59,19 +59,19 @@ static llvm::cl::OptionCategory "Compiler target"); int qssc::targets::mock::init() { - registry::TargetSystemRegistry::registerPlugin( - "mock", "Mock system for testing the targetting infrastructure.", - [](llvm::Optional configurationPath) - -> llvm::Expected> { - if (!configurationPath) - return llvm::createStringError( - llvm::inconvertibleErrorCode(), - "Configuration file must be specified.\n"); - - auto config = std::make_unique(*configurationPath); - return std::make_unique(std::move(config)); - }); - return 0; + const registry::TargetSystemRegistry::InitRegistry reg( + "mock", "Mock system for testing the targetting infrastructure.", + [](llvm::Optional configurationPath) + -> llvm::Expected> { + if (!configurationPath) + return llvm::createStringError( + llvm::inconvertibleErrorCode(), + "Configuration file must be specified.\n"); + + auto config = std::make_unique(*configurationPath); + return std::make_unique(std::move(config)); + }); + return reg.registered ? 0 : -1; } MockConfig::MockConfig(llvm::StringRef configurationPath) diff --git a/mock_target/Target.inc b/mock_target/Target.inc index 7ccb0d5d1..28d785239 100644 --- a/mock_target/Target.inc +++ b/mock_target/Target.inc @@ -16,9 +16,10 @@ #ifndef HAL_TARGETS_MOCK_TARGET_H #define HAL_TARGETS_MOCK_TARGET_H +#include "MockTarget.h" + namespace qssc::targets::mock { -int init(); [[maybe_unused]] int registrar = init(); } // namespace qssc::targets::mock