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
17namespace llvm {
18
19class Target;
20class TargetData;
21class TargetMachine;
22class PassManagerBase;
23
24} // namespace of llvm
25
26namespace mcld {
27
28class Module;
29class Target;
30class MemoryArea;
31class LinkerConfig;
32class ToolOutputFile;
33
34using namespace llvm;
35
36enum 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 */
50class MCLDTargetMachine
51{
52public:
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
86private:
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
109private:
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