TargetMachine.h revision 36c2a0593509da714bea6457dd1b00a7417ce342
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===// 26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 10a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// This file describes the general parts of a Target machine. 11a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 12a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//===----------------------------------------------------------------------===// 13a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 14a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#ifndef LLVM_TARGET_TARGETMACHINE_H 15a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#define LLVM_TARGET_TARGETMACHINE_H 16a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 17a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#include "llvm/Target/TargetData.h" 18a42649e3dd4c8be2d45451429a41f2b13dbeeb78Brian Gaeke#include <cassert> 19a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 222584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 232584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrDescriptor; 241e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo; 25d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattnerclass TargetSchedInfo; 26d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattnerclass TargetRegInfo; 275b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo; 289f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattnerclass MachineCodeEmitter; 29478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattnerclass MRegisterInfo; 308844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaekeclass FunctionPassManager; 31b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager; 32ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass; 33f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattnerclass IntrinsicLowering; 34a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 355b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===// 365b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 375b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for 385b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine. All target-specific information should be accessible 395b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface. 405b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 4117035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine { 42c56406c236478f718a2257c2b660561ebc855f16Chris Lattner const std::string Name; 43f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner const TargetData DataLayout; // Calculates type size & alignment 44f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner IntrinsicLowering *IL; // Specifies how to lower intrinsic calls 45a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 4617035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner TargetMachine(const TargetMachine&); // DO NOT IMPLEMENT 4717035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner void operator=(const TargetMachine&); // DO NOT IMPLEMENT 48f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattnerprotected: // Can only create subclasses... 49f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner TargetMachine(const std::string &name, IntrinsicLowering *IL, 50434c86dd3f03dff344793e9faf1a66d164bf21b6Chris Lattner bool LittleEndian = false, 51a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char PtrSize = 8, unsigned char PtrAl = 8, 52a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char DoubleAl = 8, unsigned char FloatAl = 4, 53a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned char LongAl = 8, unsigned char IntAl = 4, 54f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner unsigned char ShortAl = 2, unsigned char ByteAl = 1); 552bed9ecc4b5d74e61c997eb2d3877e0ab6257979Chris Lattner 562bed9ecc4b5d74e61c997eb2d3877e0ab6257979Chris Lattner // This constructor is used for targets that support arbitrary TargetData 572bed9ecc4b5d74e61c997eb2d3877e0ab6257979Chris Lattner // layouts, like the C backend. It initializes the TargetData to match that 582bed9ecc4b5d74e61c997eb2d3877e0ab6257979Chris Lattner // of the specified module. 592bed9ecc4b5d74e61c997eb2d3877e0ab6257979Chris Lattner TargetMachine(const std::string &name, IntrinsicLowering *IL, 602bed9ecc4b5d74e61c997eb2d3877e0ab6257979Chris Lattner const Module &M); 61a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 62f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner virtual ~TargetMachine(); 636334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 64c56406c236478f718a2257c2b660561ebc855f16Chris Lattner const std::string &getName() const { return Name; } 65f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner 66f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner // getIntrinsicLowering - This method returns a reference to an 67f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner // IntrinsicLowering instance which should be used by the code generator to 68f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner // lower unknown intrinsic functions to the equivalent LLVM expansion. 69f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner IntrinsicLowering &getIntrinsicLowering() const { return *IL; } 70c56406c236478f718a2257c2b660561ebc855f16Chris Lattner 71a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 72a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Instruction opcode and operand information 73a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Pipelines and scheduling information 74d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Stack frame information 75a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 7636c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetInstrInfo *getInstrInfo() const { return 0; } 7736c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetFrameInfo *getFrameInfo() const { return 0; } 7808053e46be0c7f2024b3df7bfad822f71ac94de3Chris Lattner const TargetData &getTargetData() const { return DataLayout; } 79d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve 80478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// getRegisterInfo - If register information is available, return it. If 815b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 825b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// details of graph coloring register allocation removed from it. 83478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// 84478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner virtual const MRegisterInfo* getRegisterInfo() const { return 0; } 85478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 861e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// getJITInfo - If this target supports a JIT, return information for it, 871e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// otherwise return null. 881e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// 891e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner virtual TargetJITInfo *getJITInfo() { return 0; } 901e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner 9136c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner // These are deprecated interfaces. 9236c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetSchedInfo *getSchedInfo() const { return 0; } 9336c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetRegInfo *getRegInfo() const { return 0; } 9436c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner 95ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner /// addPassesToEmitAssembly - Add passes to the specified pass manager to get 969f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// assembly langage code emitted. Typically this will involve several steps 979f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// of code generation. This method should return true if assembly emission 989f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// is not supported. 99ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner /// 1006334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) { 1016334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner return true; 1026334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner } 103ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adve 1049f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 1058844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke /// get machine code emitted. This uses a MachineCodeEmitter object to handle 1069f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// actually outputting the machine code and resolving things like the address 1079f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// of functions. This method should returns true if machine code emission is 108b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner /// not supported. 1095c1b5244b956a28667bc2a9e7a84fa39697ba715Chris Lattner /// 1108844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM, 111b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner MachineCodeEmitter &MCE) { 1129f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner return true; 1139f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner } 114a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 115a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 116d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 117d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 118a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 119