TargetMachine.h revision 8772f5041ce8e98695655a72a54b952583630617
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===// 234695381d626485a560594f162701088079589dfMisha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 734695381d626485a560594f162701088079589dfMisha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 101911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner// This file defines the TargetMachine and LLVMTargetMachine classes. 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 176cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey#include "llvm/Target/TargetInstrItineraries.h" 18a42649e3dd4c8be2d45451429a41f2b13dbeeb78Brian Gaeke#include <cassert> 190a31d2f6456069adba19b8aeca66c68b633c38b4Chris Lattner#include <string> 20a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbarclass Target; 24af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo; 2507000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass TargetData; 26fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass TargetSubtarget; 272584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 2849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo; 291e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo; 30a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering; 315b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo; 32a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopesclass JITCodeEmitter; 336f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo; 34bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanclass PassManagerBase; 35b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager; 36ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass; 3798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendlingclass TargetELFWriterInfo; 3871847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_raw_ostream; 39a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 404c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng// Relocation model types. 414c1aa866578f7a358407a22fe55b454f52a24325Evan Chengnamespace Reloc { 424c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng enum Model { 434c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng Default, 444c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng Static, 4535d86fef1f1fc5845366c7c36803a6a3334d8a2eChris Lattner PIC_, // Cannot be named PIC due to collision with -DPIC 464c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng DynamicNoPIC 474c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng }; 484c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng} 494c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 50152ed053533b26194362994398c0ffad7e1c4109Evan Cheng// Code model types. 51152ed053533b26194362994398c0ffad7e1c4109Evan Chengnamespace CodeModel { 52152ed053533b26194362994398c0ffad7e1c4109Evan Cheng enum Model { 53152ed053533b26194362994398c0ffad7e1c4109Evan Cheng Default, 54152ed053533b26194362994398c0ffad7e1c4109Evan Cheng Small, 55152ed053533b26194362994398c0ffad7e1c4109Evan Cheng Kernel, 56152ed053533b26194362994398c0ffad7e1c4109Evan Cheng Medium, 57152ed053533b26194362994398c0ffad7e1c4109Evan Cheng Large 58152ed053533b26194362994398c0ffad7e1c4109Evan Cheng }; 59152ed053533b26194362994398c0ffad7e1c4109Evan Cheng} 60152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 6198a366d547772010e94609e4584489b3e5ce0043Bill Wendling// Code generation optimization level. 6298a366d547772010e94609e4584489b3e5ce0043Bill Wendlingnamespace CodeGenOpt { 6398a366d547772010e94609e4584489b3e5ce0043Bill Wendling enum Level { 64bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng None, // -O0 65bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng Less, // -O1 66bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng Default, // -O2, -Os 67bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng Aggressive // -O3 6898a366d547772010e94609e4584489b3e5ce0043Bill Wendling }; 6998a366d547772010e94609e4584489b3e5ce0043Bill Wendling} 7098a366d547772010e94609e4584489b3e5ce0043Bill Wendling 715b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===// 725b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 735b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for 745b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine. All target-specific information should be accessible 755b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface. 7634695381d626485a560594f162701088079589dfMisha Brukman/// 7717035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine { 781911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner TargetMachine(const TargetMachine &); // DO NOT IMPLEMENT 791911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner void operator=(const TargetMachine &); // DO NOT IMPLEMENT 8007ac914973ebb484dd7ed1ad143934e14ad56e26Chris Lattnerprotected: // Can only create subclasses. 8151b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar TargetMachine(const Target &); 828d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman 838d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// getSubtargetImpl - virtual method implemented by subclasses that returns 848d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// a reference to that target's TargetSubtarget-derived member variable. 858d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman virtual const TargetSubtarget *getSubtargetImpl() const { return 0; } 8651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar 8751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// TheTarget - The Target that this machine was created for. 8851b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &TheTarget; 89a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey 90a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// AsmInfo - Contains target specific asm information. 91a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 92af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *AsmInfo; 93e911615c4769d793588087b5321d303ecb9661c7Bill Wendling 94a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 95f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner virtual ~TargetMachine(); 966334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 9751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &getTarget() const { return TheTarget; } 9803f4bc5d6cf777c8aa559c299ef7f85126872881Daniel Dunbar 99a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 100a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Instruction opcode and operand information 101a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Pipelines and scheduling information 102d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Stack frame information 103a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng // -- Selection DAG lowering information 10434695381d626485a560594f162701088079589dfMisha Brukman // 10536c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetInstrInfo *getInstrInfo() const { return 0; } 10636c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetFrameInfo *getFrameInfo() const { return 0; } 107a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng virtual TargetLowering *getTargetLowering() const { return 0; } 108a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson virtual const TargetData *getTargetData() const { return 0; } 109a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey 110af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// getMCAsmInfo - Return target specific asm information. 111a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 112af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; } 113a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey 1149eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// getSubtarget - This method returns a pointer to the specified type of 1158d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// TargetSubtarget. In debug builds, it verifies that the object being 1168d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// returned is of the correct type. 1175ab83632066071413841af43bc5d1edcced18076Chris Lattner template<typename STC> const STC &getSubtarget() const { 1181548b863ce316c0b3be81d50d6388147df9aba72Chris Lattner return *static_cast<const STC*>(getSubtargetImpl()); 119fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman } 120fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 121478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// getRegisterInfo - If register information is available, return it. If 1225b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 1235b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// details of graph coloring register allocation removed from it. 124478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// 1256f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; } 12649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen 12749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// getIntrinsicInfo - If intrinsic information is available, return it. If 12849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// not, return null. 12949de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// 13049de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; } 131478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 1321e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// getJITInfo - If this target supports a JIT, return information for it, 1331e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// otherwise return null. 1341e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// 1351e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner virtual TargetJITInfo *getJITInfo() { return 0; } 1366cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey 1376cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// getInstrItineraryData - Returns instruction itinerary data for the target 1386cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// or specific subtarget. 1396cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// 1406cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey virtual const InstrItineraryData getInstrItineraryData() const { 1416cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey return InstrItineraryData(); 1426cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey } 1431e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner 14498b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// getELFWriterInfo - If this target supports an ELF writer, return 14598b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// information for it, otherwise return null. 14698b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// 14798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; } 14898b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling 1494c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// getRelocationModel - Returns the code generation relocation model. The 1504c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// choices are static, PIC, and dynamic-no-pic, and target default. 1514c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng static Reloc::Model getRelocationModel(); 1524c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 1534c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// setRelocationModel - Sets the code generation relocation model. 15442bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 1554c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng static void setRelocationModel(Reloc::Model Model); 1564c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 157152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// getCodeModel - Returns the code model. The choices are small, kernel, 158152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// medium, large, and target default. 159152ed053533b26194362994398c0ffad7e1c4109Evan Cheng static CodeModel::Model getCodeModel(); 160152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 161152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// setCodeModel - Sets the code model. 16242bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 163152ed053533b26194362994398c0ffad7e1c4109Evan Cheng static void setCodeModel(CodeModel::Model Model); 164152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 16542bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// getAsmVerbosityDefault - Returns the default value of asm verbosity. 16642bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 16742bf74be1402df7409efbea089310d4c276fde37Evan Cheng static bool getAsmVerbosityDefault(); 16842bf74be1402df7409efbea089310d4c276fde37Evan Cheng 16942bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default 17042bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// is false. 17142bf74be1402df7409efbea089310d4c276fde37Evan Cheng static void setAsmVerbosityDefault(bool); 17242bf74be1402df7409efbea089310d4c276fde37Evan Cheng 17311f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner /// CodeGenFileType - These enums are meant to be passed into 174211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// addPassesToEmitFile to indicate what type of file to emit, and returned by 175211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// it to indicate what type of file could actually be made. 17611f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner enum CodeGenFileType { 177211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_AssemblyFile, 178211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_ObjectFile, 1795669e3009761dff20b67e18a382c334041887928Chris Lattner CGFT_Null // Do not emit any output. 18011f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner }; 18111f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner 182e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 18381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen /// on this target. User flag overrides. 18450cdabcfd52e88381ade61450d98a1c757195befDan Gohman virtual bool getEnableTailMergeDefault() const { return true; } 18581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 186d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 187d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 1885669e3009761dff20b67e18a382c334041887928Chris Lattner /// generation. This method should return true if emission of this file type 1895669e3009761dff20b67e18a382c334041887928Chris Lattner /// is not supported, or false on success. 1905669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &, 1915669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &, 19249cf3a71734b4dc6545c279fb8236bef5758b2d5Eric Christopher CodeGenFileType, 1938772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 1948772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true) { 1955669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 196d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling } 197d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 198a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 1993813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 200a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 201a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 202a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 203a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 204a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &, 205a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &, 2068772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 2078772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true) { 208a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 209a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 210a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 2111911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPassesToEmitWholeFile - This method can be implemented by targets that 2121911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// require having the entire module at once. This is not recommended, do not 2131911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// use this. 2141911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner virtual bool WantsWholeFile() const { return false; } 21571847813bc419f7a0667468136a07429c6d9f164David Greene virtual bool addPassesToEmitWholeFile(PassManager &, formatted_raw_ostream &, 216be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling CodeGenFileType, 2178772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 2188772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true) { 2191911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 2201911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 2211911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}; 2221911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2231911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is 2241911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator. 2251911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// 2261911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine { 2271911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses. 228a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner LLVMTargetMachine(const Target &T, const std::string &TargetTriple); 229a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 23002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for 23102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// both emitting to assembly files or machine code output. 23202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// 2338772f5041ce8e98695655a72a54b952583630617Dan Gohman bool addCommonCodeGenPasses(PassManagerBase &, CodeGenOpt::Level, 2348772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify); 23502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 236f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopherprivate: 237f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopher virtual void setCodeModelForJIT(); 238f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopher virtual void setCodeModelForStatic(); 239f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopher 2401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic: 2411911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 242d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 243d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 244211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// generation. If OptLevel is None, the code generator should emit code as 2455669e3009761dff20b67e18a382c334041887928Chris Lattner /// fast as possible, though the generated code may be less efficient. 2465669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &PM, 2475669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &Out, 2485669e3009761dff20b67e18a382c334041887928Chris Lattner CodeGenFileType FileType, 2498772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 2508772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true); 2511911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 252a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2533813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 254a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 255a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 256a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 257a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 258a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &PM, 259a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &MCE, 2608772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 2618772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true); 262a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 2631911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// Target-Independent Code Generator Pass Configuration Options. 2641911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2651911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addInstSelector - This method should add any "last minute" LLVM->LLVM 2661911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// passes, then install an instruction selector pass, which converts from 2671911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// LLVM code to machine instructions. 26898a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addInstSelector(PassManagerBase &, CodeGenOpt::Level) { 2691911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 2701911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 271769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 272629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// addPreRegAlloc - This method may be implemented by targets that want to 273629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// run passes immediately before register allocation. This should return 274769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov /// true if -print-machineinstrs should print after these passes. 27598a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPreRegAlloc(PassManagerBase &, CodeGenOpt::Level) { 276769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov return false; 277769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov } 278769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 279629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// addPostRegAlloc - This method may be implemented by targets that want 280629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// to run passes after register allocation but before prolog-epilog 2811911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// insertion. This should return true if -print-machineinstrs should print 2821911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// after these passes. 28398a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPostRegAlloc(PassManagerBase &, CodeGenOpt::Level) { 2841911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return false; 2851911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 286629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng 287629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// addPreSched2 - This method may be implemented by targets that want to 288629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// run passes after prolog-epilog insertion and before the second instruction 289629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// scheduling pass. This should return true if -print-machineinstrs should 290629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// print after these passes. 291629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng virtual bool addPreSched2(PassManagerBase &, CodeGenOpt::Level) { 292629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng return false; 293629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng } 2941911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2951911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPreEmitPass - This pass may be implemented by targets that want to run 2961911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// passes immediately before machine code is emitted. This should return 2971911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// true if -print-machineinstrs should print out the code after the passes. 29898a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPreEmitPass(PassManagerBase &, CodeGenOpt::Level) { 2991911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return false; 3001911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 3011911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3021911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3031911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addCodeEmitter - This pass should be overridden by the target to add a 3041911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// code emitter, if supported. If this is not supported, 'true' should be 305cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar /// returned. 30698a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addCodeEmitter(PassManagerBase &, CodeGenOpt::Level, 307cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar JITCodeEmitter &) { 308a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 309a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 310a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 311e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 31281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen /// on this target. User flag overrides. 31350cdabcfd52e88381ade61450d98a1c757195befDan Gohman virtual bool getEnableTailMergeDefault() const { return true; } 314a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 315a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 316d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 317d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 318a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 319