1//===- Target.h -----------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_SUPPORT_TARGET_H_
10#define MCLD_SUPPORT_TARGET_H_
11#include <string>
12
13namespace llvm {
14class Target;
15class Triple;
16class TargetMachine;
17}  // namespace llvm
18
19namespace mcld {
20
21class MCLDTargetMachine;
22class TargetRegistry;
23class MCLinker;
24class LinkerScript;
25class LinkerConfig;
26class Module;
27class FileHandle;
28class DiagnosticLineInfo;
29class TargetLDBackend;
30
31/** \class Target
32 *  \brief Target collects target specific information
33 */
34class Target {
35  friend class mcld::MCLDTargetMachine;
36  friend class mcld::TargetRegistry;
37
38 public:
39  typedef unsigned int (*TripleMatchQualityFnTy)(const llvm::Triple& pTriple);
40
41  typedef MCLDTargetMachine* (*TargetMachineCtorTy)(const llvm::Target&,
42                                                    const mcld::Target&,
43                                                    llvm::TargetMachine&,
44                                                    const std::string&);
45
46  typedef MCLinker* (*MCLinkerCtorTy)(const std::string& pTriple,
47                                      LinkerConfig&,
48                                      Module&,
49                                      FileHandle& pFileHandle);
50
51  typedef bool (*EmulationFnTy)(LinkerScript&, LinkerConfig&);
52
53  typedef TargetLDBackend* (*TargetLDBackendCtorTy)(const LinkerConfig&);
54
55  typedef DiagnosticLineInfo* (*DiagnosticLineInfoCtorTy)(const mcld::Target&,
56                                                          const std::string&);
57
58 public:
59  Target();
60
61  /// getName - get the target name
62  const char* name() const { return Name; }
63
64  unsigned int getTripleQuality(const llvm::Triple& pTriple) const;
65
66  /// createTargetMachine - create target-specific TargetMachine
67  MCLDTargetMachine* createTargetMachine(const std::string& pTriple,
68                                         const llvm::Target& pTarget,
69                                         llvm::TargetMachine& pTM) const;
70
71  /// createMCLinker - create target-specific MCLinker
72  MCLinker* createMCLinker(const std::string& pTriple,
73                           LinkerConfig& pConfig,
74                           Module& pModule,
75                           FileHandle& pFileHandle) const;
76
77  /// emulate - given MCLinker default values for the other aspects of the
78  /// target system.
79  bool emulate(LinkerScript& pScript, LinkerConfig& pConfig) const;
80
81  /// createLDBackend - create target-specific LDBackend
82  TargetLDBackend* createLDBackend(const LinkerConfig& pConfig) const;
83
84  /// createDiagnosticLineInfo - create target-specific DiagnosticLineInfo
85  DiagnosticLineInfo* createDiagnosticLineInfo(
86      const mcld::Target& pTarget,
87      const std::string& pTriple) const;
88
89 private:
90  /// Name - The target name
91  const char* Name;
92
93  TripleMatchQualityFnTy TripleMatchQualityFn;
94  TargetMachineCtorTy TargetMachineCtorFn;
95  MCLinkerCtorTy MCLinkerCtorFn;
96  EmulationFnTy EmulationFn;
97  TargetLDBackendCtorTy TargetLDBackendCtorFn;
98  DiagnosticLineInfoCtorTy DiagnosticLineInfoCtorFn;
99};
100
101}  // namespace mcld
102
103#endif  // MCLD_SUPPORT_TARGET_H_
104