• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- TargetMachine.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_TARGET_MACHINE_H
10 #define MCLD_TARGET_MACHINE_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 #include <llvm/Target/TargetMachine.h>
15 #include <string>
16 #include "mcld/MC/MCLDFile.h"
17 
18 namespace llvm
19 {
20 class Target;
21 class TargetData;
22 class TargetMachine;
23 class PassManagerBase;
24 class formatted_raw_ostream;
25 
26 } // namespace of llvm
27 
28 namespace mcld
29 {
30 
31 class Target;
32 class MCLDInfo;
33 class SectLinkerOption;
34 using namespace llvm;
35 
36 enum CodeGenFileType {
37   CGFT_ASMFile,
38   CGFT_OBJFile,
39   CGFT_ARCFile,
40   CGFT_DSOFile,
41   CGFT_EXEFile,
42   CGFT_NULLFile
43 };
44 
45 
46 /** \class mcld::LLVMTargetMachine
47  *  \brief mcld::LLVMTargetMachine is a object adapter of
48  *  llvm::LLVMTargetMachine.
49  *
50  *  mcld::LLVMTargetMachine is also in charge of MCLDInfo.
51  *
52  *  @see MCLDInfo
53  */
54 class LLVMTargetMachine
55 {
56 public:
57   /// Adapter of llvm::TargetMachine
58   ///
59   LLVMTargetMachine(llvm::TargetMachine &pTM,
60                     const mcld::Target &pTarget,
61                     const std::string &pTriple);
62   virtual ~LLVMTargetMachine();
63 
64   /// getTarget - adapt llvm::TargetMachine::getTarget
65   const mcld::Target& getTarget() const;
66 
67   /// getTM - return adapted the llvm::TargetMachine.
getTM()68   const llvm::TargetMachine& getTM() const { return m_TM; }
getTM()69   llvm::TargetMachine& getTM() { return m_TM; }
70 
71   /// getLDInfo - return the mcld::MCLDInfo
72   virtual mcld::MCLDInfo& getLDInfo() = 0;
73   virtual const mcld::MCLDInfo& getLDInfo() const = 0;
74 
75   /// appPassesToEmitFile - The target function which we has to modify as
76   /// upstreaming.
77   bool addPassesToEmitFile(PassManagerBase &,
78                            formatted_raw_ostream &Out,
79                            const std::string &pOutputFilename,
80                            mcld::CodeGenFileType,
81                            CodeGenOpt::Level,
82                            SectLinkerOption *pLinkerOpt = NULL,
83                            bool DisableVerify = true);
84 
85   /// getTargetData
getTargetData()86   const TargetData *getTargetData() const { return m_TM.getTargetData(); }
87 
88   /// setAsmVerbosityDefault
setAsmVerbosityDefault(bool pAsmVerbose)89   static void setAsmVerbosityDefault(bool pAsmVerbose) {
90     llvm::TargetMachine::setAsmVerbosityDefault(pAsmVerbose);
91   }
92 
93 private:
94   /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
95   /// both emitting to assembly files or machine code output.
96   bool addCommonCodeGenPasses(PassManagerBase &,
97                               mcld::CodeGenFileType,
98                               CodeGenOpt::Level,
99                               bool DisableVerify,
100                               llvm::MCContext *&OutCtx);
101 
102   bool addCompilerPasses(PassManagerBase &,
103                          formatted_raw_ostream &Out,
104                          const std::string& pOutputFilename,
105                          llvm::MCContext *&OutCtx);
106 
107   bool addAssemblerPasses(PassManagerBase &,
108                           formatted_raw_ostream &Out,
109                           const std::string& pOutputFilename,
110                           llvm::MCContext *&OutCtx);
111 
112   bool addLinkerPasses(PassManagerBase &,
113                        SectLinkerOption *pLinkerOpt,
114                        const std::string& pOutputFilename,
115                        MCLDFile::Type pOutputLinkType,
116                        llvm::MCContext *&OutCtx);
117 
118 private:
119   llvm::TargetMachine &m_TM;
120   const mcld::Target *m_pTarget;
121   const std::string& m_Triple;
122 };
123 
124 } // namespace of mcld
125 
126 #endif
127 
128