| //===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file defines the TargetMachine and LLVMTargetMachine classes. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TARGET_TARGETMACHINE_H | |
| #define LLVM_TARGET_TARGETMACHINE_H | |
| #include "llvm/MC/MCCodeGenInfo.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include <cassert> | |
| #include <string> | |
| namespace llvm { | |
| class InstrItineraryData; | |
| class JITCodeEmitter; | |
| class MCAsmInfo; | |
| class MCCodeGenInfo; | |
| class MCContext; | |
| class Pass; | |
| class PassManager; | |
| class PassManagerBase; | |
| class Target; | |
| class TargetData; | |
| class TargetELFWriterInfo; | |
| class TargetFrameLowering; | |
| class TargetInstrInfo; | |
| class TargetIntrinsicInfo; | |
| class TargetJITInfo; | |
| class TargetLowering; | |
| class TargetRegisterInfo; | |
| class TargetSelectionDAGInfo; | |
| class TargetSubtargetInfo; | |
| class formatted_raw_ostream; | |
| class raw_ostream; | |
| // Code generation optimization level. | |
| namespace CodeGenOpt { | |
| enum Level { | |
| None, // -O0 | |
| Less, // -O1 | |
| Default, // -O2, -Os | |
| Aggressive // -O3 | |
| }; | |
| } | |
| namespace Sched { | |
| enum Preference { | |
| None, // No preference | |
| Latency, // Scheduling for shortest total latency. | |
| RegPressure, // Scheduling for lowest register pressure. | |
| Hybrid, // Scheduling for both latency and register pressure. | |
| ILP // Scheduling for ILP in low register pressure mode. | |
| }; | |
| } | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// TargetMachine - Primary interface to the complete machine description for | |
| /// the target machine. All target-specific information should be accessible | |
| /// through this interface. | |
| /// | |
| class TargetMachine { | |
| TargetMachine(const TargetMachine &); // DO NOT IMPLEMENT | |
| void operator=(const TargetMachine &); // DO NOT IMPLEMENT | |
| protected: // Can only create subclasses. | |
| TargetMachine(const Target &T, StringRef TargetTriple, | |
| StringRef CPU, StringRef FS); | |
| /// getSubtargetImpl - virtual method implemented by subclasses that returns | |
| /// a reference to that target's TargetSubtargetInfo-derived member variable. | |
| virtual const TargetSubtargetInfo *getSubtargetImpl() const { return 0; } | |
| /// TheTarget - The Target that this machine was created for. | |
| const Target &TheTarget; | |
| /// TargetTriple, TargetCPU, TargetFS - Triple string, CPU name, and target | |
| /// feature strings the TargetMachine instance is created with. | |
| std::string TargetTriple; | |
| std::string TargetCPU; | |
| std::string TargetFS; | |
| /// CodeGenInfo - Low level target information such as relocation model. | |
| const MCCodeGenInfo *CodeGenInfo; | |
| /// AsmInfo - Contains target specific asm information. | |
| /// | |
| const MCAsmInfo *AsmInfo; | |
| unsigned MCRelaxAll : 1; | |
| unsigned MCNoExecStack : 1; | |
| unsigned MCSaveTempLabels : 1; | |
| unsigned MCUseLoc : 1; | |
| unsigned MCUseCFI : 1; | |
| public: | |
| virtual ~TargetMachine(); | |
| const Target &getTarget() const { return TheTarget; } | |
| const StringRef getTargetTriple() const { return TargetTriple; } | |
| const StringRef getTargetCPU() const { return TargetCPU; } | |
| const StringRef getTargetFeatureString() const { return TargetFS; } | |
| // Interfaces to the major aspects of target machine information: | |
| // -- Instruction opcode and operand information | |
| // -- Pipelines and scheduling information | |
| // -- Stack frame information | |
| // -- Selection DAG lowering information | |
| // | |
| virtual const TargetInstrInfo *getInstrInfo() const { return 0; } | |
| virtual const TargetFrameLowering *getFrameLowering() const { return 0; } | |
| virtual const TargetLowering *getTargetLowering() const { return 0; } | |
| virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const{ return 0; } | |
| virtual const TargetData *getTargetData() const { return 0; } | |
| /// getMCAsmInfo - Return target specific asm information. | |
| /// | |
| const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; } | |
| /// getSubtarget - This method returns a pointer to the specified type of | |
| /// TargetSubtargetInfo. In debug builds, it verifies that the object being | |
| /// returned is of the correct type. | |
| template<typename STC> const STC &getSubtarget() const { | |
| return *static_cast<const STC*>(getSubtargetImpl()); | |
| } | |
| /// getRegisterInfo - If register information is available, return it. If | |
| /// not, return null. This is kept separate from RegInfo until RegInfo has | |
| /// details of graph coloring register allocation removed from it. | |
| /// | |
| virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; } | |
| /// getIntrinsicInfo - If intrinsic information is available, return it. If | |
| /// not, return null. | |
| /// | |
| virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; } | |
| /// getJITInfo - If this target supports a JIT, return information for it, | |
| /// otherwise return null. | |
| /// | |
| virtual TargetJITInfo *getJITInfo() { return 0; } | |
| /// getInstrItineraryData - Returns instruction itinerary data for the target | |
| /// or specific subtarget. | |
| /// | |
| virtual const InstrItineraryData *getInstrItineraryData() const { | |
| return 0; | |
| } | |
| /// getELFWriterInfo - If this target supports an ELF writer, return | |
| /// information for it, otherwise return null. | |
| /// | |
| virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; } | |
| /// hasMCRelaxAll - Check whether all machine code instructions should be | |
| /// relaxed. | |
| bool hasMCRelaxAll() const { return MCRelaxAll; } | |
| /// setMCRelaxAll - Set whether all machine code instructions should be | |
| /// relaxed. | |
| void setMCRelaxAll(bool Value) { MCRelaxAll = Value; } | |
| /// hasMCSaveTempLabels - Check whether temporary labels will be preserved | |
| /// (i.e., not treated as temporary). | |
| bool hasMCSaveTempLabels() const { return MCSaveTempLabels; } | |
| /// setMCSaveTempLabels - Set whether temporary labels will be preserved | |
| /// (i.e., not treated as temporary). | |
| void setMCSaveTempLabels(bool Value) { MCSaveTempLabels = Value; } | |
| /// hasMCNoExecStack - Check whether an executable stack is not needed. | |
| bool hasMCNoExecStack() const { return MCNoExecStack; } | |
| /// setMCNoExecStack - Set whether an executabel stack is not needed. | |
| void setMCNoExecStack(bool Value) { MCNoExecStack = Value; } | |
| /// hasMCUseLoc - Check whether we should use dwarf's .loc directive. | |
| bool hasMCUseLoc() const { return MCUseLoc; } | |
| /// setMCUseLoc - Set whether all we should use dwarf's .loc directive. | |
| void setMCUseLoc(bool Value) { MCUseLoc = Value; } | |
| /// hasMCUseCFI - Check whether we should use dwarf's .cfi_* directives. | |
| bool hasMCUseCFI() const { return MCUseCFI; } | |
| /// setMCUseCFI - Set whether all we should use dwarf's .cfi_* directives. | |
| void setMCUseCFI(bool Value) { MCUseCFI = Value; } | |
| /// getRelocationModel - Returns the code generation relocation model. The | |
| /// choices are static, PIC, and dynamic-no-pic, and target default. | |
| Reloc::Model getRelocationModel() const; | |
| /// getCodeModel - Returns the code model. The choices are small, kernel, | |
| /// medium, large, and target default. | |
| CodeModel::Model getCodeModel() const; | |
| /// getAsmVerbosityDefault - Returns the default value of asm verbosity. | |
| /// | |
| static bool getAsmVerbosityDefault(); | |
| /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default | |
| /// is false. | |
| static void setAsmVerbosityDefault(bool); | |
| /// getDataSections - Return true if data objects should be emitted into their | |
| /// own section, corresponds to -fdata-sections. | |
| static bool getDataSections(); | |
| /// getFunctionSections - Return true if functions should be emitted into | |
| /// their own section, corresponding to -ffunction-sections. | |
| static bool getFunctionSections(); | |
| /// setDataSections - Set if the data are emit into separate sections. | |
| static void setDataSections(bool); | |
| /// setFunctionSections - Set if the functions are emit into separate | |
| /// sections. | |
| static void setFunctionSections(bool); | |
| /// CodeGenFileType - These enums are meant to be passed into | |
| /// addPassesToEmitFile to indicate what type of file to emit, and returned by | |
| /// it to indicate what type of file could actually be made. | |
| enum CodeGenFileType { | |
| CGFT_AssemblyFile, | |
| CGFT_ObjectFile, | |
| CGFT_Null // Do not emit any output. | |
| }; | |
| /// getEnableTailMergeDefault - the default setting for -enable-tail-merge | |
| /// on this target. User flag overrides. | |
| virtual bool getEnableTailMergeDefault() const { return true; } | |
| /// addPassesToEmitFile - Add passes to the specified pass manager to get the | |
| /// specified file emitted. Typically this will involve several steps of code | |
| /// generation. This method should return true if emission of this file type | |
| /// is not supported, or false on success. | |
| virtual bool addPassesToEmitFile(PassManagerBase &, | |
| formatted_raw_ostream &, | |
| CodeGenFileType, | |
| CodeGenOpt::Level, | |
| bool = true) { | |
| return true; | |
| } | |
| /// addPassesToEmitMachineCode - Add passes to the specified pass manager to | |
| /// get machine code emitted. This uses a JITCodeEmitter object to handle | |
| /// actually outputting the machine code and resolving things like the address | |
| /// of functions. This method returns true if machine code emission is | |
| /// not supported. | |
| /// | |
| virtual bool addPassesToEmitMachineCode(PassManagerBase &, | |
| JITCodeEmitter &, | |
| CodeGenOpt::Level, | |
| bool = true) { | |
| return true; | |
| } | |
| /// addPassesToEmitMC - Add passes to the specified pass manager to get | |
| /// machine code emitted with the MCJIT. This method returns true if machine | |
| /// code is not supported. It fills the MCContext Ctx pointer which can be | |
| /// used to build custom MCStreamer. | |
| /// | |
| virtual bool addPassesToEmitMC(PassManagerBase &, | |
| MCContext *&, | |
| raw_ostream &, | |
| CodeGenOpt::Level, | |
| bool = true) { | |
| return true; | |
| } | |
| }; | |
| /// LLVMTargetMachine - This class describes a target machine that is | |
| /// implemented with the LLVM target-independent code generator. | |
| /// | |
| class LLVMTargetMachine : public TargetMachine { | |
| protected: // Can only create subclasses. | |
| LLVMTargetMachine(const Target &T, StringRef TargetTriple, | |
| StringRef CPU, StringRef FS, | |
| Reloc::Model RM, CodeModel::Model CM); | |
| private: | |
| /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for | |
| /// both emitting to assembly files or machine code output. | |
| /// | |
| bool addCommonCodeGenPasses(PassManagerBase &, CodeGenOpt::Level, | |
| bool DisableVerify, MCContext *&OutCtx); | |
| public: | |
| /// addPassesToEmitFile - Add passes to the specified pass manager to get the | |
| /// specified file emitted. Typically this will involve several steps of code | |
| /// generation. If OptLevel is None, the code generator should emit code as | |
| /// fast as possible, though the generated code may be less efficient. | |
| virtual bool addPassesToEmitFile(PassManagerBase &PM, | |
| formatted_raw_ostream &Out, | |
| CodeGenFileType FileType, | |
| CodeGenOpt::Level, | |
| bool DisableVerify = true); | |
| /// addPassesToEmitMachineCode - Add passes to the specified pass manager to | |
| /// get machine code emitted. This uses a JITCodeEmitter object to handle | |
| /// actually outputting the machine code and resolving things like the address | |
| /// of functions. This method returns true if machine code emission is | |
| /// not supported. | |
| /// | |
| virtual bool addPassesToEmitMachineCode(PassManagerBase &PM, | |
| JITCodeEmitter &MCE, | |
| CodeGenOpt::Level, | |
| bool DisableVerify = true); | |
| /// addPassesToEmitMC - Add passes to the specified pass manager to get | |
| /// machine code emitted with the MCJIT. This method returns true if machine | |
| /// code is not supported. It fills the MCContext Ctx pointer which can be | |
| /// used to build custom MCStreamer. | |
| /// | |
| virtual bool addPassesToEmitMC(PassManagerBase &PM, | |
| MCContext *&Ctx, | |
| raw_ostream &OS, | |
| CodeGenOpt::Level OptLevel, | |
| bool DisableVerify = true); | |
| /// Target-Independent Code Generator Pass Configuration Options. | |
| /// addPreISelPasses - This method should add any "last minute" LLVM->LLVM | |
| /// passes (which are run just before instruction selector). | |
| virtual bool addPreISel(PassManagerBase &, CodeGenOpt::Level) { | |
| return true; | |
| } | |
| /// addInstSelector - This method should install an instruction selector pass, | |
| /// which converts from LLVM code to machine instructions. | |
| virtual bool addInstSelector(PassManagerBase &, CodeGenOpt::Level) { | |
| return true; | |
| } | |
| /// addPreRegAlloc - This method may be implemented by targets that want to | |
| /// run passes immediately before register allocation. This should return | |
| /// true if -print-machineinstrs should print after these passes. | |
| virtual bool addPreRegAlloc(PassManagerBase &, CodeGenOpt::Level) { | |
| return false; | |
| } | |
| /// addPostRegAlloc - This method may be implemented by targets that want | |
| /// to run passes after register allocation but before prolog-epilog | |
| /// insertion. This should return true if -print-machineinstrs should print | |
| /// after these passes. | |
| virtual bool addPostRegAlloc(PassManagerBase &, CodeGenOpt::Level) { | |
| return false; | |
| } | |
| /// addPreSched2 - This method may be implemented by targets that want to | |
| /// run passes after prolog-epilog insertion and before the second instruction | |
| /// scheduling pass. This should return true if -print-machineinstrs should | |
| /// print after these passes. | |
| virtual bool addPreSched2(PassManagerBase &, CodeGenOpt::Level) { | |
| return false; | |
| } | |
| /// addPreEmitPass - This pass may be implemented by targets that want to run | |
| /// passes immediately before machine code is emitted. This should return | |
| /// true if -print-machineinstrs should print out the code after the passes. | |
| virtual bool addPreEmitPass(PassManagerBase &, CodeGenOpt::Level) { | |
| return false; | |
| } | |
| /// addCodeEmitter - This pass should be overridden by the target to add a | |
| /// code emitter, if supported. If this is not supported, 'true' should be | |
| /// returned. | |
| virtual bool addCodeEmitter(PassManagerBase &, CodeGenOpt::Level, | |
| JITCodeEmitter &) { | |
| return true; | |
| } | |
| /// getEnableTailMergeDefault - the default setting for -enable-tail-merge | |
| /// on this target. User flag overrides. | |
| virtual bool getEnableTailMergeDefault() const { return true; } | |
| }; | |
| } // End llvm namespace | |
| #endif |