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