TargetMachine.h revision be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2b
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> 19a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 22a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskeyclass TargetAsmInfo; 2307000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass TargetData; 24fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass TargetSubtarget; 252584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 2649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo; 271e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo; 28a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering; 295b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo; 309f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattnerclass MachineCodeEmitter; 316f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo; 3207000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass Module; 33bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanclass PassManagerBase; 34b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager; 35ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass; 3698b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendlingclass TargetMachOWriterInfo; 3798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendlingclass TargetELFWriterInfo; 38cb3718832375a581c5ea23f15918f3ea447a446cOwen Andersonclass 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 61d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendlingnamespace FileModel { 62d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling enum Model { 63d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling Error, 64d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling None, 65d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling AsmFile, 66d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling MachOFile, 67d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling ElfFile 68d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling }; 69d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling} 70d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill 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. 81d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman TargetMachine() : AsmInfo(0) { } 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; } 86a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey 87a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// AsmInfo - Contains target specific asm information. 88a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 89a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey mutable const TargetAsmInfo *AsmInfo; 90e911615c4769d793588087b5321d303ecb9661c7Bill Wendling 91fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey /// createTargetAsmInfo - Create a new instance of target specific asm 92fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey /// information. 93d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman virtual const TargetAsmInfo *createTargetAsmInfo() const { return 0; } 94fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey 95a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 96f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner virtual ~TargetMachine(); 976334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 98a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// getModuleMatchQuality - This static method should be implemented by 99a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// targets to indicate how closely they match the specified module. This is 100a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// used by the LLC tool to determine which target to use when an explicit 101a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// -march option is not specified. If a target returns zero, it will never 102a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// be chosen without an explicit -march option. 10313d57320bd212483463d4f8992d5787b29eda5dfBill Wendling static unsigned getModuleMatchQuality(const Module &) { return 0; } 104a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner 105a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// getJITMatchQuality - This static method should be implemented by targets 106a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// that provide JIT capabilities to indicate how suitable they are for 107a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// execution on the current host. If a value of 0 is returned, the target 108a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner /// will not be used unless an explicit -march option is used. 109a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner static unsigned getJITMatchQuality() { return 0; } 110a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner 111a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 112a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Instruction opcode and operand information 113a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Pipelines and scheduling information 114d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Stack frame information 115a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng // -- Selection DAG lowering information 11634695381d626485a560594f162701088079589dfMisha Brukman // 11736c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetInstrInfo *getInstrInfo() const { return 0; } 11836c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner virtual const TargetFrameInfo *getFrameInfo() const { return 0; } 119a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng virtual TargetLowering *getTargetLowering() const { return 0; } 120a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson virtual const TargetData *getTargetData() const { return 0; } 121a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey 122a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// getTargetAsmInfo - Return target specific asm information. 123a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 124a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey const TargetAsmInfo *getTargetAsmInfo() const { 125a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey if (!AsmInfo) AsmInfo = createTargetAsmInfo(); 126a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey return AsmInfo; 127a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey } 128a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey 1299eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// getSubtarget - This method returns a pointer to the specified type of 1308d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// TargetSubtarget. In debug builds, it verifies that the object being 1318d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// returned is of the correct type. 1325ab83632066071413841af43bc5d1edcced18076Chris Lattner template<typename STC> const STC &getSubtarget() const { 1338d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman const TargetSubtarget *TST = getSubtargetImpl(); 1345ab83632066071413841af43bc5d1edcced18076Chris Lattner assert(TST && dynamic_cast<const STC*>(TST) && 135fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman "Not the right kind of subtarget!"); 1365ab83632066071413841af43bc5d1edcced18076Chris Lattner return *static_cast<const STC*>(TST); 137fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman } 138fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 139478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// getRegisterInfo - If register information is available, return it. If 1405b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 1415b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// details of graph coloring register allocation removed from it. 142478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// 1436f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; } 14449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen 14549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// getIntrinsicInfo - If intrinsic information is available, return it. If 14649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// not, return null. 14749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// 14849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; } 149478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 1501e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// getJITInfo - If this target supports a JIT, return information for it, 1511e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// otherwise return null. 1521e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// 1531e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner virtual TargetJITInfo *getJITInfo() { return 0; } 1546cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey 1556cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// getInstrItineraryData - Returns instruction itinerary data for the target 1566cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// or specific subtarget. 1576cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// 1586cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey virtual const InstrItineraryData getInstrItineraryData() const { 1596cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey return InstrItineraryData(); 1606cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey } 1611e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner 1628f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling /// getMachOWriterInfo - If this target supports a Mach-O writer, return 1638f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling /// information for it, otherwise return null. 1648f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling /// 1658f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling virtual const TargetMachOWriterInfo *getMachOWriterInfo() const { return 0; } 1668f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling 16798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// getELFWriterInfo - If this target supports an ELF writer, return 16898b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// information for it, otherwise return null. 16998b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// 17098b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; } 17198b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling 1724c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// getRelocationModel - Returns the code generation relocation model. The 1734c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// choices are static, PIC, and dynamic-no-pic, and target default. 1744c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng static Reloc::Model getRelocationModel(); 1754c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 1764c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// setRelocationModel - Sets the code generation relocation model. 17742bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 1784c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng static void setRelocationModel(Reloc::Model Model); 1794c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 180152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// getCodeModel - Returns the code model. The choices are small, kernel, 181152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// medium, large, and target default. 182152ed053533b26194362994398c0ffad7e1c4109Evan Cheng static CodeModel::Model getCodeModel(); 183152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 184152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// setCodeModel - Sets the code model. 18542bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 186152ed053533b26194362994398c0ffad7e1c4109Evan Cheng static void setCodeModel(CodeModel::Model Model); 187152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 18842bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// getAsmVerbosityDefault - Returns the default value of asm verbosity. 18942bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 19042bf74be1402df7409efbea089310d4c276fde37Evan Cheng static bool getAsmVerbosityDefault(); 19142bf74be1402df7409efbea089310d4c276fde37Evan Cheng 19242bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default 19342bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// is false. 19442bf74be1402df7409efbea089310d4c276fde37Evan Cheng static void setAsmVerbosityDefault(bool); 19542bf74be1402df7409efbea089310d4c276fde37Evan Cheng 19611f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner /// CodeGenFileType - These enums are meant to be passed into 19711f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner /// addPassesToEmitFile to indicate what type of file to emit. 19811f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner enum CodeGenFileType { 19933f80a87230f61b85f62cbc956b6f521b6e2063cChris Lattner AssemblyFile, ObjectFile, DynamicLibrary 20011f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner }; 20111f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner 202e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 20381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen /// on this target. User flag overrides. 20450cdabcfd52e88381ade61450d98a1c757195befDan Gohman virtual bool getEnableTailMergeDefault() const { return true; } 20581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 206d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 207d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 208d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// generation. If Fast is set to true, the code generator should emit code 20906dd2a68e12a8c278faaf9cbf76ddf6d9e2d696dDan Gohman /// as fast as possible, though the generated code may be less efficient. 21006dd2a68e12a8c278faaf9cbf76ddf6d9e2d696dDan Gohman /// This method should return FileModel::Error if emission of this file type 21106dd2a68e12a8c278faaf9cbf76ddf6d9e2d696dDan Gohman /// is not supported. 212ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner /// 21313d57320bd212483463d4f8992d5787b29eda5dfBill Wendling virtual FileModel::Model addPassesToEmitFile(PassManagerBase &, 214cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &, 21513d57320bd212483463d4f8992d5787b29eda5dfBill Wendling CodeGenFileType, 216be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned /* OptLevel */) { 217d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling return FileModel::None; 218d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling } 219d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 220d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFileFinish - If the passes to emit the specified file had 221d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// to be split up (e.g., to add an object writer pass), this method can be 222d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// used to finish up adding passes to emit the file, if necessary. 223d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// 22413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling virtual bool addPassesToEmitFileFinish(PassManagerBase &, 225be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling MachineCodeEmitter *, 226be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned /* OptLevel */) { 2276334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner return true; 2286334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner } 2291911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2301911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2311911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// get machine code emitted. This uses a MachineCodeEmitter object to handle 2321911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// actually outputting the machine code and resolving things like the address 2331911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// of functions. This method returns true if machine code emission is 2341911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// not supported. 2351911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// 23613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling virtual bool addPassesToEmitMachineCode(PassManagerBase &, 23713d57320bd212483463d4f8992d5787b29eda5dfBill Wendling MachineCodeEmitter &, 238be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned /* OptLevel */) { 2391911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 2401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 241ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adve 2421911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPassesToEmitWholeFile - This method can be implemented by targets that 2431911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// require having the entire module at once. This is not recommended, do not 2441911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// use this. 2451911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner virtual bool WantsWholeFile() const { return false; } 246cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson virtual bool addPassesToEmitWholeFile(PassManager &, raw_ostream &, 247be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling CodeGenFileType, 248be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned /* OptLevel */) { 2491911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 2501911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 2511911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}; 2521911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2531911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is 2541911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator. 2551911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// 2561911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine { 2571911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses. 25802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman LLVMTargetMachine() { } 25902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 26002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for 26102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// both emitting to assembly files or machine code output. 26202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// 263be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling bool addCommonCodeGenPasses(PassManagerBase &, unsigned /* OptLevel */); 26402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 2651911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic: 2661911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 267d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 268d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 269be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling /// generation. If OptLevel is 0, the code generator should emit code as fast 270be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling /// as possible, though the generated code may be less efficient. This method 271be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling /// should return FileModel::Error if emission of this file type is not 272be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling /// supported. 2731911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// 2741911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// The default implementation of this method adds components from the 2751911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// LLVM retargetable code generator, invoking the methods below to get 2761911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// target-specific passes in standard locations. 2771911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// 278bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohman virtual FileModel::Model addPassesToEmitFile(PassManagerBase &PM, 279cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &Out, 280d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling CodeGenFileType FileType, 281be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned OptLevel); 2821911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 283d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFileFinish - If the passes to emit the specified file had 284d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// to be split up (e.g., to add an object writer pass), this method can be 285d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// used to finish up adding passes to emit the file, if necessary. 286d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// 287bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohman virtual bool addPassesToEmitFileFinish(PassManagerBase &PM, 288be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling MachineCodeEmitter *MCE, 289be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned OptLevel); 290d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 2919f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2928844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke /// get machine code emitted. This uses a MachineCodeEmitter object to handle 2939f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner /// actually outputting the machine code and resolving things like the address 2941911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// of functions. This method returns true if machine code emission is 295b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner /// not supported. 2965c1b5244b956a28667bc2a9e7a84fa39697ba715Chris Lattner /// 297bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohman virtual bool addPassesToEmitMachineCode(PassManagerBase &PM, 298be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling MachineCodeEmitter &MCE, 299be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling unsigned OptLevel); 3001911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3011911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// Target-Independent Code Generator Pass Configuration Options. 3021911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3031911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addInstSelector - This method should add any "last minute" LLVM->LLVM 3041911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// passes, then install an instruction selector pass, which converts from 3051911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// LLVM code to machine instructions. 306be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addInstSelector(PassManagerBase &, unsigned /* OptLevel */) { 3071911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 3081911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 309769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 310769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov /// addPreRegAllocPasses - This method may be implemented by targets that want 311769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov /// to run passes immediately before register allocation. This should return 312769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov /// true if -print-machineinstrs should print after these passes. 313be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addPreRegAlloc(PassManagerBase &, unsigned /* OptLevel */) { 314769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov return false; 315769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov } 316769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 3171911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPostRegAllocPasses - This method may be implemented by targets that 3181911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// want to run passes after register allocation but before prolog-epilog 3191911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// insertion. This should return true if -print-machineinstrs should print 3201911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// after these passes. 321be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addPostRegAlloc(PassManagerBase &, unsigned /* OptLevel */) { 3221911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return false; 3231911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 3241911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3251911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPreEmitPass - This pass may be implemented by targets that want to run 3261911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// passes immediately before machine code is emitted. This should return 3271911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// true if -print-machineinstrs should print out the code after the passes. 328be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addPreEmitPass(PassManagerBase &, unsigned /* OptLevel */) { 3291911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return false; 3301911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 3311911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3321911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3331911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addAssemblyEmitter - This pass should be overridden by the target to add 3341911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// the asmprinter, if asm emission is supported. If this is not supported, 3351911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// 'true' should be returned. 336be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addAssemblyEmitter(PassManagerBase &, unsigned /* OptLevel */, 33742bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool /* VerboseAsmDefault */, raw_ostream &) { 3381911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 3391911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 3401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 3411911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addCodeEmitter - This pass should be overridden by the target to add a 3421911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// code emitter, if supported. If this is not supported, 'true' should be 3438bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng /// returned. If DumpAsm is true, the generated assembly is printed to cerr. 344be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addCodeEmitter(PassManagerBase &, unsigned /* OptLevel */, 34513d57320bd212483463d4f8992d5787b29eda5dfBill Wendling bool /*DumpAsm*/, MachineCodeEmitter &) { 3469f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner return true; 3479f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner } 348d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 349d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addSimpleCodeEmitter - This pass should be overridden by the target to add 350d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// a code emitter (without setting flags), if supported. If this is not 3518bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng /// supported, 'true' should be returned. If DumpAsm is true, the generated 3528bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng /// assembly is printed to cerr. 353be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling virtual bool addSimpleCodeEmitter(PassManagerBase &, unsigned /* OptLevel */, 35413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling bool /*DumpAsm*/, MachineCodeEmitter &) { 355d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling return true; 356d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling } 35781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 358e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 35981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen /// on this target. User flag overrides. 36050cdabcfd52e88381ade61450d98a1c757195befDan Gohman virtual bool getEnableTailMergeDefault() const { return true; } 361a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 362a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 363d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 364d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 365a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 366