// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_MC_TARGETREGISTRY_H #define RCC_MC_TARGETREGISTRY_H #include "rcc/Support/Error.h" #include #include #include #include namespace rcc { class TargetMachine; struct TargetMachineOptions; class Target final { public: using MatchQualityFn = unsigned (*)(std::string_view Triple); using NormalizeTripleFn = std::string (*)(std::string_view Triple); using DefaultOptionsFn = TargetMachineOptions (*)(); using DefaultABIFn = std::string (*)(std::span Features); using TargetMachineCtorFn = Expected> (*)( const Target &RegisteredTarget, TargetMachineOptions Options); constexpr Target(std::string_view Name, std::string_view Description, bool IsDefault, MatchQualityFn MatchQuality, NormalizeTripleFn NormalizeTriple, DefaultOptionsFn DefaultOptions, DefaultABIFn DefaultABI, std::span BaselineFeatures, TargetMachineCtorFn TargetMachineCtor) noexcept : Name(Name), Description(Description), IsDefault(IsDefault), MatchQuality(MatchQuality), NormalizeTriple(NormalizeTriple), DefaultOptions(DefaultOptions), DefaultABI(DefaultABI), BaselineFeatures(BaselineFeatures), TargetMachineCtor(TargetMachineCtor) {} [[nodiscard]] std::string_view name() const noexcept { return Name; } [[nodiscard]] std::string_view description() const noexcept { return Description; } [[nodiscard]] bool isDefault() const noexcept { return IsDefault; } [[nodiscard]] unsigned matchQuality(std::string_view Triple) const noexcept { return MatchQuality(Triple); } [[nodiscard]] std::string normalizeTriple(std::string_view Triple) const { return NormalizeTriple(Triple); } [[nodiscard]] TargetMachineOptions defaultMachineOptions() const; [[nodiscard]] std::string defaultABI(std::span Features) const { return DefaultABI(Features); } [[nodiscard]] std::span baselineFeatures() const noexcept { return BaselineFeatures; } [[nodiscard]] Expected> createTargetMachine(TargetMachineOptions Options) const; private: std::string_view Name; std::string_view Description; bool IsDefault = false; MatchQualityFn MatchQuality = nullptr; NormalizeTripleFn NormalizeTriple = nullptr; DefaultOptionsFn DefaultOptions = nullptr; DefaultABIFn DefaultABI = nullptr; std::span BaselineFeatures; TargetMachineCtorFn TargetMachineCtor = nullptr; }; class TargetRegistry final { public: static void registerTarget(const Target &RegisteredTarget); [[nodiscard]] static Expected lookupTarget(std::string_view Triple); [[nodiscard]] static Expected defaultTarget(); }; } // namespace rcc #endif // RCC_MC_TARGETREGISTRY_H