aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-07-11 02:43:43 +0000
committerChris Lattner <sabre@nondot.org>2004-07-11 02:43:43 +0000
commit9f27ede92d42fde91cd118ab3a2146b59801a06a (patch)
tree2ec89313d6fd6fa174c9c9c0e04a8bd76ec88791
parenta51e273a764b2a3e8fe856c3bd47b09f9446f380 (diff)
First cut at TargetMachineRegistry and RegisterTarget classes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14742 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Target/TargetMachineRegistry.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/include/llvm/Target/TargetMachineRegistry.h b/include/llvm/Target/TargetMachineRegistry.h
new file mode 100644
index 0000000000..a6038458cb
--- /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<class TargetMachineImpl>
+ 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