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