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 
13 namespace llvm {
14 class Target;
15 class Triple;
16 class TargetMachine;
17 }  // namespace llvm
18 
19 namespace mcld {
20 
21 class MCLDTargetMachine;
22 class TargetRegistry;
23 class MCLinker;
24 class LinkerScript;
25 class LinkerConfig;
26 class Module;
27 class FileHandle;
28 class DiagnosticLineInfo;
29 class TargetLDBackend;
30 
31 /** \class Target
32  *  \brief Target collects target specific information
33  */
34 class 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
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