TargetMachine.h revision be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2b
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
176cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey#include "llvm/Target/TargetInstrItineraries.h"
18a42649e3dd4c8be2d45451429a41f2b13dbeeb78Brian Gaeke#include <cassert>
19a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
22a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskeyclass TargetAsmInfo;
2307000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass TargetData;
24fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass TargetSubtarget;
252584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo;
2649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo;
271e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo;
28a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering;
295b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo;
309f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattnerclass MachineCodeEmitter;
316f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo;
3207000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass Module;
33bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanclass PassManagerBase;
34b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager;
35ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass;
3698b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendlingclass TargetMachOWriterInfo;
3798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendlingclass TargetELFWriterInfo;
38cb3718832375a581c5ea23f15918f3ea447a446cOwen Andersonclass raw_ostream;
39a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
404c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng// Relocation model types.
414c1aa866578f7a358407a22fe55b454f52a24325Evan Chengnamespace Reloc {
424c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  enum Model {
434c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng    Default,
444c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng    Static,
4535d86fef1f1fc5845366c7c36803a6a3334d8a2eChris Lattner    PIC_,         // Cannot be named PIC due to collision with -DPIC
464c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng    DynamicNoPIC
474c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  };
484c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng}
494c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng
50152ed053533b26194362994398c0ffad7e1c4109Evan Cheng// Code model types.
51152ed053533b26194362994398c0ffad7e1c4109Evan Chengnamespace CodeModel {
52152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  enum Model {
53152ed053533b26194362994398c0ffad7e1c4109Evan Cheng    Default,
54152ed053533b26194362994398c0ffad7e1c4109Evan Cheng    Small,
55152ed053533b26194362994398c0ffad7e1c4109Evan Cheng    Kernel,
56152ed053533b26194362994398c0ffad7e1c4109Evan Cheng    Medium,
57152ed053533b26194362994398c0ffad7e1c4109Evan Cheng    Large
58152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  };
59152ed053533b26194362994398c0ffad7e1c4109Evan Cheng}
60152ed053533b26194362994398c0ffad7e1c4109Evan Cheng
61d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendlingnamespace FileModel {
62d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  enum Model {
63d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    Error,
64d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    None,
65d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    AsmFile,
66d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    MachOFile,
67d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    ElfFile
68d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  };
69d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling}
70d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling
715b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===//
725b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner///
735b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for
745b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine.  All target-specific information should be accessible
755b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface.
7634695381d626485a560594f162701088079589dfMisha Brukman///
7717035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine {
781911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  TargetMachine(const TargetMachine &);   // DO NOT IMPLEMENT
791911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  void operator=(const TargetMachine &);  // DO NOT IMPLEMENT
8007ac914973ebb484dd7ed1ad143934e14ad56e26Chris Lattnerprotected: // Can only create subclasses.
81d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman  TargetMachine() : AsmInfo(0) { }
828d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman
838d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman  /// getSubtargetImpl - virtual method implemented by subclasses that returns
848d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman  /// a reference to that target's TargetSubtarget-derived member variable.
858d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman  virtual const TargetSubtarget *getSubtargetImpl() const { return 0; }
86a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey
87a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  /// AsmInfo - Contains target specific asm information.
88a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  ///
89a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  mutable const TargetAsmInfo *AsmInfo;
90e911615c4769d793588087b5321d303ecb9661c7Bill Wendling
91fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey  /// createTargetAsmInfo - Create a new instance of target specific asm
92fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey  /// information.
93d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman  virtual const TargetAsmInfo *createTargetAsmInfo() const { return 0; }
94fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey
95a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic:
96f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner  virtual ~TargetMachine();
976334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner
98a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// getModuleMatchQuality - This static method should be implemented by
99a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// targets to indicate how closely they match the specified module.  This is
100a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// used by the LLC tool to determine which target to use when an explicit
101a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// -march option is not specified.  If a target returns zero, it will never
102a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// be chosen without an explicit -march option.
10313d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  static unsigned getModuleMatchQuality(const Module &) { return 0; }
104a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner
105a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// getJITMatchQuality - This static method should be implemented by targets
106a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// that provide JIT capabilities to indicate how suitable they are for
107a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// execution on the current host.  If a value of 0 is returned, the target
108a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  /// will not be used unless an explicit -march option is used.
109a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner  static unsigned getJITMatchQuality() { return 0; }
110a51e273a764b2a3e8fe856c3bd47b09f9446f380Chris Lattner
111a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // Interfaces to the major aspects of target machine information:
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  //
11736c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner  virtual const TargetInstrInfo        *getInstrInfo() const { return 0; }
11836c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner  virtual const TargetFrameInfo        *getFrameInfo() const { return 0; }
119a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng  virtual       TargetLowering    *getTargetLowering() const { return 0; }
120a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson  virtual const TargetData            *getTargetData() const { return 0; }
121a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey
122a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  /// getTargetAsmInfo - Return target specific asm information.
123a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  ///
124a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  const TargetAsmInfo *getTargetAsmInfo() const {
125a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey    if (!AsmInfo) AsmInfo = createTargetAsmInfo();
126a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey    return AsmInfo;
127a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  }
128a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey
1299eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen  /// getSubtarget - This method returns a pointer to the specified type of
1308d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman  /// TargetSubtarget.  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 {
1338d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman    const TargetSubtarget *TST = getSubtargetImpl();
1345ab83632066071413841af43bc5d1edcced18076Chris Lattner    assert(TST && dynamic_cast<const STC*>(TST) &&
135fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman           "Not the right kind of subtarget!");
1365ab83632066071413841af43bc5d1edcced18076Chris Lattner    return *static_cast<const STC*>(TST);
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  ///
1436f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; }
14449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen
14549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  /// getIntrinsicInfo - If intrinsic information is available, return it.  If
14649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  /// not, return null.
14749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  ///
14849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; }
149478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner
1501e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  /// getJITInfo - If this target supports a JIT, return information for it,
1511e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  /// otherwise return null.
1521e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  ///
1531e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  virtual TargetJITInfo *getJITInfo() { return 0; }
1546cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey
1556cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  /// getInstrItineraryData - Returns instruction itinerary data for the target
1566cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  /// or specific subtarget.
1576cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  ///
1586cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  virtual const InstrItineraryData getInstrItineraryData() const {
1596cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey    return InstrItineraryData();
1606cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  }
1611e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner
1628f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling  /// getMachOWriterInfo - If this target supports a Mach-O writer, return
1638f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling  /// information for it, otherwise return null.
1648f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling  ///
1658f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling  virtual const TargetMachOWriterInfo *getMachOWriterInfo() const { return 0; }
1668f5159e6b225356bd9c07c7040bab002b8707c0aBill Wendling
16798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  /// getELFWriterInfo - If this target supports an ELF writer, return
16898b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  /// information for it, otherwise return null.
16998b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  ///
17098b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; }
17198b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling
1724c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  /// getRelocationModel - Returns the code generation relocation model. The
1734c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  /// choices are static, PIC, and dynamic-no-pic, and target default.
1744c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  static Reloc::Model getRelocationModel();
1754c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng
1764c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  /// setRelocationModel - Sets the code generation relocation model.
17742bf74be1402df7409efbea089310d4c276fde37Evan Cheng  ///
1784c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  static void setRelocationModel(Reloc::Model Model);
1794c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng
180152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  /// getCodeModel - Returns the code model. The choices are small, kernel,
181152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  /// medium, large, and target default.
182152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  static CodeModel::Model getCodeModel();
183152ed053533b26194362994398c0ffad7e1c4109Evan Cheng
184152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  /// setCodeModel - Sets the code model.
18542bf74be1402df7409efbea089310d4c276fde37Evan Cheng  ///
186152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  static void setCodeModel(CodeModel::Model Model);
187152ed053533b26194362994398c0ffad7e1c4109Evan Cheng
18842bf74be1402df7409efbea089310d4c276fde37Evan Cheng  /// getAsmVerbosityDefault - Returns the default value of asm verbosity.
18942bf74be1402df7409efbea089310d4c276fde37Evan Cheng  ///
19042bf74be1402df7409efbea089310d4c276fde37Evan Cheng  static bool getAsmVerbosityDefault();
19142bf74be1402df7409efbea089310d4c276fde37Evan Cheng
19242bf74be1402df7409efbea089310d4c276fde37Evan Cheng  /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default
19342bf74be1402df7409efbea089310d4c276fde37Evan Cheng  /// is false.
19442bf74be1402df7409efbea089310d4c276fde37Evan Cheng  static void setAsmVerbosityDefault(bool);
19542bf74be1402df7409efbea089310d4c276fde37Evan Cheng
19611f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  /// CodeGenFileType - These enums are meant to be passed into
19711f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  /// addPassesToEmitFile to indicate what type of file to emit.
19811f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  enum CodeGenFileType {
19933f80a87230f61b85f62cbc956b6f521b6e2063cChris Lattner    AssemblyFile, ObjectFile, DynamicLibrary
20011f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  };
20111f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner
202e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen  /// getEnableTailMergeDefault - the default setting for -enable-tail-merge
20381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  /// on this target.  User flag overrides.
20450cdabcfd52e88381ade61450d98a1c757195befDan Gohman  virtual bool getEnableTailMergeDefault() const { return true; }
20581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen
206d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addPassesToEmitFile - Add passes to the specified pass manager to get the
207d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// specified file emitted.  Typically this will involve several steps of code
208d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// generation.  If Fast is set to true, the code generator should emit code
20906dd2a68e12a8c278faaf9cbf76ddf6d9e2d696dDan Gohman  /// as fast as possible, though the generated code may be less efficient.
21006dd2a68e12a8c278faaf9cbf76ddf6d9e2d696dDan Gohman  /// This method should return FileModel::Error if emission of this file type
21106dd2a68e12a8c278faaf9cbf76ddf6d9e2d696dDan Gohman  /// is not supported.
212ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner  ///
21313d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  virtual FileModel::Model addPassesToEmitFile(PassManagerBase &,
214cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson                                               raw_ostream &,
21513d57320bd212483463d4f8992d5787b29eda5dfBill Wendling                                               CodeGenFileType,
216be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                               unsigned /* OptLevel */) {
217d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    return FileModel::None;
218d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  }
219d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling
220d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addPassesToEmitFileFinish - If the passes to emit the specified file had
221d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// to be split up (e.g., to add an object writer pass), this method can be
222d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// used to finish up adding passes to emit the file, if necessary.
223d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  ///
22413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  virtual bool addPassesToEmitFileFinish(PassManagerBase &,
225be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                         MachineCodeEmitter *,
226be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                         unsigned /* OptLevel */) {
2276334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner    return true;
2286334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner  }
2291911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
2301911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
2311911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
2321911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// actually outputting the machine code and resolving things like the address
2331911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// of functions.  This method returns true if machine code emission is
2341911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// not supported.
2351911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  ///
23613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  virtual bool addPassesToEmitMachineCode(PassManagerBase &,
23713d57320bd212483463d4f8992d5787b29eda5dfBill Wendling                                          MachineCodeEmitter &,
238be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                          unsigned /* OptLevel */) {
2391911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return true;
2401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
241ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adve
2421911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addPassesToEmitWholeFile - This method can be implemented by targets that
2431911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// require having the entire module at once.  This is not recommended, do not
2441911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// use this.
2451911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  virtual bool WantsWholeFile() const { return false; }
246cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  virtual bool addPassesToEmitWholeFile(PassManager &, raw_ostream &,
247be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                        CodeGenFileType,
248be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                        unsigned /* OptLevel */) {
2491911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return true;
2501911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
2511911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner};
2521911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
2531911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is
2541911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator.
2551911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner///
2561911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine {
2571911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses.
25802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  LLVMTargetMachine() { }
25902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
26002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
26102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  /// both emitting to assembly files or machine code output.
26202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  ///
263be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  bool addCommonCodeGenPasses(PassManagerBase &, unsigned /* OptLevel */);
26402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
2651911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic:
2661911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
267d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addPassesToEmitFile - Add passes to the specified pass manager to get the
268d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// specified file emitted.  Typically this will involve several steps of code
269be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  /// generation.  If OptLevel is 0, the code generator should emit code as fast
270be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  /// as possible, though the generated code may be less efficient.  This method
271be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  /// should return FileModel::Error if emission of this file type is not
272be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  /// supported.
2731911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  ///
2741911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// The default implementation of this method adds components from the
2751911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// LLVM retargetable code generator, invoking the methods below to get
2761911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// target-specific passes in standard locations.
2771911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  ///
278bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohman  virtual FileModel::Model addPassesToEmitFile(PassManagerBase &PM,
279cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson                                               raw_ostream &Out,
280d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling                                               CodeGenFileType FileType,
281be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                               unsigned OptLevel);
2821911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
283d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addPassesToEmitFileFinish - If the passes to emit the specified file had
284d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// to be split up (e.g., to add an object writer pass), this method can be
285d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// used to finish up adding passes to emit the file, if necessary.
286d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  ///
287bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohman  virtual bool addPassesToEmitFileFinish(PassManagerBase &PM,
288be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                         MachineCodeEmitter *MCE,
289be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                         unsigned OptLevel);
290d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling
2919f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
2928844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke  /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
2939f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// actually outputting the machine code and resolving things like the address
2941911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// of functions.  This method returns true if machine code emission is
295b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner  /// not supported.
2965c1b5244b956a28667bc2a9e7a84fa39697ba715Chris Lattner  ///
297bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohman  virtual bool addPassesToEmitMachineCode(PassManagerBase &PM,
298be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                          MachineCodeEmitter &MCE,
299be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                          unsigned OptLevel);
3001911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3011911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// Target-Independent Code Generator Pass Configuration Options.
3021911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3031911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addInstSelector - This method should add any "last minute" LLVM->LLVM
3041911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// passes, then install an instruction selector pass, which converts from
3051911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// LLVM code to machine instructions.
306be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addInstSelector(PassManagerBase &, unsigned /* OptLevel */) {
3071911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return true;
3081911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
309769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov
310769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov  /// addPreRegAllocPasses - This method may be implemented by targets that want
311769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov  /// to run passes immediately before register allocation. This should return
312769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov  /// true if -print-machineinstrs should print after these passes.
313be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addPreRegAlloc(PassManagerBase &, unsigned /* OptLevel */) {
314769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov    return false;
315769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov  }
316769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov
3171911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addPostRegAllocPasses - This method may be implemented by targets that
3181911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// want to run passes after register allocation but before prolog-epilog
3191911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// insertion.  This should return true if -print-machineinstrs should print
3201911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// after these passes.
321be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addPostRegAlloc(PassManagerBase &, unsigned /* OptLevel */) {
3221911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return false;
3231911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3241911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3251911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addPreEmitPass - This pass may be implemented by targets that want to run
3261911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// passes immediately before machine code is emitted.  This should return
3271911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// true if -print-machineinstrs should print out the code after the passes.
328be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addPreEmitPass(PassManagerBase &, unsigned /* OptLevel */) {
3291911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return false;
3301911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3311911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3321911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3331911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addAssemblyEmitter - This pass should be overridden by the target to add
3341911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// the asmprinter, if asm emission is supported.  If this is not supported,
3351911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// 'true' should be returned.
336be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addAssemblyEmitter(PassManagerBase &, unsigned /* OptLevel */,
33742bf74be1402df7409efbea089310d4c276fde37Evan Cheng                                  bool /* VerboseAsmDefault */, raw_ostream &) {
3381911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return true;
3391911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3411911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addCodeEmitter - This pass should be overridden by the target to add a
3421911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// code emitter, if supported.  If this is not supported, 'true' should be
3438bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng  /// returned. If DumpAsm is true, the generated assembly is printed to cerr.
344be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addCodeEmitter(PassManagerBase &, unsigned /* OptLevel */,
34513d57320bd212483463d4f8992d5787b29eda5dfBill Wendling                              bool /*DumpAsm*/, MachineCodeEmitter &) {
3469f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner    return true;
3479f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  }
348d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling
349d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addSimpleCodeEmitter - This pass should be overridden by the target to add
350d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// a code emitter (without setting flags), if supported.  If this is not
3518bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng  /// supported, 'true' should be returned.  If DumpAsm is true, the generated
3528bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng  /// assembly is printed to cerr.
353be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  virtual bool addSimpleCodeEmitter(PassManagerBase &, unsigned /* OptLevel */,
35413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling                                    bool /*DumpAsm*/, MachineCodeEmitter &) {
355d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling    return true;
356d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  }
35781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen
358e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen  /// getEnableTailMergeDefault - the default setting for -enable-tail-merge
35981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  /// on this target.  User flag overrides.
36050cdabcfd52e88381ade61450d98a1c757195befDan Gohman  virtual bool getEnableTailMergeDefault() const { return true; }
361a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve};
362a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
363d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
364d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
365a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif
366