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; 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass Mangler; 30af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo; 31439661395fd2a2a832dba01c65bc88718528313cEvan Chengclass MCCodeGenInfo; 32ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass MCContext; 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCSymbol; 34ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass Target; 353574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmowclass DataLayout; 363e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherclass TargetLibraryInfo; 37ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetFrameLowering; 382584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo; 3949de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo; 401e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo; 41a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering; 42843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickclass TargetPassConfig; 436f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo; 44ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Chengclass TargetSelectionDAGInfo; 455b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Chengclass TargetSubtargetInfo; 46a98259eefad10455309ad5c7dc7bb1511a077ee2NAKAMURA Takumiclass ScalarTargetTransformInfo; 47a98259eefad10455309ad5c7dc7bb1511a077ee2NAKAMURA Takumiclass VectorTargetTransformInfo; 4871847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_raw_ostream; 4931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbachclass raw_ostream; 50a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 5149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// The old pass manager infrastructure is hidden in a legacy namespace now. 5249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthnamespace legacy { 5349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass PassManagerBase; 5449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth} 5549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthusing legacy::PassManagerBase; 5649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth 575b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===// 585b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// 595b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for 605b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine. All target-specific information should be accessible 615b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface. 6234695381d626485a560594f162701088079589dfMisha Brukman/// 6317035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine { 64001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper TargetMachine(const TargetMachine &) LLVM_DELETED_FUNCTION; 65001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper void operator=(const TargetMachine &) LLVM_DELETED_FUNCTION; 6607ac914973ebb484dd7ed1ad143934e14ad56e26Chris Lattnerprotected: // Can only create subclasses. 67ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng TargetMachine(const Target &T, StringRef TargetTriple, 688a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef CPU, StringRef FS, const TargetOptions &Options); 698d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman 7051b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// TheTarget - The Target that this machine was created for. 7151b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &TheTarget; 72e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 73ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng /// TargetTriple, TargetCPU, TargetFS - Triple string, CPU name, and target 74ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng /// feature strings the TargetMachine instance is created with. 75ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetTriple; 76ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetCPU; 77ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng std::string TargetFS; 78ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 79439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// CodeGenInfo - Low level target information such as relocation model. 80f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling /// Non-const to allow resetting optimization level per-function. 81f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling MCCodeGenInfo *CodeGenInfo; 82439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 83a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// AsmInfo - Contains target specific asm information. 84a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 85af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *AsmInfo; 86cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RequireStructuredCFG : 1; 88cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 89a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 90f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner virtual ~TargetMachine(); 916334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner 9251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const Target &getTarget() const { return TheTarget; } 9303f4bc5d6cf777c8aa559c299ef7f85126872881Daniel Dunbar 94ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetTriple() const { return TargetTriple; } 95ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetCPU() const { return TargetCPU; } 96ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng const StringRef getTargetFeatureString() const { return TargetFS; } 97ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 9873b984530f42d1b829a8de8824ae354a133d998aDavid Tweed /// getSubtargetImpl - virtual method implemented by subclasses that returns 9973b984530f42d1b829a8de8824ae354a133d998aDavid Tweed /// a reference to that target's TargetSubtargetInfo-derived member variable. 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetSubtargetInfo *getSubtargetImpl() const { 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 10373b984530f42d1b829a8de8824ae354a133d998aDavid Tweed 1044cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling mutable TargetOptions Options; 1054cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling 1064cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling /// \brief Reset the target options based on the function's attributes. 1074cb1f5f4064f2eec1420dc30bf32ac54bd40e222Bill Wendling void resetTargetOptions(const MachineFunction *MF) const; 1088a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky 109a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Interfaces to the major aspects of target machine information: 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // 111a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Instruction opcode and operand information 112a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // -- Pipelines and scheduling information 113d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve // -- Stack frame information 114a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng // -- Selection DAG lowering information 11534695381d626485a560594f162701088079589dfMisha Brukman // 116d10fa8b1caf010fe4943ae5526c2c3b921339f72Bill Wendling // N.B. These objects may change during compilation. It's not safe to cache 117d10fa8b1caf010fe4943ae5526c2c3b921339f72Bill Wendling // them between functions. 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetInstrInfo *getInstrInfo() const { return nullptr; } 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetFrameLowering *getFrameLowering() const { 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetLowering *getTargetLowering() const { return nullptr; } 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const { 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const DataLayout *getDataLayout() const { return nullptr; } 127e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 128af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// getMCAsmInfo - Return target specific asm information. 129a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey /// 130af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; } 131e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1329eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// getSubtarget - This method returns a pointer to the specified type of 1335b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng /// TargetSubtargetInfo. In debug builds, it verifies that the object being 1348d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman /// returned is of the correct type. 1355ab83632066071413841af43bc5d1edcced18076Chris Lattner template<typename STC> const STC &getSubtarget() const { 1361548b863ce316c0b3be81d50d6388147df9aba72Chris Lattner return *static_cast<const STC*>(getSubtargetImpl()); 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 /// 143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetRegisterInfo *getRegisterInfo() const { return nullptr; } 144e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 14549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// getIntrinsicInfo - If intrinsic information is available, return it. If 14649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// not, return null. 14749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// 148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return nullptr;} 149478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner 1501e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// getJITInfo - If this target supports a JIT, return information for it, 1511e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// otherwise return null. 1521e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner /// 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual TargetJITInfo *getJITInfo() { return nullptr; } 154e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1556cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// getInstrItineraryData - Returns instruction itinerary data for the target 1566cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// or specific subtarget. 1576cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey /// 158e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer virtual const InstrItineraryData *getInstrItineraryData() const { 159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1606cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey } 1611e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool requiresStructuredCFG() const { return RequireStructuredCFG; } 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setRequiresStructuredCFG(bool Value) { RequireStructuredCFG = Value; } 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1654c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// getRelocationModel - Returns the code generation relocation model. The 1664c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng /// choices are static, PIC, and dynamic-no-pic, and target default. 167439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Reloc::Model getRelocationModel() const; 1684c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng 169152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// getCodeModel - Returns the code model. The choices are small, kernel, 170152ed053533b26194362994398c0ffad7e1c4109Evan Cheng /// medium, large, and target default. 17134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model getCodeModel() const; 172152ed053533b26194362994398c0ffad7e1c4109Evan Cheng 17334797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth /// getTLSModel - Returns the TLS model which should be used for the given 17434797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth /// global variable. 17534797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth TLSModel::Model getTLSModel(const GlobalValue *GV) const; 17634797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth 177b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// getOptLevel - Returns the optimization level: None, Less, 178b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// Default, or Aggressive. 179b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level getOptLevel() const; 180b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng 181f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling /// \brief Overrides the optimization level. 182f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling void setOptLevel(CodeGenOpt::Level Level) const; 183f02a188899769cde2315c964f0fbed1d024b7514Bill Wendling 184843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick void setFastISel(bool Enable) { Options.EnableFastISel = Enable; } 185843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 186843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick bool shouldPrintMachineCode() const { return Options.PrintMachineCode; } 187843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 18842bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// getAsmVerbosityDefault - Returns the default value of asm verbosity. 18942bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool getAsmVerbosityDefault() const ; 19142bf74be1402df7409efbea089310d4c276fde37Evan Cheng 19242bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default 19342bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// is false. 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setAsmVerbosityDefault(bool); 19542bf74be1402df7409efbea089310d4c276fde37Evan Cheng 19643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// getDataSections - Return true if data objects should be emitted into their 19743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// own section, corresponds to -fdata-sections. 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool getDataSections() const; 19943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 20043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// getFunctionSections - Return true if functions should be emitted into 20143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// their own section, corresponding to -ffunction-sections. 202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool getFunctionSections() const; 20343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 20443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// setDataSections - Set if the data are emit into separate sections. 205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setDataSections(bool); 20643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 20743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// setFunctionSections - Set if the functions are emit into separate 20843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner /// sections. 209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setFunctionSections(bool); 21043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 211aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// \brief Register analysis passes for this target with a pass manager. 212aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth virtual void addAnalysisPasses(PassManagerBase &) {} 213aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 21411f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner /// CodeGenFileType - These enums are meant to be passed into 215211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// addPassesToEmitFile to indicate what type of file to emit, and returned by 216211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner /// it to indicate what type of file could actually be made. 21711f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner enum CodeGenFileType { 218211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_AssemblyFile, 219211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner CGFT_ObjectFile, 2205669e3009761dff20b67e18a382c334041887928Chris Lattner CGFT_Null // Do not emit any output. 22111f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner }; 22211f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner 223d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 224d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 2255669e3009761dff20b67e18a382c334041887928Chris Lattner /// generation. This method should return true if emission of this file type 2265669e3009761dff20b67e18a382c334041887928Chris Lattner /// is not supported, or false on success. 2275669e3009761dff20b67e18a382c334041887928Chris Lattner virtual bool addPassesToEmitFile(PassManagerBase &, 2285669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &, 22949cf3a71734b4dc6545c279fb8236bef5758b2d5Eric Christopher CodeGenFileType, 23030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool /*DisableVerify*/ = true, 231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AnalysisID /*StartAfter*/ = nullptr, 232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AnalysisID /*StopAfter*/ = nullptr) { 2335669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 234d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling } 235d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling 236a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2373813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 238a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 239a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 240a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 241a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 242a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addPassesToEmitMachineCode(PassManagerBase &, 243a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &, 244a930f3d8a37fdcb21e1fd8a14c02cc25af026470Dylan Noblesmith bool /*DisableVerify*/ = true) { 245a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 246a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 247c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner 248c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// addPassesToEmitMC - Add passes to the specified pass manager to get 249c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// machine code emitted with the MCJIT. This method returns true if machine 250c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// code is not supported. It fills the MCContext Ctx pointer which can be 251c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// used to build custom MCStreamer. 252c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// 253ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher virtual bool addPassesToEmitMC(PassManagerBase &, 254ed2b84087f4ff1df77b73afaf2003c97816fe7ecEric Christopher MCContext *&, 2550891d99b8758feaf3107b9a6333f1baa9450c799Eric Christopher raw_ostream &, 256a930f3d8a37fdcb21e1fd8a14c02cc25af026470Dylan Noblesmith bool /*DisableVerify*/ = true) { 257c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 258c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner } 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getNameWithPrefix(SmallVectorImpl<char> &Name, const GlobalValue *GV, 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mangler &Mang, bool MayAlwaysUsePrivate = false) const; 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getSymbol(const GlobalValue *GV, Mangler &Mang) const; 2631911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}; 2641911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 2651911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is 2661911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator. 2671911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// 2681911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine { 2691911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses. 270ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng LLVMTargetMachine(const Target &T, StringRef TargetTriple, 2718a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef CPU, StringRef FS, TargetOptions Options, 272b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM, CodeModel::Model CM, 273b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 274e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 2754a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola void initAsmInfo(); 2761911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic: 277aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// \brief Register analysis passes for this target with a pass manager. 278aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// 279aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth /// This registers target independent analysis passes. 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addAnalysisPasses(PassManagerBase &PM) override; 281aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 282843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick /// createPassConfig - Create a pass configuration object to be used by 283843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick /// addPassToEmitX methods for generating a pipeline of CodeGen passes. 284061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick virtual TargetPassConfig *createPassConfig(PassManagerBase &PM); 285843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 286d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// addPassesToEmitFile - Add passes to the specified pass manager to get the 287d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling /// specified file emitted. Typically this will involve several steps of code 288b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// generation. 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool addPassesToEmitFile(PassManagerBase &PM, formatted_raw_ostream &Out, 29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CodeGenFileType FileType, bool DisableVerify = true, 291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AnalysisID StartAfter = nullptr, 292dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AnalysisID StopAfter = nullptr) override; 293e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 294a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2953813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner /// get machine code emitted. This uses a JITCodeEmitter object to handle 296a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// actually outputting the machine code and resolving things like the address 297a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// of functions. This method returns true if machine code emission is 298a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// not supported. 299a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes /// 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool addPassesToEmitMachineCode(PassManagerBase &PM, JITCodeEmitter &MCE, 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool DisableVerify = true) override; 302c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner 303c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// addPassesToEmitMC - Add passes to the specified pass manager to get 304c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// machine code emitted with the MCJIT. This method returns true if machine 305c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// code is not supported. It fills the MCContext Ctx pointer which can be 306c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// used to build custom MCStreamer. 307c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, 30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &OS, bool DisableVerify = true) override; 310e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 3111911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// addCodeEmitter - This pass should be overridden by the target to add a 3121911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner /// code emitter, if supported. If this is not supported, 'true' should be 313cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar /// returned. 314b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng virtual bool addCodeEmitter(PassManagerBase &, 315cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar JITCodeEmitter &) { 316a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 317a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes } 318a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 319a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 320d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 321d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 322a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 323