TargetMachine.h revision 44d798d9763bc32aaf49fe7c10d604845f4b6685
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 17439661395fd2a2a832dba01c65bc88718528313cEvan Cheng#include "llvm/MC/MCCodeGenInfo.h" 18ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#include "llvm/ADT/StringRef.h" 19a42649e3dd4c8be2d45451429a41f2b13dbeeb78Brian Gaeke#include <cassert> 200a31d2f6456069adba19b8aeca66c68b633c38b4Chris Lattner#include <string> 21a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 24ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass InstrItineraryData; 25ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass JITCodeEmitter; 26af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo; 27439661395fd2a2a832dba01c65bc88718528313cEvan Chengclass MCCodeGenInfo; 28ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass MCContext; 29ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass Pass; 30ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass PassManager; 31ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass PassManagerBase; 32ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass Target; 3307000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass TargetData; 34ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetELFWriterInfo; 35ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetFrameLowering; 362584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 3749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo; 381e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo; 39a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering; 406f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo; 41ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetSelectionDAGInfo; 425b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Chengclass TargetSubtargetInfo; 4371847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_raw_ostream; 4431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbachclass raw_ostream; 45a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 4698a366d547772010e94609e4584489b3e5ce0043Bill Wendling// Code generation optimization level. 4798a366d547772010e94609e4584489b3e5ce0043Bill Wendlingnamespace CodeGenOpt { 4898a366d547772010e94609e4584489b3e5ce0043Bill Wendling enum Level { 49bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng None, // -O0 50bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng Less, // -O1 51bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng Default, // -O2, -Os 52bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng Aggressive // -O3 5398a366d547772010e94609e4584489b3e5ce0043Bill Wendling }; 5498a366d547772010e94609e4584489b3e5ce0043Bill Wendling} 5598a366d547772010e94609e4584489b3e5ce0043Bill Wendling 56211ffa13519cadfb7f9baf4c8447fa055bf38fe8Evan Chengnamespace Sched { 57211ffa13519cadfb7f9baf4c8447fa055bf38fe8Evan Cheng enum Preference { 581cc3984148be113c6e5e470f23c9ddbd37679c5fEvan Cheng None, // No preference 59211ffa13519cadfb7f9baf4c8447fa055bf38fe8Evan Cheng Latency, // Scheduling for shortest total latency. 6015a16def6e70c8f7df1023da80ceb89887203b40Evan Cheng RegPressure, // Scheduling for lowest register pressure. 6170017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng Hybrid, // Scheduling for both latency and register pressure. 6270017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng ILP // Scheduling for ILP in low register pressure mode. 63211ffa13519cadfb7f9baf4c8447fa055bf38fe8Evan Cheng }; 64211ffa13519cadfb7f9baf4c8447fa055bf38fe8Evan Cheng} 65211ffa13519cadfb7f9baf4c8447fa055bf38fe8Evan Cheng 665b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===// 675b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 685b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for 695b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine. All target-specific information should be accessible 705b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface. 7134695381d626485a560594f162701088079589dfMisha Brukman/// 7217035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine { 731911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner TargetMachine(const TargetMachine &); // DO NOT IMPLEMENT 741911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner void operator=(const TargetMachine &); // DO NOT IMPLEMENT 7507ac914973ebb484dd7ed1ad143934e14ad56e26Chris Lattnerprotected: // Can only create subclasses. 76ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng TargetMachine(const Target &T, StringRef TargetTriple, 77ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng StringRef CPU, StringRef FS); 788d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman 798d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// getSubtargetImpl - virtual method implemented by subclasses that returns 805b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng /// a reference to that target's TargetSubtargetInfo-derived member variable. 815b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng virtual const TargetSubtargetInfo *getSubtargetImpl() const { return 0; } 8251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar 8351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// TheTarget - The Target that this machine was created for. 8451b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &TheTarget; 85e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 86ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng /// TargetTriple, TargetCPU, TargetFS - Triple string, CPU name, and target 87ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng /// feature strings the TargetMachine instance is created with. 88ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetTriple; 89ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetCPU; 90ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetFS; 91ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 92439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// CodeGenInfo - Low level target information such as relocation model. 93439661395fd2a2a832dba01c65bc88718528313cEvan Cheng const MCCodeGenInfo *CodeGenInfo; 94439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 95a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// AsmInfo - Contains target specific asm information. 96a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 97af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *AsmInfo; 98cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 99cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar unsigned MCRelaxAll : 1; 10096aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola unsigned MCNoExecStack : 1; 101a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar unsigned MCSaveTempLabels : 1; 102195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola unsigned MCUseLoc : 1; 103f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola unsigned MCUseCFI : 1; 10444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky unsigned MCUseDwarfDirectory : 1; 105cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 106a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 107f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner virtual ~TargetMachine(); 1086334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 10951b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &getTarget() const { return TheTarget; } 11003f4bc5d6cf777c8aa559c299ef7f85126872881Daniel Dunbar 111ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetTriple() const { return TargetTriple; } 112ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetCPU() const { return TargetCPU; } 113ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetFeatureString() const { return TargetFS; } 114ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 115a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 116a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Instruction opcode and operand information 117a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Pipelines and scheduling information 118d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Stack frame information 119a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng // -- Selection DAG lowering information 12034695381d626485a560594f162701088079589dfMisha Brukman // 12116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov virtual const TargetInstrInfo *getInstrInfo() const { return 0; } 12216c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov virtual const TargetFrameLowering *getFrameLowering() const { return 0; } 123d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman virtual const TargetLowering *getTargetLowering() const { return 0; } 124d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const{ return 0; } 12516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov virtual const TargetData *getTargetData() const { return 0; } 126e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 127af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// getMCAsmInfo - Return target specific asm information. 128a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 129af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; } 130e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1319eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// getSubtarget - This method returns a pointer to the specified type of 1325b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng /// TargetSubtargetInfo. In debug builds, it verifies that the object being 1338d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// returned is of the correct type. 1345ab83632066071413841af43bc5d1edcced18076Chris Lattner template<typename STC> const STC &getSubtarget() const { 1351548b863ce316c0b3be81d50d6388147df9aba72Chris Lattner return *static_cast<const STC*>(getSubtargetImpl()); 136fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman } 137fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 138478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// getRegisterInfo - If register information is available, return it. If 1395b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 1405b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// details of graph coloring register allocation removed from it. 141478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// 1426f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; } 143e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 14449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// getIntrinsicInfo - If intrinsic information is available, return it. If 14549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// not, return null. 14649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// 14749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; } 148478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 1491e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// getJITInfo - If this target supports a JIT, return information for it, 1501e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// otherwise return null. 1511e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// 1521e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner virtual TargetJITInfo *getJITInfo() { return 0; } 153e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1546cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// getInstrItineraryData - Returns instruction itinerary data for the target 1556cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// or specific subtarget. 1566cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// 157e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer virtual const InstrItineraryData *getInstrItineraryData() const { 1583ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng return 0; 1596cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey } 1601e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner 16198b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// getELFWriterInfo - If this target supports an ELF writer, return 16298b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling /// information for it, otherwise return null. 163e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer /// 16498b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; } 16598b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling 166cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// hasMCRelaxAll - Check whether all machine code instructions should be 167cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// relaxed. 168cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar bool hasMCRelaxAll() const { return MCRelaxAll; } 169cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 170cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// setMCRelaxAll - Set whether all machine code instructions should be 171cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// relaxed. 172cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar void setMCRelaxAll(bool Value) { MCRelaxAll = Value; } 173cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 174a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// hasMCSaveTempLabels - Check whether temporary labels will be preserved 175a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// (i.e., not treated as temporary). 176a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar bool hasMCSaveTempLabels() const { return MCSaveTempLabels; } 177a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 178a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// setMCSaveTempLabels - Set whether temporary labels will be preserved 179a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// (i.e., not treated as temporary). 180a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar void setMCSaveTempLabels(bool Value) { MCSaveTempLabels = Value; } 181a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 18296aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola /// hasMCNoExecStack - Check whether an executable stack is not needed. 18396aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola bool hasMCNoExecStack() const { return MCNoExecStack; } 18496aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola 18596aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola /// setMCNoExecStack - Set whether an executabel stack is not needed. 18696aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola void setMCNoExecStack(bool Value) { MCNoExecStack = Value; } 18796aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola 188195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola /// hasMCUseLoc - Check whether we should use dwarf's .loc directive. 189195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola bool hasMCUseLoc() const { return MCUseLoc; } 190195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola 191195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola /// setMCUseLoc - Set whether all we should use dwarf's .loc directive. 192195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola void setMCUseLoc(bool Value) { MCUseLoc = Value; } 193195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola 194f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola /// hasMCUseCFI - Check whether we should use dwarf's .cfi_* directives. 195f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool hasMCUseCFI() const { return MCUseCFI; } 196f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola 197f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola /// setMCUseCFI - Set whether all we should use dwarf's .cfi_* directives. 198f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola void setMCUseCFI(bool Value) { MCUseCFI = Value; } 199f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola 20044d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// hasMCUseDwarfDirectory - Check whether we should use .file directives with 20144d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// explicit directories. 20244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool hasMCUseDwarfDirectory() const { return MCUseDwarfDirectory; } 20344d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky 20444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// setMCUseDwarfDirectory - Set whether all we should use .file directives 20544d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// with explicit directories. 20644d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky void setMCUseDwarfDirectory(bool Value) { MCUseDwarfDirectory = Value; } 20744d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky 2084c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// getRelocationModel - Returns the code generation relocation model. The 2094c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// choices are static, PIC, and dynamic-no-pic, and target default. 210439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Reloc::Model getRelocationModel() const; 2114c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 212152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// getCodeModel - Returns the code model. The choices are small, kernel, 213152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// medium, large, and target default. 21434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model getCodeModel() const; 215152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 21642bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// getAsmVerbosityDefault - Returns the default value of asm verbosity. 21742bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 21842bf74be1402df7409efbea089310d4c276fde37Evan Cheng static bool getAsmVerbosityDefault(); 21942bf74be1402df7409efbea089310d4c276fde37Evan Cheng 22042bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default 22142bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// is false. 22242bf74be1402df7409efbea089310d4c276fde37Evan Cheng static void setAsmVerbosityDefault(bool); 22342bf74be1402df7409efbea089310d4c276fde37Evan Cheng 22443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// getDataSections - Return true if data objects should be emitted into their 22543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// own section, corresponds to -fdata-sections. 22643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static bool getDataSections(); 22743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 22843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// getFunctionSections - Return true if functions should be emitted into 22943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// their own section, corresponding to -ffunction-sections. 23043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static bool getFunctionSections(); 23143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 23243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// setDataSections - Set if the data are emit into separate sections. 23343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static void setDataSections(bool); 23443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 23543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// setFunctionSections - Set if the functions are emit into separate 23643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// sections. 23743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static void setFunctionSections(bool); 23843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 23911f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner /// CodeGenFileType - These enums are meant to be passed into 240211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// addPassesToEmitFile to indicate what type of file to emit, and returned by 241211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// it to indicate what type of file could actually be made. 24211f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner enum CodeGenFileType { 243211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_AssemblyFile, 244211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_ObjectFile, 2455669e3009761dff20b67e18a382c334041887928Chris Lattner CGFT_Null // Do not emit any output. 24611f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner }; 24711f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner 248e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 24981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen /// on this target. User flag overrides. 25050cdabcfd52e88381ade61450d98a1c757195befDan Gohman virtual bool getEnableTailMergeDefault() const { return true; } 25181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 252d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 253d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 2545669e3009761dff20b67e18a382c334041887928Chris Lattner /// generation. This method should return true if emission of this file type 2555669e3009761dff20b67e18a382c334041887928Chris Lattner /// is not supported, or false on success. 2565669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &, 2575669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &, 25849cf3a71734b4dc6545c279fb8236bef5758b2d5Eric Christopher CodeGenFileType, 2598772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 2601f2ae40efd5167cfe5dde34c310138933307691bEric Christopher bool = true) { 2615669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 262d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling } 263d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 264a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2653813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 266a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 267a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 268a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 269a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 270a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &, 271a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &, 2728772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 2731f2ae40efd5167cfe5dde34c310138933307691bEric Christopher bool = true) { 274a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 275a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 276c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner 277c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// addPassesToEmitMC - Add passes to the specified pass manager to get 278c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// machine code emitted with the MCJIT. This method returns true if machine 279c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// code is not supported. It fills the MCContext Ctx pointer which can be 280c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// used to build custom MCStreamer. 281c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// 282ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher virtual bool addPassesToEmitMC(PassManagerBase &, 283ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher MCContext *&, 2840891d99b8758feaf3107b9a6333f1baa9450c799Eric Christopher raw_ostream &, 285ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher CodeGenOpt::Level, 286ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher bool = true) { 287c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 288c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner } 2891911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}; 2901911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2911911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is 2921911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator. 2931911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// 2941911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine { 2951911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses. 296ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng LLVMTargetMachine(const Target &T, StringRef TargetTriple, 29734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng StringRef CPU, StringRef FS, 29834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, CodeModel::Model CM); 299e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 30011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattnerprivate: 30102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for 30202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// both emitting to assembly files or machine code output. 30302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman /// 3048772f5041ce8e98695655a72a54b952583630617Dan Gohman bool addCommonCodeGenPasses(PassManagerBase &, CodeGenOpt::Level, 30511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner bool DisableVerify, MCContext *&OutCtx); 30602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 3071911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic: 308d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 309d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 310211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// generation. If OptLevel is None, the code generator should emit code as 3115669e3009761dff20b67e18a382c334041887928Chris Lattner /// fast as possible, though the generated code may be less efficient. 3125669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &PM, 3135669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &Out, 3145669e3009761dff20b67e18a382c334041887928Chris Lattner CodeGenFileType FileType, 3158772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 3168772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true); 317e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 318a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 3193813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 320a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 321a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 322a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 323a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 324a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &PM, 325a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &MCE, 3268772f5041ce8e98695655a72a54b952583630617Dan Gohman CodeGenOpt::Level, 3278772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true); 328c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner 329c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// addPassesToEmitMC - Add passes to the specified pass manager to get 330c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// machine code emitted with the MCJIT. This method returns true if machine 331c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// code is not supported. It fills the MCContext Ctx pointer which can be 332c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// used to build custom MCStreamer. 333c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// 334c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner virtual bool addPassesToEmitMC(PassManagerBase &PM, 335c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner MCContext *&Ctx, 33631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach raw_ostream &OS, 337c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner CodeGenOpt::Level OptLevel, 338c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner bool DisableVerify = true); 339e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 3401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// Target-Independent Code Generator Pass Configuration Options. 3418c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov 3428c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov /// addPreISelPasses - This method should add any "last minute" LLVM->LLVM 3438c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov /// passes (which are run just before instruction selector). 3448c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov virtual bool addPreISel(PassManagerBase &, CodeGenOpt::Level) { 3458c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov return true; 3468c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov } 3478c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov 3488c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov /// addInstSelector - This method should install an instruction selector pass, 3498c64b9766e654079339ea7f3a2da152f18d00179Anton Korobeynikov /// which converts from LLVM code to machine instructions. 35098a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addInstSelector(PassManagerBase &, CodeGenOpt::Level) { 3511911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return true; 3521911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 353769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 354629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// addPreRegAlloc - This method may be implemented by targets that want to 355629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// run passes immediately before register allocation. This should return 356769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov /// true if -print-machineinstrs should print after these passes. 35798a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPreRegAlloc(PassManagerBase &, CodeGenOpt::Level) { 358769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov return false; 359769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov } 360769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 361629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// addPostRegAlloc - This method may be implemented by targets that want 362629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// to run passes after register allocation but before prolog-epilog 3631911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// insertion. This should return true if -print-machineinstrs should print 3641911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// after these passes. 36598a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPostRegAlloc(PassManagerBase &, CodeGenOpt::Level) { 3661911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return false; 3671911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 368629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng 369629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// addPreSched2 - This method may be implemented by targets that want to 370629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// run passes after prolog-epilog insertion and before the second instruction 371629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// scheduling pass. This should return true if -print-machineinstrs should 372629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng /// print after these passes. 373629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng virtual bool addPreSched2(PassManagerBase &, CodeGenOpt::Level) { 374629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng return false; 375629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng } 376e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 3771911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addPreEmitPass - This pass may be implemented by targets that want to run 3781911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// passes immediately before machine code is emitted. This should return 3791911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// true if -print-machineinstrs should print out the code after the passes. 38098a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPreEmitPass(PassManagerBase &, CodeGenOpt::Level) { 3811911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return false; 3821911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 383e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 384e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 3851911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addCodeEmitter - This pass should be overridden by the target to add a 3861911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// code emitter, if supported. If this is not supported, 'true' should be 387cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar /// returned. 38898a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addCodeEmitter(PassManagerBase &, CodeGenOpt::Level, 389cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar JITCodeEmitter &) { 390a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 391a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 392a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 393e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen /// getEnableTailMergeDefault - the default setting for -enable-tail-merge 39481da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen /// on this target. User flag overrides. 39550cdabcfd52e88381ade61450d98a1c757195befDan Gohman virtual bool getEnableTailMergeDefault() const { return true; } 396a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 397a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 398d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 399d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 400a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 401