//===- TargetMachine.h ----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_TARGET_MACHINE_H #define MCLD_TARGET_MACHINE_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <llvm/Target/TargetMachine.h> #include <string> #include "mcld/MC/MCLDFile.h" namespace llvm { class Target; class TargetData; class TargetMachine; class PassManagerBase; class formatted_raw_ostream; } // namespace of llvm namespace mcld { class Target; class MCLDInfo; class SectLinkerOption; using namespace llvm; enum CodeGenFileType { CGFT_ASMFile, CGFT_OBJFile, CGFT_DSOFile, CGFT_EXEFile, CGFT_NULLFile }; /** \class mcld::LLVMTargetMachine * \brief mcld::LLVMTargetMachine is a object adapter of * llvm::LLVMTargetMachine. * * mcld::LLVMTargetMachine is also in charge of MCLDInfo. * * @see MCLDInfo */ class LLVMTargetMachine { public: /// Adapter of llvm::TargetMachine /// LLVMTargetMachine(llvm::TargetMachine &pTM, const mcld::Target &pTarget, const std::string &pTriple); virtual ~LLVMTargetMachine(); /// 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; } /// getLDInfo - return the mcld::MCLDInfo virtual mcld::MCLDInfo& getLDInfo() = 0; virtual const mcld::MCLDInfo& getLDInfo() const = 0; /// appPassesToEmitFile - The target function which we has to modify as /// upstreaming. bool addPassesToEmitFile(PassManagerBase &, formatted_raw_ostream &Out, const std::string &pOutputFilename, mcld::CodeGenFileType, CodeGenOpt::Level, SectLinkerOption *pLinkerOpt = NULL, bool DisableVerify = true); /// getTargetData const TargetData *getTargetData() const { return m_TM.getTargetData(); } /// setAsmVerbosityDefault static void setAsmVerbosityDefault(bool pAsmVerbose) { llvm::TargetMachine::setAsmVerbosityDefault(pAsmVerbose); } private: /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for /// both emitting to assembly files or machine code output. bool addCommonCodeGenPasses(PassManagerBase &, mcld::CodeGenFileType, CodeGenOpt::Level, bool DisableVerify, llvm::MCContext *&OutCtx); bool addCompilerPasses(PassManagerBase &, formatted_raw_ostream &Out, const std::string& pOutputFilename, llvm::MCContext *&OutCtx); bool addAssemblerPasses(PassManagerBase &, formatted_raw_ostream &Out, const std::string& pOutputFilename, llvm::MCContext *&OutCtx); bool addLinkerPasses(PassManagerBase &, SectLinkerOption *pLinkerOpt, const std::string& pOutputFilename, MCLDFile::Type pOutputLinkType, llvm::MCContext *&OutCtx); private: llvm::TargetMachine &m_TM; const mcld::Target *m_pTarget; const std::string& m_Triple; }; } // namespace of mcld #endif