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