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