//===- 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_ARCFile,
  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

