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_DSOFile, 40 CGFT_EXEFile, 41 CGFT_NULLFile 42 }; 43 44 45 /** \class mcld::LLVMTargetMachine 46 * \brief mcld::LLVMTargetMachine is a object adapter of 47 * llvm::LLVMTargetMachine. 48 * 49 * mcld::LLVMTargetMachine is also in charge of MCLDInfo. 50 * 51 * @see MCLDInfo 52 */ 53 class LLVMTargetMachine 54 { 55 public: 56 /// Adapter of llvm::TargetMachine 57 /// 58 LLVMTargetMachine(llvm::TargetMachine &pTM, 59 const mcld::Target &pTarget, 60 const std::string &pTriple); 61 virtual ~LLVMTargetMachine(); 62 63 /// getTarget - adapt llvm::TargetMachine::getTarget 64 const mcld::Target& getTarget() const; 65 66 /// getTM - return adapted the llvm::TargetMachine. getTM()67 const llvm::TargetMachine& getTM() const { return m_TM; } getTM()68 llvm::TargetMachine& getTM() { return m_TM; } 69 70 /// getLDInfo - return the mcld::MCLDInfo 71 virtual mcld::MCLDInfo& getLDInfo() = 0; 72 virtual const mcld::MCLDInfo& getLDInfo() const = 0; 73 74 /// appPassesToEmitFile - The target function which we has to modify as 75 /// upstreaming. 76 bool addPassesToEmitFile(PassManagerBase &, 77 formatted_raw_ostream &Out, 78 const std::string &pOutputFilename, 79 mcld::CodeGenFileType, 80 CodeGenOpt::Level, 81 SectLinkerOption *pLinkerOpt = NULL, 82 bool DisableVerify = true); 83 84 /// getTargetData getTargetData()85 const TargetData *getTargetData() const { return m_TM.getTargetData(); } 86 87 /// setAsmVerbosityDefault setAsmVerbosityDefault(bool pAsmVerbose)88 static void setAsmVerbosityDefault(bool pAsmVerbose) { 89 llvm::TargetMachine::setAsmVerbosityDefault(pAsmVerbose); 90 } 91 92 private: 93 /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for 94 /// both emitting to assembly files or machine code output. 95 bool addCommonCodeGenPasses(PassManagerBase &, 96 mcld::CodeGenFileType, 97 CodeGenOpt::Level, 98 bool DisableVerify, 99 llvm::MCContext *&OutCtx); 100 101 bool addCompilerPasses(PassManagerBase &, 102 formatted_raw_ostream &Out, 103 const std::string& pOutputFilename, 104 llvm::MCContext *&OutCtx); 105 106 bool addAssemblerPasses(PassManagerBase &, 107 formatted_raw_ostream &Out, 108 const std::string& pOutputFilename, 109 llvm::MCContext *&OutCtx); 110 111 bool addLinkerPasses(PassManagerBase &, 112 SectLinkerOption *pLinkerOpt, 113 const std::string& pOutputFilename, 114 MCLDFile::Type pOutputLinkType, 115 llvm::MCContext *&OutCtx); 116 117 private: 118 llvm::TargetMachine &m_TM; 119 const mcld::Target *m_pTarget; 120 const std::string& m_Triple; 121 }; 122 123 } // namespace of mcld 124 125 #endif 126 127