| //===- 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_TARGET_MACHINE_H |
| #define MCLD_TARGET_TARGET_MACHINE_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| #include <llvm/Target/TargetMachine.h> |
| #include <string> |
| |
| namespace llvm { |
| |
| class Target; |
| class TargetData; |
| class TargetMachine; |
| class PassManagerBase; |
| |
| } // namespace of llvm |
| |
| namespace mcld { |
| |
| class Module; |
| class Target; |
| class MemoryArea; |
| class LinkerConfig; |
| class ToolOutputFile; |
| |
| using namespace llvm; |
| |
| 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 mcld::Target &pTarget, |
| 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(PassManagerBase &, |
| mcld::ToolOutputFile& pOutput, |
| mcld::CodeGenFileType, |
| CodeGenOpt::Level, |
| mcld::Module& pModule, |
| mcld::LinkerConfig& pConfig, |
| bool DisableVerify = true); |
| |
| /// getDataLayout |
| const DataLayout *getDataLayout() const { return m_TM.getDataLayout(); } |
| |
| /// 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 &pPM, |
| llvm::formatted_raw_ostream &pOutput, |
| llvm::MCContext *&OutCtx); |
| |
| bool addAssemblerPasses(PassManagerBase &pPM, |
| llvm::raw_ostream &pOutput, |
| llvm::MCContext *&OutCtx); |
| |
| bool addLinkerPasses(PassManagerBase &pPM, |
| LinkerConfig& pConfig, |
| Module& pModule, |
| mcld::MemoryArea& pOutput, |
| llvm::MCContext *&OutCtx); |
| |
| private: |
| llvm::TargetMachine &m_TM; |
| const mcld::Target *m_pTarget; |
| const std::string& m_Triple; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |