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