TargetMachine.h revision 8844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0
1282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman//===-- llvm/Target/TargetMachine.h - General Target Information -*- C++ -*-==// 2a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 3a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// This file describes the general parts of a Target machine. 4a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 5a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//===----------------------------------------------------------------------===// 6a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 7a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#ifndef LLVM_TARGET_TARGETMACHINE_H 8a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#define LLVM_TARGET_TARGETMACHINE_H 9a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 10a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#include "llvm/Target/TargetData.h" 11cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include "Support/NonCopyable.h" 12a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 132584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 142584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrDescriptor; 15d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattnerclass TargetSchedInfo; 16d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattnerclass TargetRegInfo; 175b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo; 18f27eeea54fb0176986f76731c499176345047dffChris Lattnerclass TargetCacheInfo; 19f27eeea54fb0176986f76731c499176345047dffChris Lattnerclass TargetOptInfo; 209f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattnerclass MachineCodeEmitter; 21478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattnerclass MRegisterInfo; 228844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaekeclass FunctionPassManager; 23b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager; 24ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass; 25a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 265b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===// 275b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 285b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for 295b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine. All target-specific information should be accessible 305b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface. 315b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 3217035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine { 33c56406c236478f718a2257c2b660561ebc855f16Chris Lattner const std::string Name; 3417035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner const TargetData DataLayout; // Calculates type size & alignment 35a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 3617035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner TargetMachine(const TargetMachine&); // DO NOT IMPLEMENT 3717035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner void operator=(const TargetMachine&); // DO NOT IMPLEMENT 38a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveprotected: 39c56406c236478f718a2257c2b660561ebc855f16Chris Lattner TargetMachine(const std::string &name, // Can only create subclasses... 40434c86dd3f03dff344793e9faf1a66d164bf21b6Chris Lattner bool LittleEndian = false, 41a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char PtrSize = 8, unsigned char PtrAl = 8, 42a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char DoubleAl = 8, unsigned char FloatAl = 4, 43a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char LongAl = 8, unsigned char IntAl = 4, 44a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char ShortAl = 2, unsigned char ByteAl = 1) 4510daaa141661d96843f3d8ece0e5a4c2da4b6e87Chris Lattner : Name(name), DataLayout(name, LittleEndian, 46434c86dd3f03dff344793e9faf1a66d164bf21b6Chris Lattner PtrSize, PtrAl, DoubleAl, FloatAl, LongAl, 47c56406c236478f718a2257c2b660561ebc855f16Chris Lattner IntAl, ShortAl, ByteAl) {} 48a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 49a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual ~TargetMachine() {} 506334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 51c56406c236478f718a2257c2b660561ebc855f16Chris Lattner const std::string &getName() const { return Name; } 52c56406c236478f718a2257c2b660561ebc855f16Chris Lattner 53a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 54a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Instruction opcode and operand information 55a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Pipelines and scheduling information 56a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Register information 57d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Stack frame information 58d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Cache hierarchy information 59d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Machine-level optimization information (peephole only) 60a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 612584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattner virtual const TargetInstrInfo& getInstrInfo() const = 0; 62d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattner virtual const TargetSchedInfo& getSchedInfo() const = 0; 63d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattner virtual const TargetRegInfo& getRegInfo() const = 0; 645b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner virtual const TargetFrameInfo& getFrameInfo() const = 0; 65f27eeea54fb0176986f76731c499176345047dffChris Lattner virtual const TargetCacheInfo& getCacheInfo() const = 0; 66f27eeea54fb0176986f76731c499176345047dffChris Lattner virtual const TargetOptInfo& getOptInfo() const = 0; 6708053e46be0c7f2024b3df7bfad822f71ac94de3Chris Lattner const TargetData &getTargetData() const { return DataLayout; } 68d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve 69478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// getRegisterInfo - If register information is available, return it. If 705b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 715b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// details of graph coloring register allocation removed from it. 72478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// 73478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner virtual const MRegisterInfo* getRegisterInfo() const { return 0; } 74478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 75a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Data storage information 76a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 77c56406c236478f718a2257c2b660561ebc855f16Chris Lattner virtual unsigned findOptimalStorageSize(const Type* ty) const; 78a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 799f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// addPassesToJITCompile - Add passes to the specified pass manager to 809f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// implement a fast dynamic compiler for this target. Return true if this is 819f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// not supported for this target. 829f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// 838844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke virtual bool addPassesToJITCompile(FunctionPassManager &PM) { return true; } 849f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner 85ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner /// addPassesToEmitAssembly - Add passes to the specified pass manager to get 869f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// assembly langage code emitted. Typically this will involve several steps 879f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// of code generation. This method should return true if assembly emission 889f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// is not supported. 89ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner /// 906334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) { 916334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner return true; 926334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner } 93ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adve 949f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 958844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke /// get machine code emitted. This uses a MachineCodeEmitter object to handle 969f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// actually outputting the machine code and resolving things like the address 979f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// of functions. This method should returns true if machine code emission is 98b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner /// not supported. 995c1b5244b956a28667bc2a9e7a84fa39697ba715Chris Lattner /// 1008844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM, 101b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner MachineCodeEmitter &MCE) { 1029f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner return true; 1039f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner } 104a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 105a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 106a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 107