15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- TargetMachine.h ----------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#ifndef MCLD_CODEGEN_TARGETMACHINE_H
10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define MCLD_CODEGEN_TARGETMACHINE_H
11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/CodeGen.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace llvm {
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Target;
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetData;
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetMachine;
19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesclass MCContext;
20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesclass raw_ostream;
21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesclass formatted_raw_ostream;
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesnamespace legacy {
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass PassManagerBase;
24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} // namepsace legacy
25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} // namespace llvm
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Target;
31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesclass FileHandle;
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ToolOutputFile;
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoenum CodeGenFileType {
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  CGFT_ASMFile,
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  CGFT_OBJFile,
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  CGFT_DSOFile,
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  CGFT_EXEFile,
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CGFT_PARTIAL,
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  CGFT_BINARY,
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  CGFT_NULLFile
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class mcld::MCLDTargetMachine
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief mcld::MCLDTargetMachine is a object adapter of LLVMTargetMachine.
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MCLDTargetMachine
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Adapter of llvm::TargetMachine
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  MCLDTargetMachine(llvm::TargetMachine& pTM,
55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                    const llvm::Target& pLLMVTarget,
56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                    const mcld::Target& pMCLDTarget,
57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                    const std::string& pTriple);
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ~MCLDTargetMachine();
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getTarget - adapt llvm::TargetMachine::getTarget
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const mcld::Target& getTarget() const;
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getTM - return adapted the llvm::TargetMachine.
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const llvm::TargetMachine& getTM() const { return m_TM; }
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  llvm::TargetMachine&       getTM()       { return m_TM; }
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// appPassesToEmitFile - The target function which we has to modify as
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// upstreaming.
70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  bool addPassesToEmitFile(llvm::legacy::PassManagerBase &,
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           mcld::ToolOutputFile& pOutput,
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           mcld::CodeGenFileType,
73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                           llvm::CodeGenOpt::Level,
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           mcld::Module& pModule,
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           mcld::LinkerConfig& pConfig,
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           bool DisableVerify = true);
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// both emitting to assembly files or machine code output.
81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  bool addCommonCodeGenPasses(llvm::legacy::PassManagerBase &,
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              mcld::CodeGenFileType,
83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                              llvm::CodeGenOpt::Level,
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              bool DisableVerify,
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              llvm::MCContext *&OutCtx);
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  bool addCompilerPasses(llvm::legacy::PassManagerBase &pPM,
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                         llvm::formatted_raw_ostream &pOutput,
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         llvm::MCContext *&OutCtx);
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  bool addAssemblerPasses(llvm::legacy::PassManagerBase &pPM,
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          llvm::raw_ostream &pOutput,
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          llvm::MCContext *&OutCtx);
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  bool addLinkerPasses(llvm::legacy::PassManagerBase &pPM,
96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                       mcld::LinkerConfig& pConfig,
97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                       mcld::Module& pModule,
98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                       mcld::FileHandle& pFileHandle,
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       llvm::MCContext *&OutCtx);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::TargetMachine &m_TM;
103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const llvm::Target *m_pLLVMTarget;
104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const mcld::Target *m_pMCLDTarget;
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const std::string& m_Triple;
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
112