TargetMachine.h revision 8844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/Target/TargetMachine.h - General Target Information -*- C++ -*-==// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file describes the general parts of a Target machine. 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman#ifndef LLVM_TARGET_TARGETMACHINE_H 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell#define LLVM_TARGET_TARGETMACHINE_H 9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "llvm/Target/TargetData.h" 11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "Support/NonCopyable.h" 12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetInstrInfo; 14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetInstrDescriptor; 15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetSchedInfo; 16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetRegInfo; 17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetFrameInfo; 18c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerclass TargetCacheInfo; 19b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattnerclass TargetOptInfo; 20b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattnerclass MachineCodeEmitter; 21cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass MRegisterInfo; 22109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattnerclass FunctionPassManager; 23eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattnerclass PassManager; 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeclass Pass; 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 26c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===----------------------------------------------------------------------===// 27c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// 28b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// TargetMachine - Primary interface to the complete machine description for 29c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// the target machine. All target-specific information should be accessible 30c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// through this interface. 31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// 32c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerclass TargetMachine { 33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner const std::string Name; 34c3aae25116e66c177579b0b79182b09340b19753Chris Lattner const TargetData DataLayout; // Calculates type size & alignment 35c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner TargetMachine(const TargetMachine&); // DO NOT IMPLEMENT 37c3aae25116e66c177579b0b79182b09340b19753Chris Lattner void operator=(const TargetMachine&); // DO NOT IMPLEMENT 38c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerprotected: 39c3aae25116e66c177579b0b79182b09340b19753Chris Lattner TargetMachine(const std::string &name, // Can only create subclasses... 40c3aae25116e66c177579b0b79182b09340b19753Chris Lattner bool LittleEndian = false, 41cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner unsigned char PtrSize = 8, unsigned char PtrAl = 8, 42cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner unsigned char DoubleAl = 8, unsigned char FloatAl = 4, 43063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner unsigned char LongAl = 8, unsigned char IntAl = 4, 44c3aae25116e66c177579b0b79182b09340b19753Chris Lattner unsigned char ShortAl = 2, unsigned char ByteAl = 1) 45b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey : Name(name), DataLayout(name, LittleEndian, 46cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner PtrSize, PtrAl, DoubleAl, FloatAl, LongAl, 47c3aae25116e66c177579b0b79182b09340b19753Chris Lattner IntAl, ShortAl, ByteAl) {} 48c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerpublic: 49cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner virtual ~TargetMachine() {} 50b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner 51b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner const std::string &getName() const { return Name; } 52691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth 53691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth // Interfaces to the major aspects of target machine information: 54691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth // -- Instruction opcode and operand information 55691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth // -- Pipelines and scheduling information 56cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner // -- Register information 57b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey // -- Stack frame information 58b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey // -- Cache hierarchy information 59c3aae25116e66c177579b0b79182b09340b19753Chris Lattner // -- Machine-level optimization information (peephole only) 60c3aae25116e66c177579b0b79182b09340b19753Chris Lattner // 61cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner virtual const TargetInstrInfo& getInstrInfo() const = 0; 62cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner virtual const TargetSchedInfo& getSchedInfo() const = 0; 63c3aae25116e66c177579b0b79182b09340b19753Chris Lattner virtual const TargetRegInfo& getRegInfo() const = 0; 64063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner virtual const TargetFrameInfo& getFrameInfo() const = 0; 65063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner virtual const TargetCacheInfo& getCacheInfo() const = 0; 66b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey virtual const TargetOptInfo& getOptInfo() const = 0; 67cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner const TargetData &getTargetData() const { return DataLayout; } 681080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 691080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner /// getRegisterInfo - If register information is available, return it. If 701080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 711080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner /// details of graph coloring register allocation removed from it. 721080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner /// 73b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner virtual const MRegisterInfo* getRegisterInfo() const { return 0; } 74b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner 75b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner // Data storage information 76b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner // 77b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner virtual unsigned findOptimalStorageSize(const Type* ty) const; 78b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner 79b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner /// addPassesToJITCompile - Add passes to the specified pass manager to 80c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// implement a fast dynamic compiler for this target. Return true if this is 81cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// not supported for this target. 82c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// 83cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner virtual bool addPassesToJITCompile(FunctionPassManager &PM) { return true; } 84c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 85c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// addPassesToEmitAssembly - Add passes to the specified pass manager to get 86c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// assembly langage code emitted. Typically this will involve several steps 87cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// of code generation. This method should return true if assembly emission 88c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// is not supported. 89cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 90c3aae25116e66c177579b0b79182b09340b19753Chris Lattner virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) { 91cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner return true; 921d4d41411190dd9e62764e56713753d4155764ddNate Begeman } 931d4d41411190dd9e62764e56713753d4155764ddNate Begeman 941d4d41411190dd9e62764e56713753d4155764ddNate Begeman /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 951d4d41411190dd9e62764e56713753d4155764ddNate Begeman /// get machine code emitted. This uses a MachineCodeEmitter object to handle 961d4d41411190dd9e62764e56713753d4155764ddNate Begeman /// actually outputting the machine code and resolving things like the address 971d4d41411190dd9e62764e56713753d4155764ddNate Begeman /// of functions. This method should returns true if machine code emission is 98c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// not supported. 99c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// 100c3aae25116e66c177579b0b79182b09340b19753Chris Lattner virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM, 101cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner MachineCodeEmitter &MCE) { 102c3aae25116e66c177579b0b79182b09340b19753Chris Lattner return true; 103c3aae25116e66c177579b0b79182b09340b19753Chris Lattner } 104063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner}; 105c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 106d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner#endif 107d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner