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