TargetMachine.h revision d24479730a8790d82c4859dc477bc2416d7a6bda
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===// 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// The LLVM Compiler Infrastructure 483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius// 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file is distributed under the University of Illinois Open Source 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// License. See LICENSE.TXT for details. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===// 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file defines the TargetMachine and LLVMTargetMachine classes. 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===// 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef LLVM_TARGET_TARGETMACHINE_H 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LLVM_TARGET_TARGETMACHINE_H 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "llvm/Target/TargetInstrItineraries.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <cassert> 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace llvm { 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetAsmInfo; 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetData; 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetSubtarget; 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetInstrInfo; 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetIntrinsicInfo; 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetJITInfo; 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetLowering; 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass TargetFrameInfo; 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MachineCodeEmitter; 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetRegisterInfo; 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Module; 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass PassManagerBase; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass PassManager; 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Pass; 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetMachOWriterInfo; 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetELFWriterInfo; 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass raw_ostream; 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Relocation model types. 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace Reloc { 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum Model { 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Default, 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Static, 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru PIC_, // Cannot be named PIC due to collision with -DPIC 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DynamicNoPIC 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Code model types. 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace CodeModel { 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum Model { 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Default, 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Small, 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Kernel, 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Medium, 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Large 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace FileModel { 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum Model { 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Error, 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru None, 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AsmFile, 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MachOFile, 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ElfFile 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===// 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// TargetMachine - Primary interface to the complete machine description for 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// the target machine. All target-specific information should be accessible 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// through this interface. 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetMachine { 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TargetMachine(const TargetMachine &); // DO NOT IMPLEMENT 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void operator=(const TargetMachine &); // DO NOT IMPLEMENT 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: // Can only create subclasses. 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TargetMachine() : AsmInfo(0) { } 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getSubtargetImpl - virtual method implemented by subclasses that returns 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// a reference to that target's TargetSubtarget-derived member variable. 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetSubtarget *getSubtargetImpl() const { return 0; } 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// AsmInfo - Contains target specific asm information. 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mutable const TargetAsmInfo *AsmInfo; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// createTargetAsmInfo - Create a new instance of target specific asm 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// information. 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetAsmInfo *createTargetAsmInfo() const { return 0; } 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~TargetMachine(); 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getModuleMatchQuality - This static method should be implemented by 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// targets to indicate how closely they match the specified module. This is 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// used by the LLC tool to determine which target to use when an explicit 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// -march option is not specified. If a target returns zero, it will never 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// be chosen without an explicit -march option. 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static unsigned getModuleMatchQuality(const Module &) { return 0; } 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getJITMatchQuality - This static method should be implemented by targets 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// that provide JIT capabilities to indicate how suitable they are for 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// execution on the current host. If a value of 0 is returned, the target 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// will not be used unless an explicit -march option is used. 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static unsigned getJITMatchQuality() { return 0; } 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Interfaces to the major aspects of target machine information: 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // -- Instruction opcode and operand information 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // -- Pipelines and scheduling information 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // -- Stack frame information 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // -- Selection DAG lowering information 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetInstrInfo *getInstrInfo() const { return 0; } 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetFrameInfo *getFrameInfo() const { return 0; } 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual TargetLowering *getTargetLowering() const { return 0; } 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetData *getTargetData() const { return 0; } 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getTargetAsmInfo - Return target specific asm information. 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const TargetAsmInfo *getTargetAsmInfo() const { 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!AsmInfo) AsmInfo = createTargetAsmInfo(); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return AsmInfo; 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getSubtarget - This method returns a pointer to the specified type of 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// TargetSubtarget. In debug builds, it verifies that the object being 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// returned is of the correct type. 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru template<typename STC> const STC &getSubtarget() const { 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const TargetSubtarget *TST = getSubtargetImpl(); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(TST && dynamic_cast<const STC*>(TST) && 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Not the right kind of subtarget!"); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *static_cast<const STC*>(TST); 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getRegisterInfo - If register information is available, return it. If 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// not, return null. This is kept separate from RegInfo until RegInfo has 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// details of graph coloring register allocation removed from it. 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; } 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getIntrinsicInfo - If intrinsic information is available, return it. If 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// not, return null. 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; } 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getJITInfo - If this target supports a JIT, return information for it, 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// otherwise return null. 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual TargetJITInfo *getJITInfo() { return 0; } 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getInstrItineraryData - Returns instruction itinerary data for the target 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// or specific subtarget. 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const InstrItineraryData getInstrItineraryData() const { 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InstrItineraryData(); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getMachOWriterInfo - If this target supports a Mach-O writer, return 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// information for it, otherwise return null. 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetMachOWriterInfo *getMachOWriterInfo() const { return 0; } 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getELFWriterInfo - If this target supports an ELF writer, return 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// information for it, otherwise return null. 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; } 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getRelocationModel - Returns the code generation relocation model. The 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// choices are static, PIC, and dynamic-no-pic, and target default. 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static Reloc::Model getRelocationModel(); 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// setRelocationModel - Sets the code generation relocation model. 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static void setRelocationModel(Reloc::Model Model); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getCodeModel - Returns the code model. The choices are small, kernel, 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// medium, large, and target default. 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static CodeModel::Model getCodeModel(); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// setCodeModel - Sets the code model. 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static void setCodeModel(CodeModel::Model Model); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// CodeGenFileType - These enums are meant to be passed into 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitFile to indicate what type of file to emit. 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum CodeGenFileType { 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AssemblyFile, ObjectFile, DynamicLibrary 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// on this target. User flag overrides. 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool getEnableTailMergeDefault() const { return true; } 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitFile - Add passes to the specified pass manager to get the 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// specified file emitted. Typically this will involve several steps of code 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// generation. If Fast is set to true, the code generator should emit code 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// as fast as possible, though the generated code may be less efficient. 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// This method should return FileModel::Error if emission of this file type 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// is not supported. 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual FileModel::Model addPassesToEmitFile(PassManagerBase &, 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru raw_ostream &, 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CodeGenFileType, 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool /*Fast*/) { 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FileModel::None; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitFileFinish - If the passes to emit the specified file had 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// to be split up (e.g., to add an object writer pass), this method can be 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// used to finish up adding passes to emit the file, if necessary. 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPassesToEmitFileFinish(PassManagerBase &, 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MachineCodeEmitter *, bool /*Fast*/) { 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// get machine code emitted. This uses a MachineCodeEmitter object to handle 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// actually outputting the machine code and resolving things like the address 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// of functions. This method returns true if machine code emission is 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// not supported. 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPassesToEmitMachineCode(PassManagerBase &, 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MachineCodeEmitter &, 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool /*Fast*/) { 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitWholeFile - This method can be implemented by targets that 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// require having the entire module at once. This is not recommended, do not 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// use this. 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool WantsWholeFile() const { return false; } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPassesToEmitWholeFile(PassManager &, raw_ostream &, 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CodeGenFileType, bool /*Fast*/) { 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// LLVMTargetMachine - This class describes a target machine that is 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// implemented with the LLVM target-independent code generator. 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LLVMTargetMachine : public TargetMachine { 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: // Can only create subclasses. 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLVMTargetMachine() { } 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// both emitting to assembly files or machine code output. 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool addCommonCodeGenPasses(PassManagerBase &, bool /*Fast*/); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitFile - Add passes to the specified pass manager to get the 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// specified file emitted. Typically this will involve several steps of code 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// generation. If Fast is set to true, the code generator should emit code 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// as fast as possible, though the generated code may be less efficient. 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// This method should return FileModel::Error if emission of this file type 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// is not supported. 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// The default implementation of this method adds components from the 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// LLVM retargetable code generator, invoking the methods below to get 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// target-specific passes in standard locations. 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual FileModel::Model addPassesToEmitFile(PassManagerBase &PM, 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru raw_ostream &Out, 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CodeGenFileType FileType, 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool Fast); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitFileFinish - If the passes to emit the specified file had 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// to be split up (e.g., to add an object writer pass), this method can be 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// used to finish up adding passes to emit the file, if necessary. 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPassesToEmitFileFinish(PassManagerBase &PM, 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MachineCodeEmitter *MCE, bool Fast); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// get machine code emitted. This uses a MachineCodeEmitter object to handle 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// actually outputting the machine code and resolving things like the address 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// of functions. This method returns true if machine code emission is 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// not supported. 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPassesToEmitMachineCode(PassManagerBase &PM, 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MachineCodeEmitter &MCE, bool Fast); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// Target-Independent Code Generator Pass Configuration Options. 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addInstSelector - This method should add any "last minute" LLVM->LLVM 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// passes, then install an instruction selector pass, which converts from 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// LLVM code to machine instructions. 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addInstSelector(PassManagerBase &, bool /*Fast*/) { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPreRegAllocPasses - This method may be implemented by targets that want 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// to run passes immediately before register allocation. This should return 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// true if -print-machineinstrs should print after these passes. 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPreRegAlloc(PassManagerBase &, bool /*Fast*/) { 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPostRegAllocPasses - This method may be implemented by targets that 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// want to run passes after register allocation but before prolog-epilog 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// insertion. This should return true if -print-machineinstrs should print 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// after these passes. 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPostRegAlloc(PassManagerBase &, bool /*Fast*/) { 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addPreEmitPass - This pass may be implemented by targets that want to run 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// passes immediately before machine code is emitted. This should return 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// true if -print-machineinstrs should print out the code after the passes. 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addPreEmitPass(PassManagerBase &, bool /*Fast*/) { 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addAssemblyEmitter - This pass should be overridden by the target to add 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the asmprinter, if asm emission is supported. If this is not supported, 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 'true' should be returned. 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addAssemblyEmitter(PassManagerBase &, bool /*Fast*/, 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru raw_ostream &) { 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addCodeEmitter - This pass should be overridden by the target to add a 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// code emitter, if supported. If this is not supported, 'true' should be 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// returned. If DumpAsm is true, the generated assembly is printed to cerr. 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addCodeEmitter(PassManagerBase &, bool /*Fast*/, 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool /*DumpAsm*/, MachineCodeEmitter &) { 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// addSimpleCodeEmitter - This pass should be overridden by the target to add 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// a code emitter (without setting flags), if supported. If this is not 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// supported, 'true' should be returned. If DumpAsm is true, the generated 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// assembly is printed to cerr. 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool addSimpleCodeEmitter(PassManagerBase &, bool /*Fast*/, 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool /*DumpAsm*/, MachineCodeEmitter &) { 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// on this target. User flag overrides. 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual bool getEnableTailMergeDefault() const { return true; } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} // End llvm namespace 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru