15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- TargetRegistry.h ---------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef MCLD_TARGET_REGISTRY_H
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_TARGET_REGISTRY_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/TargetRegistry.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <list>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace llvm {
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetMachine;
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCCodeEmitter;
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCContext;
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AsmPrinter;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of llvm
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerScript;
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryArea;
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MCLDTargetMachine;
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetRegistry;
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MCLinker;
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetLDBackend;
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AttributeFactory;
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass InputFactory;
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ContextFactory;
35affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass DiagnosticLineInfo;
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// Target - mcld::Target is an object adapter of llvm::Target
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Target
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  friend class mcld::MCLDTargetMachine;
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  friend class mcld::TargetRegistry;
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef mcld::MCLDTargetMachine *(*TargetMachineCtorTy)(const mcld::Target &,
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                          llvm::TargetMachine &,
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                          const std::string&);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef MCLinker *(*MCLinkerCtorTy)(const std::string& pTriple,
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      LinkerConfig&,
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      Module&,
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      MemoryArea& pOutput);
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  typedef bool (*EmulationFnTy)(LinkerScript&, LinkerConfig&);
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef TargetLDBackend  *(*TargetLDBackendCtorTy)(const llvm::Target&,
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                     const LinkerConfig&);
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  typedef DiagnosticLineInfo *(*DiagnosticLineInfoCtorTy)(const mcld::Target&,
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                                          const std::string&);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Target();
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setTarget(const llvm::Target& pTarget)
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { m_pT = &pTarget; }
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  mcld::MCLDTargetMachine *createTargetMachine(const std::string &pTriple,
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          const std::string &pCPU, const std::string &pFeatures,
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          const llvm::TargetOptions &Options,
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          llvm::Reloc::Model RM = llvm::Reloc::Default,
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          llvm::CodeModel::Model CM = llvm::CodeModel::Default,
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          llvm::CodeGenOpt::Level OL = llvm::CodeGenOpt::Default) const
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (TargetMachineCtorFn && m_pT) {
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      llvm::TargetMachine *tm = m_pT->createTargetMachine(pTriple, pCPU, pFeatures, Options, RM, CM, OL);
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      if (tm)
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        return TargetMachineCtorFn(*this, *tm, pTriple);
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return NULL;
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// createMCLinker - create target-specific MCLinker
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @return created MCLinker
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLinker *createMCLinker(const std::string &pTriple,
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           LinkerConfig& pConfig,
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           Module& pModule,
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           MemoryArea& pOutput) const {
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (!MCLinkerCtorFn)
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      return NULL;
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return MCLinkerCtorFn(pTriple, pConfig, pModule, pOutput);
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// emulate - given MCLinker default values for the other aspects of the
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// target system.
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool emulate(LinkerScript& pScript, LinkerConfig& pConfig) const {
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (!EmulationFn)
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return false;
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    return EmulationFn(pScript, pConfig);
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// createLDBackend - create target-specific LDBackend
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return created TargetLDBackend
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  TargetLDBackend* createLDBackend(const LinkerConfig& pConfig) const
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (!TargetLDBackendCtorFn)
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      return NULL;
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return TargetLDBackendCtorFn(*get(), pConfig);
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// createDiagnosticLineInfo - create target-specific DiagnosticLineInfo
11467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  DiagnosticLineInfo* createDiagnosticLineInfo(const mcld::Target& pTarget,
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                               const std::string& pTriple) const
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    if (!DiagnosticLineInfoCtorFn)
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      return NULL;
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return DiagnosticLineInfoCtorFn(pTarget, pTriple);
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const llvm::Target* get() const { return m_pT; }
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  function pointers  ----- //
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  TargetMachineCtorTy TargetMachineCtorFn;
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLinkerCtorTy MCLinkerCtorFn;
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  EmulationFnTy EmulationFn;
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  TargetLDBackendCtorTy TargetLDBackendCtorFn;
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticLineInfoCtorTy DiagnosticLineInfoCtorFn;
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  adapted llvm::Target  ----- //
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const llvm::Target* m_pT;
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// TargetRegistry - mcld::TargetRegistry is an object adapter of
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// llvm::TargetRegistry
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetRegistry
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::list<mcld::Target*> TargetListTy;
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef TargetListTy::iterator iterator;
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static TargetListTy s_TargetList;
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static iterator begin() { return s_TargetList.begin(); }
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static iterator end() { return s_TargetList.end(); }
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static size_t size() { return s_TargetList.size(); }
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool empty() { return s_TargetList.empty(); }
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// RegisterTarget - Register the given target. Attempts to register a
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// target which has already been registered will be ignored.
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Clients are responsible for ensuring that registration doesn't occur
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// while another thread is attempting to access the registry. Typically
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// this is done by initializing all targets at program startup.
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param T - The target being registered.
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static void RegisterTarget(mcld::Target &T);
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// RegisterTargetMachine - Register a TargetMachine implementation for the
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// given target.
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param T - The target being registered.
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param Fn - A function to construct a TargetMachine for the target.
171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static void RegisterTargetMachine(mcld::Target &T, mcld::Target::TargetMachineCtorTy Fn)
172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Ignore duplicate registration.
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (!T.TargetMachineCtorFn)
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      T.TargetMachineCtorFn = Fn;
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// RegisterMCLinker - Register a MCLinker implementation for the given
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// target.
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param T - the target being registered
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param Fn - A function to create MCLinker for the target
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static void RegisterMCLinker(mcld::Target &T, mcld::Target::MCLinkerCtorTy Fn)
184affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (!T.MCLinkerCtorFn)
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      T.MCLinkerCtorFn = Fn;
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// RegisterEmulation - Register a emulation function for the target.
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// target.
19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///
19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param T - the target being registered
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param Fn - A emulation function
19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static void RegisterEmulation(mcld::Target &T, mcld::Target::EmulationFnTy Fn)
19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (!T.EmulationFn)
19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      T.EmulationFn = Fn;
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// RegisterTargetLDBackend - Register a TargetLDBackend implementation for
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// the given target.
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param T - The target being registered
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param Fn - A function to create TargetLDBackend for the target
205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static void RegisterTargetLDBackend(mcld::Target &T, mcld::Target::TargetLDBackendCtorTy Fn)
206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (!T.TargetLDBackendCtorFn)
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      T.TargetLDBackendCtorFn = Fn;
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
211affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// RegisterTargetDiagnosticLineInfo - Register a DiagnosticLineInfo
212affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// implementation for the given target.
213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ///
214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param T - The target being registered
215affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param Fn - A function to create DiagnosticLineInfo for the target
216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static void
217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  RegisterDiagnosticLineInfo(mcld::Target &T,
218affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                             mcld::Target::DiagnosticLineInfoCtorTy Fn)
219affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
220affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    if (!T.DiagnosticLineInfoCtorFn)
221affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      T.DiagnosticLineInfoCtorFn = Fn;
222affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
223affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// lookupTarget - Lookup a target based on a llvm::Target.
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param T - The llvm::Target to find
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static const mcld::Target *lookupTarget(const llvm::Target& T);
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// lookupTarget - function wrapper of llvm::TargetRegistry::lookupTarget
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param Triple - The Triple string
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param Error  - The returned error message
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static const mcld::Target *lookupTarget(const std::string &Triple,
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                          std::string &Error);
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// RegisterTarget - Helper function for registering a target, for use in the
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// target's initialization function. Usage:
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// Target TheFooTarget; // The global target instance.
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// extern "C" void MCLDInitializeFooTargetInfo() {
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///   RegisterTarget X(TheFooTarget, "foo", "Foo description");
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// }
2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct RegisterTarget
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  RegisterTarget(mcld::Target &T, const char *Name) {
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    llvm::TargetRegistry::iterator TIter, TEnd = llvm::TargetRegistry::end();
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // lookup llvm::Target
2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    for( TIter=llvm::TargetRegistry::begin(); TIter!=TEnd; ++TIter ) {
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      if( 0==strcmp(TIter->getName(), Name) )
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (TIter != TEnd)
25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      T.setTarget(*TIter);
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    TargetRegistry::RegisterTarget(T);
2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// RegisterTargetMachine - Helper template for registering a target machine
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// implementation, for use in the target machine initialization
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// function. Usage:
2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// extern "C" void MCLDInitializeFooTarget() {
2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///   extern mcld::Target TheFooTarget;
2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///   RegisterTargetMachine<mcld::FooTargetMachine> X(TheFooTarget);
2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// }
2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<class TargetMachineImpl>
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct RegisterTargetMachine
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  RegisterTargetMachine(mcld::Target &T) {
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    TargetRegistry::RegisterTargetMachine(T, &Allocator);
2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
27822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static mcld::MCLDTargetMachine *Allocator(const mcld::Target &T,
2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            llvm::TargetMachine& TM,
2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            const std::string &Triple) {
2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return new TargetMachineImpl(TM, T, Triple);
2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} //end namespace mcld
2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
289