From 9f27ede92d42fde91cd118ab3a2146b59801a06a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 11 Jul 2004 02:43:43 +0000 Subject: [PATCH] First cut at TargetMachineRegistry and RegisterTarget classes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14742 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetMachineRegistry.h | 76 +++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 include/llvm/Target/TargetMachineRegistry.h diff --git a/include/llvm/Target/TargetMachineRegistry.h b/include/llvm/Target/TargetMachineRegistry.h new file mode 100644 index 00000000000..a6038458cbe --- /dev/null +++ b/include/llvm/Target/TargetMachineRegistry.h @@ -0,0 +1,76 @@ +//===-- Target/TargetMachineRegistry.h - Target Registration ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file exposes two classes: the TargetMachineRegistry class, which allows +// tools to inspect all of registered targets, and the RegisterTarget class, +// which TargetMachine implementations should use to register themselves with +// the system. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TARGET_TARGETMACHINEREGISTRY_H +#define LLVM_TARGET_TARGETMACHINEREGISTRY_H + +namespace llvm { + class Module; + class TargetMachine; + class IntrinsicLowering; + + struct TargetMachineRegistry { + /// Entry - One instance of this struct is created for each target that is + /// registered. + struct Entry { + const char *Name; + const char *ShortDesc; + TargetMachine *(*CtorFn)(const Module &, IntrinsicLowering*); + unsigned (*ModuleMatchQualityFn)(const Module &M); + unsigned (*JITMatchQualityFn)(); + + const Entry *getNext() const { return Next; } + + protected: + Entry(const char *N, const char *SD, + TargetMachine *(*CF)(const Module &, IntrinsicLowering*), + unsigned (*MMF)(const Module &M), unsigned (*JMF)()) + : Name(N), ShortDesc(SD), CtorFn(CF), ModuleMatchQualityFn(MMF), + JITMatchQualityFn(JMF), Next(List) { + List = this; + } + private: + const Entry *Next; // Next entry in the linked list. + }; + + /// TargetMachineRegistry::getList - This static method returns the list of + /// target machines that are registered with the system. + static const Entry *getList() { return List; } + + private: + static const Entry *List; + }; + + //===--------------------------------------------------------------------===// + /// RegisterTarget - This class is used to make targets automatically register + /// themselves with the tool they are linked. Targets should define an + /// instance of this and implement the static methods described in the + /// TargetMachine comments.. + template + struct RegisterTarget : public TargetMachineRegistry::Entry { + RegisterTarget(const char *Name, const char *ShortDesc) : + TargetMachineRegistry::Entry(Name, ShortDesc, &Allocator, + &TargetMachineImpl::getModuleMatchQuality, + &TargetMachineImpl::getJITMatchQuality) { + } + private: + static TargetMachine *Allocator(const Module &M, IntrinsicLowering *IL) { + return new TargetMachineImpl(M, IL); + } + }; +} + +#endif