TargetMachine.h revision d24479730a8790d82c4859dc477bc2416d7a6bda
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===//
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                     The LLVM Compiler Infrastructure
483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius//
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file is distributed under the University of Illinois Open Source
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// License. See LICENSE.TXT for details.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===//
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file defines the TargetMachine and LLVMTargetMachine classes.
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===//
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef LLVM_TARGET_TARGETMACHINE_H
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LLVM_TARGET_TARGETMACHINE_H
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "llvm/Target/TargetInstrItineraries.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <cassert>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace llvm {
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetAsmInfo;
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetData;
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetSubtarget;
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetInstrInfo;
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetIntrinsicInfo;
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetJITInfo;
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetLowering;
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass TargetFrameInfo;
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MachineCodeEmitter;
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetRegisterInfo;
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Module;
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass PassManagerBase;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass PassManager;
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Pass;
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetMachOWriterInfo;
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetELFWriterInfo;
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass raw_ostream;
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Relocation model types.
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace Reloc {
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  enum Model {
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Default,
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Static,
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    PIC_,         // Cannot be named PIC due to collision with -DPIC
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DynamicNoPIC
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Code model types.
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace CodeModel {
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  enum Model {
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Default,
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Small,
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Kernel,
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Medium,
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Large
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace FileModel {
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  enum Model {
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Error,
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    None,
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    AsmFile,
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MachOFile,
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ElfFile
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===//
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru///
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// TargetMachine - Primary interface to the complete machine description for
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// the target machine.  All target-specific information should be accessible
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// through this interface.
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru///
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TargetMachine {
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TargetMachine(const TargetMachine &);   // DO NOT IMPLEMENT
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void operator=(const TargetMachine &);  // DO NOT IMPLEMENT
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: // Can only create subclasses.
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TargetMachine() : AsmInfo(0) { }
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getSubtargetImpl - virtual method implemented by subclasses that returns
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// a reference to that target's TargetSubtarget-derived member variable.
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetSubtarget *getSubtargetImpl() const { return 0; }
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// AsmInfo - Contains target specific asm information.
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  mutable const TargetAsmInfo *AsmInfo;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// createTargetAsmInfo - Create a new instance of target specific asm
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// information.
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetAsmInfo *createTargetAsmInfo() const { return 0; }
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual ~TargetMachine();
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getModuleMatchQuality - This static method should be implemented by
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// targets to indicate how closely they match the specified module.  This is
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// used by the LLC tool to determine which target to use when an explicit
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// -march option is not specified.  If a target returns zero, it will never
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// be chosen without an explicit -march option.
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static unsigned getModuleMatchQuality(const Module &) { return 0; }
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getJITMatchQuality - This static method should be implemented by targets
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// that provide JIT capabilities to indicate how suitable they are for
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// execution on the current host.  If a value of 0 is returned, the target
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// will not be used unless an explicit -march option is used.
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static unsigned getJITMatchQuality() { return 0; }
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Interfaces to the major aspects of target machine information:
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // -- Instruction opcode and operand information
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // -- Pipelines and scheduling information
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // -- Stack frame information
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // -- Selection DAG lowering information
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetInstrInfo        *getInstrInfo() const { return 0; }
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetFrameInfo        *getFrameInfo() const { return 0; }
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual       TargetLowering    *getTargetLowering() const { return 0; }
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetData            *getTargetData() const { return 0; }
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getTargetAsmInfo - Return target specific asm information.
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const TargetAsmInfo *getTargetAsmInfo() const {
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!AsmInfo) AsmInfo = createTargetAsmInfo();
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return AsmInfo;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getSubtarget - This method returns a pointer to the specified type of
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// TargetSubtarget.  In debug builds, it verifies that the object being
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// returned is of the correct type.
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  template<typename STC> const STC &getSubtarget() const {
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const TargetSubtarget *TST = getSubtargetImpl();
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(TST && dynamic_cast<const STC*>(TST) &&
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "Not the right kind of subtarget!");
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *static_cast<const STC*>(TST);
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getRegisterInfo - If register information is available, return it.  If
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// not, return null.  This is kept separate from RegInfo until RegInfo has
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// details of graph coloring register allocation removed from it.
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; }
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getIntrinsicInfo - If intrinsic information is available, return it.  If
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// not, return null.
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; }
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getJITInfo - If this target supports a JIT, return information for it,
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// otherwise return null.
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual TargetJITInfo *getJITInfo() { return 0; }
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getInstrItineraryData - Returns instruction itinerary data for the target
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// or specific subtarget.
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const InstrItineraryData getInstrItineraryData() const {
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return InstrItineraryData();
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getMachOWriterInfo - If this target supports a Mach-O writer, return
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// information for it, otherwise return null.
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetMachOWriterInfo *getMachOWriterInfo() const { return 0; }
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getELFWriterInfo - If this target supports an ELF writer, return
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// information for it, otherwise return null.
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; }
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getRelocationModel - Returns the code generation relocation model. The
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// choices are static, PIC, and dynamic-no-pic, and target default.
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static Reloc::Model getRelocationModel();
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// setRelocationModel - Sets the code generation relocation model.
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static void setRelocationModel(Reloc::Model Model);
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getCodeModel - Returns the code model. The choices are small, kernel,
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// medium, large, and target default.
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static CodeModel::Model getCodeModel();
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// setCodeModel - Sets the code model.
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static void setCodeModel(CodeModel::Model Model);
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// CodeGenFileType - These enums are meant to be passed into
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitFile to indicate what type of file to emit.
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  enum CodeGenFileType {
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    AssemblyFile, ObjectFile, DynamicLibrary
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getEnableTailMergeDefault - the default setting for -enable-tail-merge
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// on this target.  User flag overrides.
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool getEnableTailMergeDefault() const { return true; }
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitFile - Add passes to the specified pass manager to get the
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// specified file emitted.  Typically this will involve several steps of code
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// generation.  If Fast is set to true, the code generator should emit code
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// as fast as possible, though the generated code may be less efficient.
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// This method should return FileModel::Error if emission of this file type
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// is not supported.
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual FileModel::Model addPassesToEmitFile(PassManagerBase &,
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                               raw_ostream &,
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                               CodeGenFileType,
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                               bool /*Fast*/) {
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FileModel::None;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitFileFinish - If the passes to emit the specified file had
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// to be split up (e.g., to add an object writer pass), this method can be
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// used to finish up adding passes to emit the file, if necessary.
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPassesToEmitFileFinish(PassManagerBase &,
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                         MachineCodeEmitter *, bool /*Fast*/) {
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// actually outputting the machine code and resolving things like the address
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// of functions.  This method returns true if machine code emission is
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// not supported.
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPassesToEmitMachineCode(PassManagerBase &,
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          MachineCodeEmitter &,
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          bool /*Fast*/) {
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitWholeFile - This method can be implemented by targets that
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// require having the entire module at once.  This is not recommended, do not
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// use this.
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool WantsWholeFile() const { return false; }
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPassesToEmitWholeFile(PassManager &, raw_ostream &,
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        CodeGenFileType, bool /*Fast*/) {
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// LLVMTargetMachine - This class describes a target machine that is
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// implemented with the LLVM target-independent code generator.
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru///
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LLVMTargetMachine : public TargetMachine {
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: // Can only create subclasses.
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LLVMTargetMachine() { }
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// both emitting to assembly files or machine code output.
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  bool addCommonCodeGenPasses(PassManagerBase &, bool /*Fast*/);
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitFile - Add passes to the specified pass manager to get the
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// specified file emitted.  Typically this will involve several steps of code
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// generation.  If Fast is set to true, the code generator should emit code
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// as fast as possible, though the generated code may be less efficient.
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// This method should return FileModel::Error if emission of this file type
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// is not supported.
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// The default implementation of this method adds components from the
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// LLVM retargetable code generator, invoking the methods below to get
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// target-specific passes in standard locations.
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual FileModel::Model addPassesToEmitFile(PassManagerBase &PM,
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                               raw_ostream &Out,
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                               CodeGenFileType FileType,
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                               bool Fast);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitFileFinish - If the passes to emit the specified file had
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// to be split up (e.g., to add an object writer pass), this method can be
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// used to finish up adding passes to emit the file, if necessary.
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPassesToEmitFileFinish(PassManagerBase &PM,
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                         MachineCodeEmitter *MCE, bool Fast);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// actually outputting the machine code and resolving things like the address
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// of functions.  This method returns true if machine code emission is
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// not supported.
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ///
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPassesToEmitMachineCode(PassManagerBase &PM,
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          MachineCodeEmitter &MCE, bool Fast);
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// Target-Independent Code Generator Pass Configuration Options.
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addInstSelector - This method should add any "last minute" LLVM->LLVM
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// passes, then install an instruction selector pass, which converts from
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// LLVM code to machine instructions.
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addInstSelector(PassManagerBase &, bool /*Fast*/) {
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPreRegAllocPasses - This method may be implemented by targets that want
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// to run passes immediately before register allocation. This should return
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// true if -print-machineinstrs should print after these passes.
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPreRegAlloc(PassManagerBase &, bool /*Fast*/) {
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return false;
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPostRegAllocPasses - This method may be implemented by targets that
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// want to run passes after register allocation but before prolog-epilog
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// insertion.  This should return true if -print-machineinstrs should print
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// after these passes.
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPostRegAlloc(PassManagerBase &, bool /*Fast*/) {
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return false;
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addPreEmitPass - This pass may be implemented by targets that want to run
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// passes immediately before machine code is emitted.  This should return
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// true if -print-machineinstrs should print out the code after the passes.
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addPreEmitPass(PassManagerBase &, bool /*Fast*/) {
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return false;
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addAssemblyEmitter - This pass should be overridden by the target to add
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// the asmprinter, if asm emission is supported.  If this is not supported,
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// 'true' should be returned.
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addAssemblyEmitter(PassManagerBase &, bool /*Fast*/,
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  raw_ostream &) {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addCodeEmitter - This pass should be overridden by the target to add a
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// code emitter, if supported.  If this is not supported, 'true' should be
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// returned. If DumpAsm is true, the generated assembly is printed to cerr.
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addCodeEmitter(PassManagerBase &, bool /*Fast*/,
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              bool /*DumpAsm*/, MachineCodeEmitter &) {
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// addSimpleCodeEmitter - This pass should be overridden by the target to add
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// a code emitter (without setting flags), if supported.  If this is not
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// supported, 'true' should be returned.  If DumpAsm is true, the generated
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// assembly is printed to cerr.
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool addSimpleCodeEmitter(PassManagerBase &, bool /*Fast*/,
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    bool /*DumpAsm*/, MachineCodeEmitter &) {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// getEnableTailMergeDefault - the default setting for -enable-tail-merge
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /// on this target.  User flag overrides.
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual bool getEnableTailMergeDefault() const { return true; }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} // End llvm namespace
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru