TargetMachine.h revision f02a188899769cde2315c964f0fbed1d024b7514
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 17255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/StringRef.h" 1830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson#include "llvm/Pass.h" 196c01492ac40bed9529a2f7c8d40da34b8f04365eCraig Topper#include "llvm/Support/CodeGen.h" 208a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky#include "llvm/Target/TargetOptions.h" 21a42649e3dd4c8be2d45451429a41f2b13dbeeb78Brian Gaeke#include <cassert> 220a31d2f6456069adba19b8aeca66c68b633c38b4Chris Lattner#include <string> 23a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 26ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass InstrItineraryData; 27ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass JITCodeEmitter; 2834797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruthclass GlobalValue; 29af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo; 30439661395fd2a2a832dba01c65bc88718528313cEvan Chengclass MCCodeGenInfo; 31ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass MCContext; 32ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass Target; 333574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmowclass DataLayout; 343e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherclass TargetLibraryInfo; 35ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetFrameLowering; 362584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 3749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo; 381e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo; 39a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering; 40843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickclass TargetPassConfig; 416f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo; 42ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetSelectionDAGInfo; 435b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Chengclass TargetSubtargetInfo; 44a98259eefad10455309ad5c7dc7bb1511a077ee2NAKAMURA Takumiclass ScalarTargetTransformInfo; 45a98259eefad10455309ad5c7dc7bb1511a077ee2NAKAMURA Takumiclass VectorTargetTransformInfo; 4671847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_raw_ostream; 4731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbachclass raw_ostream; 48a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 4949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// The old pass manager infrastructure is hidden in a legacy namespace now. 5049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthnamespace legacy { 5149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass PassManagerBase; 5249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth} 5349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthusing legacy::PassManagerBase; 5449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth 555b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===// 565b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 575b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for 585b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine. All target-specific information should be accessible 595b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface. 6034695381d626485a560594f162701088079589dfMisha Brukman/// 6117035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine { 62001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper TargetMachine(const TargetMachine &) LLVM_DELETED_FUNCTION; 63001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper void operator=(const TargetMachine &) LLVM_DELETED_FUNCTION; 6407ac914973ebb484dd7ed1ad143934e14ad56e26Chris Lattnerprotected: // Can only create subclasses. 65ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng TargetMachine(const Target &T, StringRef TargetTriple, 668a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef CPU, StringRef FS, const TargetOptions &Options); 678d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman 6851b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// TheTarget - The Target that this machine was created for. 6951b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &TheTarget; 70e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 71ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng /// TargetTriple, TargetCPU, TargetFS - Triple string, CPU name, and target 72ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng /// feature strings the TargetMachine instance is created with. 73ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetTriple; 74ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetCPU; 75ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetFS; 76ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 77439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// CodeGenInfo - Low level target information such as relocation model. 78f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling /// Non-const to allow resetting optimization level per-function. 79f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling MCCodeGenInfo *CodeGenInfo; 80439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 81a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// AsmInfo - Contains target specific asm information. 82a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 83af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *AsmInfo; 84cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 85cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar unsigned MCRelaxAll : 1; 8696aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola unsigned MCNoExecStack : 1; 87a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar unsigned MCSaveTempLabels : 1; 88195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola unsigned MCUseLoc : 1; 89f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola unsigned MCUseCFI : 1; 9044d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky unsigned MCUseDwarfDirectory : 1; 91cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 92a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 93f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner virtual ~TargetMachine(); 946334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 9551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &getTarget() const { return TheTarget; } 9603f4bc5d6cf777c8aa559c299ef7f85126872881Daniel Dunbar 97ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetTriple() const { return TargetTriple; } 98ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetCPU() const { return TargetCPU; } 99ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetFeatureString() const { return TargetFS; } 100ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 10173b984530f42d1b829a8de8824ae354a133d998aDavid Tweed /// getSubtargetImpl - virtual method implemented by subclasses that returns 10273b984530f42d1b829a8de8824ae354a133d998aDavid Tweed /// a reference to that target's TargetSubtargetInfo-derived member variable. 10373b984530f42d1b829a8de8824ae354a133d998aDavid Tweed virtual const TargetSubtargetInfo *getSubtargetImpl() const { return 0; } 10473b984530f42d1b829a8de8824ae354a133d998aDavid Tweed 1054cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling mutable TargetOptions Options; 1064cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling 1074cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling /// \brief Reset the target options based on the function's attributes. 1084cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling void resetTargetOptions(const MachineFunction *MF) const; 1098a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky 110a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 111d10fa8b1caf010fe4943ae5526c2c3b921339f72Bill Wendling // 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 // 117d10fa8b1caf010fe4943ae5526c2c3b921339f72Bill Wendling // N.B. These objects may change during compilation. It's not safe to cache 118d10fa8b1caf010fe4943ae5526c2c3b921339f72Bill Wendling // them between functions. 11916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov virtual const TargetInstrInfo *getInstrInfo() const { return 0; } 12016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov virtual const TargetFrameLowering *getFrameLowering() const { return 0; } 121d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman virtual const TargetLowering *getTargetLowering() const { return 0; } 122d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const{ return 0; } 1233574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow virtual const DataLayout *getDataLayout() const { return 0; } 124e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 125af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// getMCAsmInfo - Return target specific asm information. 126a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 127af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; } 128e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1299eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// getSubtarget - This method returns a pointer to the specified type of 1305b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng /// TargetSubtargetInfo. 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 { 1331548b863ce316c0b3be81d50d6388147df9aba72Chris Lattner return *static_cast<const STC*>(getSubtargetImpl()); 134fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman } 135fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 136478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// getRegisterInfo - If register information is available, return it. If 1375b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// not, return null. This is kept separate from RegInfo until RegInfo has 1385b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner /// details of graph coloring register allocation removed from it. 139478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner /// 1406f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; } 141e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 14249de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// getIntrinsicInfo - If intrinsic information is available, return it. If 14349de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// not, return null. 14449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// 14549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; } 146478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 1471e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// getJITInfo - If this target supports a JIT, return information for it, 1481e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// otherwise return null. 1491e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// 1501e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner virtual TargetJITInfo *getJITInfo() { return 0; } 151e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1526cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// getInstrItineraryData - Returns instruction itinerary data for the target 1536cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// or specific subtarget. 1546cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// 155e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer virtual const InstrItineraryData *getInstrItineraryData() const { 1563ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng return 0; 1576cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey } 1581e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner 159cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// hasMCRelaxAll - Check whether all machine code instructions should be 160cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// relaxed. 161cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar bool hasMCRelaxAll() const { return MCRelaxAll; } 162cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 163cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// setMCRelaxAll - Set whether all machine code instructions should be 164cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar /// relaxed. 165cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar void setMCRelaxAll(bool Value) { MCRelaxAll = Value; } 166cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 167a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// hasMCSaveTempLabels - Check whether temporary labels will be preserved 168a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// (i.e., not treated as temporary). 169a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar bool hasMCSaveTempLabels() const { return MCSaveTempLabels; } 170a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 171a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// setMCSaveTempLabels - Set whether temporary labels will be preserved 172a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar /// (i.e., not treated as temporary). 173a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar void setMCSaveTempLabels(bool Value) { MCSaveTempLabels = Value; } 174a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 17596aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola /// hasMCNoExecStack - Check whether an executable stack is not needed. 17696aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola bool hasMCNoExecStack() const { return MCNoExecStack; } 17796aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola 17896aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola /// setMCNoExecStack - Set whether an executabel stack is not needed. 17996aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola void setMCNoExecStack(bool Value) { MCNoExecStack = Value; } 18096aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola 181195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola /// hasMCUseLoc - Check whether we should use dwarf's .loc directive. 182195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola bool hasMCUseLoc() const { return MCUseLoc; } 183195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola 184195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola /// setMCUseLoc - Set whether all we should use dwarf's .loc directive. 185195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola void setMCUseLoc(bool Value) { MCUseLoc = Value; } 186195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola 187f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola /// hasMCUseCFI - Check whether we should use dwarf's .cfi_* directives. 188f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool hasMCUseCFI() const { return MCUseCFI; } 189f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola 190f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola /// setMCUseCFI - Set whether all we should use dwarf's .cfi_* directives. 191f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola void setMCUseCFI(bool Value) { MCUseCFI = Value; } 192f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola 19344d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// hasMCUseDwarfDirectory - Check whether we should use .file directives with 19444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// explicit directories. 19544d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool hasMCUseDwarfDirectory() const { return MCUseDwarfDirectory; } 19644d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky 19744d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// setMCUseDwarfDirectory - Set whether all we should use .file directives 19844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky /// with explicit directories. 19944d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky void setMCUseDwarfDirectory(bool Value) { MCUseDwarfDirectory = Value; } 20044d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky 2014c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// getRelocationModel - Returns the code generation relocation model. The 2024c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// choices are static, PIC, and dynamic-no-pic, and target default. 203439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Reloc::Model getRelocationModel() const; 2044c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 205152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// getCodeModel - Returns the code model. The choices are small, kernel, 206152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// medium, large, and target default. 20734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model getCodeModel() const; 208152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 20934797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth /// getTLSModel - Returns the TLS model which should be used for the given 21034797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth /// global variable. 21134797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth TLSModel::Model getTLSModel(const GlobalValue *GV) const; 21234797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth 213b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// getOptLevel - Returns the optimization level: None, Less, 214b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// Default, or Aggressive. 215b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level getOptLevel() const; 216b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng 217f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling /// \brief Overrides the optimization level. 218f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling void setOptLevel(CodeGenOpt::Level Level) const; 219f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling 220843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick void setFastISel(bool Enable) { Options.EnableFastISel = Enable; } 221843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 222843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick bool shouldPrintMachineCode() const { return Options.PrintMachineCode; } 223843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 22442bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// getAsmVerbosityDefault - Returns the default value of asm verbosity. 22542bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 22642bf74be1402df7409efbea089310d4c276fde37Evan Cheng static bool getAsmVerbosityDefault(); 22742bf74be1402df7409efbea089310d4c276fde37Evan Cheng 22842bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default 22942bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// is false. 23042bf74be1402df7409efbea089310d4c276fde37Evan Cheng static void setAsmVerbosityDefault(bool); 23142bf74be1402df7409efbea089310d4c276fde37Evan Cheng 23243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// getDataSections - Return true if data objects should be emitted into their 23343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// own section, corresponds to -fdata-sections. 23443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static bool getDataSections(); 23543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 23643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// getFunctionSections - Return true if functions should be emitted into 23743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// their own section, corresponding to -ffunction-sections. 23843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static bool getFunctionSections(); 23943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 24043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// setDataSections - Set if the data are emit into separate sections. 24143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static void setDataSections(bool); 24243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 24343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// setFunctionSections - Set if the functions are emit into separate 24443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// sections. 24543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner static void setFunctionSections(bool); 24643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 247aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// \brief Register analysis passes for this target with a pass manager. 248aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth virtual void addAnalysisPasses(PassManagerBase &) {} 249aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 25011f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner /// CodeGenFileType - These enums are meant to be passed into 251211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// addPassesToEmitFile to indicate what type of file to emit, and returned by 252211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// it to indicate what type of file could actually be made. 25311f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner enum CodeGenFileType { 254211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_AssemblyFile, 255211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_ObjectFile, 2565669e3009761dff20b67e18a382c334041887928Chris Lattner CGFT_Null // Do not emit any output. 25711f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner }; 25811f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner 259d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 260d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 2615669e3009761dff20b67e18a382c334041887928Chris Lattner /// generation. This method should return true if emission of this file type 2625669e3009761dff20b67e18a382c334041887928Chris Lattner /// is not supported, or false on success. 2635669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &, 2645669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &, 26549cf3a71734b4dc6545c279fb8236bef5758b2d5Eric Christopher CodeGenFileType, 26630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool /*DisableVerify*/ = true, 26748d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands AnalysisID /*StartAfter*/ = 0, 26848d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands AnalysisID /*StopAfter*/ = 0) { 2695669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 270d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling } 271d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 272a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2733813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 274a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 275a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 276a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 277a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 278a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &, 279a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &, 280a930f3d8a37fdcb21e1fd8a14c02cc25af026470Dylan Noblesmith bool /*DisableVerify*/ = true) { 281a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 282a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 283c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner 284c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// addPassesToEmitMC - Add passes to the specified pass manager to get 285c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// machine code emitted with the MCJIT. This method returns true if machine 286c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// code is not supported. It fills the MCContext Ctx pointer which can be 287c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// used to build custom MCStreamer. 288c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// 289ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher virtual bool addPassesToEmitMC(PassManagerBase &, 290ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher MCContext *&, 2910891d99b8758feaf3107b9a6333f1baa9450c799Eric Christopher raw_ostream &, 292a930f3d8a37fdcb21e1fd8a14c02cc25af026470Dylan Noblesmith bool /*DisableVerify*/ = true) { 293c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 294c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner } 2951911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}; 2961911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2971911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is 2981911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator. 2991911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// 3001911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine { 3011911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses. 302ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng LLVMTargetMachine(const Target &T, StringRef TargetTriple, 3038a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef CPU, StringRef FS, TargetOptions Options, 304b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM, CodeModel::Model CM, 305b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 306e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 3074a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola void initAsmInfo(); 3081911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic: 309aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// \brief Register analysis passes for this target with a pass manager. 310aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// 311aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// This registers target independent analysis passes. 312aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth virtual void addAnalysisPasses(PassManagerBase &PM); 313aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 314843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick /// createPassConfig - Create a pass configuration object to be used by 315843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick /// addPassToEmitX methods for generating a pipeline of CodeGen passes. 316061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick virtual TargetPassConfig *createPassConfig(PassManagerBase &PM); 317843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 318d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 319d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 320b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// generation. 3215669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &PM, 3225669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &Out, 3235669e3009761dff20b67e18a382c334041887928Chris Lattner CodeGenFileType FileType, 32430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool DisableVerify = true, 32530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StartAfter = 0, 32630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StopAfter = 0); 327e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 328a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 3293813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 330a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 331a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 332a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 333a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 334a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &PM, 335a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &MCE, 3368772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify = true); 337c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner 338c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// addPassesToEmitMC - Add passes to the specified pass manager to get 339c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// machine code emitted with the MCJIT. This method returns true if machine 340c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// code is not supported. It fills the MCContext Ctx pointer which can be 341c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// used to build custom MCStreamer. 342c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// 343c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner virtual bool addPassesToEmitMC(PassManagerBase &PM, 344c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner MCContext *&Ctx, 34531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach raw_ostream &OS, 346c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner bool DisableVerify = true); 347e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 3481911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addCodeEmitter - This pass should be overridden by the target to add a 3491911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// code emitter, if supported. If this is not supported, 'true' should be 350cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar /// returned. 351b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng virtual bool addCodeEmitter(PassManagerBase &, 352cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar JITCodeEmitter &) { 353a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 354a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 355a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 356a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 357d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 358d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 359a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 360