//===- TargetMachine.h ----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_CODEGEN_TARGETMACHINE_H #define MCLD_CODEGEN_TARGETMACHINE_H #include #include namespace llvm { class Target; class TargetData; class TargetMachine; class MCContext; class raw_ostream; class formatted_raw_ostream; namespace legacy { class PassManagerBase; } // namepsace legacy } // namespace llvm namespace mcld { class Module; class Target; class FileHandle; class LinkerConfig; class ToolOutputFile; enum CodeGenFileType { CGFT_ASMFile, CGFT_OBJFile, CGFT_DSOFile, CGFT_EXEFile, CGFT_PARTIAL, CGFT_BINARY, CGFT_NULLFile }; /** \class mcld::MCLDTargetMachine * \brief mcld::MCLDTargetMachine is a object adapter of LLVMTargetMachine. */ class MCLDTargetMachine { public: /// Adapter of llvm::TargetMachine /// MCLDTargetMachine(llvm::TargetMachine& pTM, const llvm::Target& pLLMVTarget, const mcld::Target& pMCLDTarget, const std::string& pTriple); virtual ~MCLDTargetMachine(); /// getTarget - adapt llvm::TargetMachine::getTarget const mcld::Target& getTarget() const; /// getTM - return adapted the llvm::TargetMachine. const llvm::TargetMachine& getTM() const { return m_TM; } llvm::TargetMachine& getTM() { return m_TM; } /// appPassesToEmitFile - The target function which we has to modify as /// upstreaming. bool addPassesToEmitFile(llvm::legacy::PassManagerBase &, mcld::ToolOutputFile& pOutput, mcld::CodeGenFileType, llvm::CodeGenOpt::Level, mcld::Module& pModule, mcld::LinkerConfig& pConfig, bool DisableVerify = true); private: /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for /// both emitting to assembly files or machine code output. bool addCommonCodeGenPasses(llvm::legacy::PassManagerBase &, mcld::CodeGenFileType, llvm::CodeGenOpt::Level, bool DisableVerify, llvm::MCContext *&OutCtx); bool addCompilerPasses(llvm::legacy::PassManagerBase &pPM, llvm::formatted_raw_ostream &pOutput, llvm::MCContext *&OutCtx); bool addAssemblerPasses(llvm::legacy::PassManagerBase &pPM, llvm::raw_ostream &pOutput, llvm::MCContext *&OutCtx); bool addLinkerPasses(llvm::legacy::PassManagerBase &pPM, mcld::LinkerConfig& pConfig, mcld::Module& pModule, mcld::FileHandle& pFileHandle, llvm::MCContext *&OutCtx); private: llvm::TargetMachine &m_TM; const llvm::Target *m_pLLVMTarget; const mcld::Target *m_pMCLDTarget; const std::string& m_Triple; }; } // namespace of mcld #endif