TargetMachine.h revision 8772f5041ce8e98695655a72a54b952583630617
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>
190a31d2f6456069adba19b8aeca66c68b633c38b4Chris Lattner#include <string>
20a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbarclass Target;
24af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo;
2507000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Andersonclass TargetData;
26fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass TargetSubtarget;
272584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo;
2849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenclass TargetIntrinsicInfo;
291e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerclass TargetJITInfo;
30a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Chengclass TargetLowering;
315b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo;
32a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopesclass JITCodeEmitter;
336f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo;
34bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanclass PassManagerBase;
35b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager;
36ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass;
3798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendlingclass TargetELFWriterInfo;
3871847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_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
6198a366d547772010e94609e4584489b3e5ce0043Bill Wendling// Code generation optimization level.
6298a366d547772010e94609e4584489b3e5ce0043Bill Wendlingnamespace CodeGenOpt {
6398a366d547772010e94609e4584489b3e5ce0043Bill Wendling  enum Level {
64bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng    None,        // -O0
65bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng    Less,        // -O1
66bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng    Default,     // -O2, -Os
67bf57b52ba424bbaaa6e2d25dd4df731deb59f959Evan Cheng    Aggressive   // -O3
6898a366d547772010e94609e4584489b3e5ce0043Bill Wendling  };
6998a366d547772010e94609e4584489b3e5ce0043Bill Wendling}
7098a366d547772010e94609e4584489b3e5ce0043Bill 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.
8151b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar  TargetMachine(const Target &);
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; }
8651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar
8751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar  /// TheTarget - The Target that this machine was created for.
8851b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar  const Target &TheTarget;
89a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey
90a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  /// AsmInfo - Contains target specific asm information.
91a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  ///
92af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  const MCAsmInfo *AsmInfo;
93e911615c4769d793588087b5321d303ecb9661c7Bill Wendling
94a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic:
95f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner  virtual ~TargetMachine();
966334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner
9751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar  const Target &getTarget() const { return TheTarget; }
9803f4bc5d6cf777c8aa559c299ef7f85126872881Daniel Dunbar
99a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // Interfaces to the major aspects of target machine information:
100a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // -- Instruction opcode and operand information
101a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // -- Pipelines and scheduling information
102d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve  // -- Stack frame information
103a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng  // -- Selection DAG lowering information
10434695381d626485a560594f162701088079589dfMisha Brukman  //
10536c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner  virtual const TargetInstrInfo        *getInstrInfo() const { return 0; }
10636c2a0593509da714bea6457dd1b00a7417ce342Chris Lattner  virtual const TargetFrameInfo        *getFrameInfo() const { return 0; }
107a84b1c7c4efdba050cbf308eb9ac4fd8392b69d9Evan Cheng  virtual       TargetLowering    *getTargetLowering() const { return 0; }
108a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson  virtual const TargetData            *getTargetData() const { return 0; }
109a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey
110af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  /// getMCAsmInfo - Return target specific asm information.
111a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey  ///
112af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; }
113a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey
1149eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen  /// getSubtarget - This method returns a pointer to the specified type of
1158d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman  /// TargetSubtarget.  In debug builds, it verifies that the object being
1168d2623d49a7b53f2bb25f2b61c14aecb91e19154Nate Begeman  /// returned is of the correct type.
1175ab83632066071413841af43bc5d1edcced18076Chris Lattner  template<typename STC> const STC &getSubtarget() const {
1181548b863ce316c0b3be81d50d6388147df9aba72Chris Lattner    return *static_cast<const STC*>(getSubtargetImpl());
119fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman  }
120fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman
121478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner  /// getRegisterInfo - If register information is available, return it.  If
1225b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner  /// not, return null.  This is kept separate from RegInfo until RegInfo has
1235b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner  /// details of graph coloring register allocation removed from it.
124478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner  ///
1256f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; }
12649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen
12749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  /// getIntrinsicInfo - If intrinsic information is available, return it.  If
12849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  /// not, return null.
12949de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  ///
13049de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; }
131478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner
1321e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  /// getJITInfo - If this target supports a JIT, return information for it,
1331e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  /// otherwise return null.
1341e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  ///
1351e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner  virtual TargetJITInfo *getJITInfo() { return 0; }
1366cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey
1376cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  /// getInstrItineraryData - Returns instruction itinerary data for the target
1386cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  /// or specific subtarget.
1396cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  ///
1406cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  virtual const InstrItineraryData getInstrItineraryData() const {
1416cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey    return InstrItineraryData();
1426cee630070b1a7183ed56a8404e812629f5ca538Jim Laskey  }
1431e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner
14498b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  /// getELFWriterInfo - If this target supports an ELF writer, return
14598b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  /// information for it, otherwise return null.
14698b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  ///
14798b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling  virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; }
14898b5795f6227fd31e6cd2852adf5a641ea1ce3beBill Wendling
1494c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  /// getRelocationModel - Returns the code generation relocation model. The
1504c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  /// choices are static, PIC, and dynamic-no-pic, and target default.
1514c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  static Reloc::Model getRelocationModel();
1524c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng
1534c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  /// setRelocationModel - Sets the code generation relocation model.
15442bf74be1402df7409efbea089310d4c276fde37Evan Cheng  ///
1554c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  static void setRelocationModel(Reloc::Model Model);
1564c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng
157152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  /// getCodeModel - Returns the code model. The choices are small, kernel,
158152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  /// medium, large, and target default.
159152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  static CodeModel::Model getCodeModel();
160152ed053533b26194362994398c0ffad7e1c4109Evan Cheng
161152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  /// setCodeModel - Sets the code model.
16242bf74be1402df7409efbea089310d4c276fde37Evan Cheng  ///
163152ed053533b26194362994398c0ffad7e1c4109Evan Cheng  static void setCodeModel(CodeModel::Model Model);
164152ed053533b26194362994398c0ffad7e1c4109Evan Cheng
16542bf74be1402df7409efbea089310d4c276fde37Evan Cheng  /// getAsmVerbosityDefault - Returns the default value of asm verbosity.
16642bf74be1402df7409efbea089310d4c276fde37Evan Cheng  ///
16742bf74be1402df7409efbea089310d4c276fde37Evan Cheng  static bool getAsmVerbosityDefault();
16842bf74be1402df7409efbea089310d4c276fde37Evan Cheng
16942bf74be1402df7409efbea089310d4c276fde37Evan Cheng  /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default
17042bf74be1402df7409efbea089310d4c276fde37Evan Cheng  /// is false.
17142bf74be1402df7409efbea089310d4c276fde37Evan Cheng  static void setAsmVerbosityDefault(bool);
17242bf74be1402df7409efbea089310d4c276fde37Evan Cheng
17311f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  /// CodeGenFileType - These enums are meant to be passed into
174211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner  /// addPassesToEmitFile to indicate what type of file to emit, and returned by
175211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner  /// it to indicate what type of file could actually be made.
17611f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  enum CodeGenFileType {
177211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner    CGFT_AssemblyFile,
178211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner    CGFT_ObjectFile,
1795669e3009761dff20b67e18a382c334041887928Chris Lattner    CGFT_Null         // Do not emit any output.
18011f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner  };
18111f14c8be0946a8fb95189156ff1d64a01ff7da3Chris Lattner
182e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen  /// getEnableTailMergeDefault - the default setting for -enable-tail-merge
18381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  /// on this target.  User flag overrides.
18450cdabcfd52e88381ade61450d98a1c757195befDan Gohman  virtual bool getEnableTailMergeDefault() const { return true; }
18581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen
186d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addPassesToEmitFile - Add passes to the specified pass manager to get the
187d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// specified file emitted.  Typically this will involve several steps of code
1885669e3009761dff20b67e18a382c334041887928Chris Lattner  /// generation.  This method should return true if emission of this file type
1895669e3009761dff20b67e18a382c334041887928Chris Lattner  /// is not supported, or false on success.
1905669e3009761dff20b67e18a382c334041887928Chris Lattner  virtual bool addPassesToEmitFile(PassManagerBase &,
1915669e3009761dff20b67e18a382c334041887928Chris Lattner                                   formatted_raw_ostream &,
19249cf3a71734b4dc6545c279fb8236bef5758b2d5Eric Christopher                                   CodeGenFileType,
1938772f5041ce8e98695655a72a54b952583630617Dan Gohman                                   CodeGenOpt::Level,
1948772f5041ce8e98695655a72a54b952583630617Dan Gohman                                   bool DisableVerify = true) {
1955669e3009761dff20b67e18a382c334041887928Chris Lattner    return true;
196d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  }
197d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling
198a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
1993813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner  /// get machine code emitted.  This uses a JITCodeEmitter object to handle
200a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// actually outputting the machine code and resolving things like the address
201a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// of functions.  This method returns true if machine code emission is
202a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// not supported.
203a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  ///
204a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  virtual bool addPassesToEmitMachineCode(PassManagerBase &,
205a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes                                          JITCodeEmitter &,
2068772f5041ce8e98695655a72a54b952583630617Dan Gohman                                          CodeGenOpt::Level,
2078772f5041ce8e98695655a72a54b952583630617Dan Gohman                                          bool DisableVerify = true) {
208a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes    return true;
209a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  }
210a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
2111911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addPassesToEmitWholeFile - This method can be implemented by targets that
2121911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// require having the entire module at once.  This is not recommended, do not
2131911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// use this.
2141911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  virtual bool WantsWholeFile() const { return false; }
21571847813bc419f7a0667468136a07429c6d9f164David Greene  virtual bool addPassesToEmitWholeFile(PassManager &, formatted_raw_ostream &,
216be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling                                        CodeGenFileType,
2178772f5041ce8e98695655a72a54b952583630617Dan Gohman                                        CodeGenOpt::Level,
2188772f5041ce8e98695655a72a54b952583630617Dan Gohman                                        bool DisableVerify = true) {
2191911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return true;
2201911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
2211911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner};
2221911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
2231911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// LLVMTargetMachine - This class describes a target machine that is
2241911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner/// implemented with the LLVM target-independent code generator.
2251911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner///
2261911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass LLVMTargetMachine : public TargetMachine {
2271911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerprotected: // Can only create subclasses.
228a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  LLVMTargetMachine(const Target &T, const std::string &TargetTriple);
229a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
23002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
23102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  /// both emitting to assembly files or machine code output.
23202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  ///
2338772f5041ce8e98695655a72a54b952583630617Dan Gohman  bool addCommonCodeGenPasses(PassManagerBase &, CodeGenOpt::Level,
2348772f5041ce8e98695655a72a54b952583630617Dan Gohman                              bool DisableVerify);
23502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
236f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopherprivate:
237f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopher  virtual void setCodeModelForJIT();
238f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopher  virtual void setCodeModelForStatic();
239f4f43cb5011611d44219ffb1caa988f5adf305bfEric Christopher
2401911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerpublic:
2411911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
242d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// addPassesToEmitFile - Add passes to the specified pass manager to get the
243d25f933c0ddc58bc19acc7a8ec5da3b0f5412a9aBill Wendling  /// specified file emitted.  Typically this will involve several steps of code
244211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner  /// generation.  If OptLevel is None, the code generator should emit code as
2455669e3009761dff20b67e18a382c334041887928Chris Lattner  /// fast as possible, though the generated code may be less efficient.
2465669e3009761dff20b67e18a382c334041887928Chris Lattner  virtual bool addPassesToEmitFile(PassManagerBase &PM,
2475669e3009761dff20b67e18a382c334041887928Chris Lattner                                   formatted_raw_ostream &Out,
2485669e3009761dff20b67e18a382c334041887928Chris Lattner                                   CodeGenFileType FileType,
2498772f5041ce8e98695655a72a54b952583630617Dan Gohman                                   CodeGenOpt::Level,
2508772f5041ce8e98695655a72a54b952583630617Dan Gohman                                   bool DisableVerify = true);
2511911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
252a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
2533813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner  /// get machine code emitted.  This uses a JITCodeEmitter object to handle
254a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// actually outputting the machine code and resolving things like the address
255a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// of functions.  This method returns true if machine code emission is
256a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  /// not supported.
257a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  ///
258a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  virtual bool addPassesToEmitMachineCode(PassManagerBase &PM,
259a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes                                          JITCodeEmitter &MCE,
2608772f5041ce8e98695655a72a54b952583630617Dan Gohman                                          CodeGenOpt::Level,
2618772f5041ce8e98695655a72a54b952583630617Dan Gohman                                          bool DisableVerify = true);
262a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
2631911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// Target-Independent Code Generator Pass Configuration Options.
2641911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
2651911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addInstSelector - This method should add any "last minute" LLVM->LLVM
2661911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// passes, then install an instruction selector pass, which converts from
2671911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// LLVM code to machine instructions.
26898a366d547772010e94609e4584489b3e5ce0043Bill Wendling  virtual bool addInstSelector(PassManagerBase &, CodeGenOpt::Level) {
2691911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return true;
2701911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
271769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov
272629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// addPreRegAlloc - This method may be implemented by targets that want to
273629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// run passes immediately before register allocation. This should return
274769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov  /// true if -print-machineinstrs should print after these passes.
27598a366d547772010e94609e4584489b3e5ce0043Bill Wendling  virtual bool addPreRegAlloc(PassManagerBase &, CodeGenOpt::Level) {
276769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov    return false;
277769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov  }
278769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov
279629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// addPostRegAlloc - This method may be implemented by targets that want
280629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// to run passes after register allocation but before prolog-epilog
2811911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// insertion.  This should return true if -print-machineinstrs should print
2821911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// after these passes.
28398a366d547772010e94609e4584489b3e5ce0043Bill Wendling  virtual bool addPostRegAlloc(PassManagerBase &, CodeGenOpt::Level) {
2841911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return false;
2851911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
286629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng
287629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// addPreSched2 - This method may be implemented by targets that want to
288629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// run passes after prolog-epilog insertion and before the second instruction
289629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// scheduling pass.  This should return true if -print-machineinstrs should
290629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  /// print after these passes.
291629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  virtual bool addPreSched2(PassManagerBase &, CodeGenOpt::Level) {
292629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng    return false;
293629adde69953fa53362d20ddb7b4e67ed78b8ae3Evan Cheng  }
2941911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
2951911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addPreEmitPass - This pass may be implemented by targets that want to run
2961911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// passes immediately before machine code is emitted.  This should return
2971911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// true if -print-machineinstrs should print out the code after the passes.
29898a366d547772010e94609e4584489b3e5ce0043Bill Wendling  virtual bool addPreEmitPass(PassManagerBase &, CodeGenOpt::Level) {
2991911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return false;
3001911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3011911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3021911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
3031911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// addCodeEmitter - This pass should be overridden by the target to add a
3041911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  /// code emitter, if supported.  If this is not supported, 'true' should be
305cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar  /// returned.
30698a366d547772010e94609e4584489b3e5ce0043Bill Wendling  virtual bool addCodeEmitter(PassManagerBase &, CodeGenOpt::Level,
307cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar                              JITCodeEmitter &) {
308a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes    return true;
309a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  }
310a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
311e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen  /// getEnableTailMergeDefault - the default setting for -enable-tail-merge
31281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  /// on this target.  User flag overrides.
31350cdabcfd52e88381ade61450d98a1c757195befDan Gohman  virtual bool getEnableTailMergeDefault() const { return true; }
314a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve};
315a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
316d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
317d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
318a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif
319