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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_TARGET_MACHINE_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_TARGET_MACHINE_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetMachine.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/MC/MCLDFile.h" 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace llvm 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Target; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetData; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetMachine; 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass PassManagerBase; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass formatted_raw_ostream; 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of llvm 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Target; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLDInfo; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SectLinkerOption; 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace llvm; 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoenum CodeGenFileType { 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CGFT_ASMFile, 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CGFT_OBJFile, 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CGFT_DSOFile, 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CGFT_EXEFile, 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CGFT_NULLFile 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class mcld::LLVMTargetMachine 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief mcld::LLVMTargetMachine is a object adapter of 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * llvm::LLVMTargetMachine. 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * mcld::LLVMTargetMachine is also in charge of MCLDInfo. 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * @see MCLDInfo 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LLVMTargetMachine 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Adapter of llvm::TargetMachine 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LLVMTargetMachine(llvm::TargetMachine &pTM, 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const mcld::Target &pTarget, 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string &pTriple); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~LLVMTargetMachine(); 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getTarget - adapt llvm::TargetMachine::getTarget 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const mcld::Target& getTarget() const; 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getTM - return adapted the llvm::TargetMachine. 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const llvm::TargetMachine& getTM() const { return m_TM; } 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetMachine& getTM() { return m_TM; } 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getLDInfo - return the mcld::MCLDInfo 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual mcld::MCLDInfo& getLDInfo() = 0; 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual const mcld::MCLDInfo& getLDInfo() const = 0; 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// appPassesToEmitFile - The target function which we has to modify as 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// upstreaming. 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool addPassesToEmitFile(PassManagerBase &, 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao formatted_raw_ostream &Out, 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string &pOutputFilename, 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao mcld::CodeGenFileType, 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CodeGenOpt::Level, 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SectLinkerOption *pLinkerOpt = NULL, 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool DisableVerify = true); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getTargetData 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const TargetData *getTargetData() const { return m_TM.getTargetData(); } 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setAsmVerbosityDefault 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static void setAsmVerbosityDefault(bool pAsmVerbose) { 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetMachine::setAsmVerbosityDefault(pAsmVerbose); 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// both emitting to assembly files or machine code output. 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool addCommonCodeGenPasses(PassManagerBase &, 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao mcld::CodeGenFileType, 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CodeGenOpt::Level, 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool DisableVerify, 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&OutCtx); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool addCompilerPasses(PassManagerBase &, 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao formatted_raw_ostream &Out, 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pOutputFilename, 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&OutCtx); 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool addAssemblerPasses(PassManagerBase &, 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao formatted_raw_ostream &Out, 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pOutputFilename, 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&OutCtx); 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool addLinkerPasses(PassManagerBase &, 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SectLinkerOption *pLinkerOpt, 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pOutputFilename, 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDFile::Type pOutputLinkType, 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&OutCtx); 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetMachine &m_TM; 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const mcld::Target *m_pTarget; 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& m_Triple; 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 127