Move the TLSModel information into the TargetMachine rather than hiding
[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/Support/CodeGen.h"
18 #include "llvm/Target/TargetOptions.h"
19 #include "llvm/ADT/StringRef.h"
20 #include <cassert>
21 #include <string>
22
23 namespace llvm {
24
25 class InstrItineraryData;
26 class JITCodeEmitter;
27 class GlobalValue;
28 class MCAsmInfo;
29 class MCCodeGenInfo;
30 class MCContext;
31 class PassManagerBase;
32 class Target;
33 class TargetData;
34 class TargetELFWriterInfo;
35 class TargetFrameLowering;
36 class TargetInstrInfo;
37 class TargetIntrinsicInfo;
38 class TargetJITInfo;
39 class TargetLowering;
40 class TargetPassConfig;
41 class TargetRegisterInfo;
42 class TargetSelectionDAGInfo;
43 class TargetSubtargetInfo;
44 class formatted_raw_ostream;
45 class raw_ostream;
46
47 //===----------------------------------------------------------------------===//
48 ///
49 /// TargetMachine - Primary interface to the complete machine description for
50 /// the target machine.  All target-specific information should be accessible
51 /// through this interface.
52 ///
53 class TargetMachine {
54   TargetMachine(const TargetMachine &);   // DO NOT IMPLEMENT
55   void operator=(const TargetMachine &);  // DO NOT IMPLEMENT
56 protected: // Can only create subclasses.
57   TargetMachine(const Target &T, StringRef TargetTriple,
58                 StringRef CPU, StringRef FS, const TargetOptions &Options);
59
60   /// getSubtargetImpl - virtual method implemented by subclasses that returns
61   /// a reference to that target's TargetSubtargetInfo-derived member variable.
62   virtual const TargetSubtargetInfo *getSubtargetImpl() const { return 0; }
63
64   /// TheTarget - The Target that this machine was created for.
65   const Target &TheTarget;
66
67   /// TargetTriple, TargetCPU, TargetFS - Triple string, CPU name, and target
68   /// feature strings the TargetMachine instance is created with.
69   std::string TargetTriple;
70   std::string TargetCPU;
71   std::string TargetFS;
72
73   /// CodeGenInfo - Low level target information such as relocation model.
74   const MCCodeGenInfo *CodeGenInfo;
75
76   /// AsmInfo - Contains target specific asm information.
77   ///
78   const MCAsmInfo *AsmInfo;
79
80   unsigned MCRelaxAll : 1;
81   unsigned MCNoExecStack : 1;
82   unsigned MCSaveTempLabels : 1;
83   unsigned MCUseLoc : 1;
84   unsigned MCUseCFI : 1;
85   unsigned MCUseDwarfDirectory : 1;
86
87 public:
88   virtual ~TargetMachine();
89
90   const Target &getTarget() const { return TheTarget; }
91
92   const StringRef getTargetTriple() const { return TargetTriple; }
93   const StringRef getTargetCPU() const { return TargetCPU; }
94   const StringRef getTargetFeatureString() const { return TargetFS; }
95
96   TargetOptions Options;
97
98   // Interfaces to the major aspects of target machine information:
99   // -- Instruction opcode and operand information
100   // -- Pipelines and scheduling information
101   // -- Stack frame information
102   // -- Selection DAG lowering information
103   //
104   virtual const TargetInstrInfo         *getInstrInfo() const { return 0; }
105   virtual const TargetFrameLowering *getFrameLowering() const { return 0; }
106   virtual const TargetLowering    *getTargetLowering() const { return 0; }
107   virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const{ return 0; }
108   virtual const TargetData             *getTargetData() const { return 0; }
109
110   /// getMCAsmInfo - Return target specific asm information.
111   ///
112   const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; }
113
114   /// getSubtarget - This method returns a pointer to the specified type of
115   /// TargetSubtargetInfo.  In debug builds, it verifies that the object being
116   /// returned is of the correct type.
117   template<typename STC> const STC &getSubtarget() const {
118     return *static_cast<const STC*>(getSubtargetImpl());
119   }
120
121   /// getRegisterInfo - If register information is available, return it.  If
122   /// not, return null.  This is kept separate from RegInfo until RegInfo has
123   /// details of graph coloring register allocation removed from it.
124   ///
125   virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; }
126
127   /// getIntrinsicInfo - If intrinsic information is available, return it.  If
128   /// not, return null.
129   ///
130   virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; }
131
132   /// getJITInfo - If this target supports a JIT, return information for it,
133   /// otherwise return null.
134   ///
135   virtual TargetJITInfo *getJITInfo() { return 0; }
136
137   /// getInstrItineraryData - Returns instruction itinerary data for the target
138   /// or specific subtarget.
139   ///
140   virtual const InstrItineraryData *getInstrItineraryData() const {
141     return 0;
142   }
143
144   /// getELFWriterInfo - If this target supports an ELF writer, return
145   /// information for it, otherwise return null.
146   ///
147   virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; }
148
149   /// hasMCRelaxAll - Check whether all machine code instructions should be
150   /// relaxed.
151   bool hasMCRelaxAll() const { return MCRelaxAll; }
152
153   /// setMCRelaxAll - Set whether all machine code instructions should be
154   /// relaxed.
155   void setMCRelaxAll(bool Value) { MCRelaxAll = Value; }
156
157   /// hasMCSaveTempLabels - Check whether temporary labels will be preserved
158   /// (i.e., not treated as temporary).
159   bool hasMCSaveTempLabels() const { return MCSaveTempLabels; }
160
161   /// setMCSaveTempLabels - Set whether temporary labels will be preserved
162   /// (i.e., not treated as temporary).
163   void setMCSaveTempLabels(bool Value) { MCSaveTempLabels = Value; }
164
165   /// hasMCNoExecStack - Check whether an executable stack is not needed.
166   bool hasMCNoExecStack() const { return MCNoExecStack; }
167
168   /// setMCNoExecStack - Set whether an executabel stack is not needed.
169   void setMCNoExecStack(bool Value) { MCNoExecStack = Value; }
170
171   /// hasMCUseLoc - Check whether we should use dwarf's .loc directive.
172   bool hasMCUseLoc() const { return MCUseLoc; }
173
174   /// setMCUseLoc - Set whether all we should use dwarf's .loc directive.
175   void setMCUseLoc(bool Value) { MCUseLoc = Value; }
176
177   /// hasMCUseCFI - Check whether we should use dwarf's .cfi_* directives.
178   bool hasMCUseCFI() const { return MCUseCFI; }
179
180   /// setMCUseCFI - Set whether all we should use dwarf's .cfi_* directives.
181   void setMCUseCFI(bool Value) { MCUseCFI = Value; }
182
183   /// hasMCUseDwarfDirectory - Check whether we should use .file directives with
184   /// explicit directories.
185   bool hasMCUseDwarfDirectory() const { return MCUseDwarfDirectory; }
186
187   /// setMCUseDwarfDirectory - Set whether all we should use .file directives
188   /// with explicit directories.
189   void setMCUseDwarfDirectory(bool Value) { MCUseDwarfDirectory = Value; }
190
191   /// getRelocationModel - Returns the code generation relocation model. The
192   /// choices are static, PIC, and dynamic-no-pic, and target default.
193   Reloc::Model getRelocationModel() const;
194
195   /// getCodeModel - Returns the code model. The choices are small, kernel,
196   /// medium, large, and target default.
197   CodeModel::Model getCodeModel() const;
198
199   /// getTLSModel - Returns the TLS model which should be used for the given
200   /// global variable.
201   TLSModel::Model getTLSModel(const GlobalValue *GV) const;
202
203   /// getOptLevel - Returns the optimization level: None, Less,
204   /// Default, or Aggressive.
205   CodeGenOpt::Level getOptLevel() const;
206
207   void setFastISel(bool Enable) { Options.EnableFastISel = Enable; }
208
209   bool shouldPrintMachineCode() const { return Options.PrintMachineCode; }
210
211   /// getAsmVerbosityDefault - Returns the default value of asm verbosity.
212   ///
213   static bool getAsmVerbosityDefault();
214
215   /// setAsmVerbosityDefault - Set the default value of asm verbosity. Default
216   /// is false.
217   static void setAsmVerbosityDefault(bool);
218
219   /// getDataSections - Return true if data objects should be emitted into their
220   /// own section, corresponds to -fdata-sections.
221   static bool getDataSections();
222
223   /// getFunctionSections - Return true if functions should be emitted into
224   /// their own section, corresponding to -ffunction-sections.
225   static bool getFunctionSections();
226
227   /// setDataSections - Set if the data are emit into separate sections.
228   static void setDataSections(bool);
229
230   /// setFunctionSections - Set if the functions are emit into separate
231   /// sections.
232   static void setFunctionSections(bool);
233
234   /// CodeGenFileType - These enums are meant to be passed into
235   /// addPassesToEmitFile to indicate what type of file to emit, and returned by
236   /// it to indicate what type of file could actually be made.
237   enum CodeGenFileType {
238     CGFT_AssemblyFile,
239     CGFT_ObjectFile,
240     CGFT_Null         // Do not emit any output.
241   };
242
243   /// addPassesToEmitFile - Add passes to the specified pass manager to get the
244   /// specified file emitted.  Typically this will involve several steps of code
245   /// generation.  This method should return true if emission of this file type
246   /// is not supported, or false on success.
247   virtual bool addPassesToEmitFile(PassManagerBase &,
248                                    formatted_raw_ostream &,
249                                    CodeGenFileType,
250                                    bool /*DisableVerify*/ = true) {
251     return true;
252   }
253
254   /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
255   /// get machine code emitted.  This uses a JITCodeEmitter object to handle
256   /// actually outputting the machine code and resolving things like the address
257   /// of functions.  This method returns true if machine code emission is
258   /// not supported.
259   ///
260   virtual bool addPassesToEmitMachineCode(PassManagerBase &,
261                                           JITCodeEmitter &,
262                                           bool /*DisableVerify*/ = true) {
263     return true;
264   }
265
266   /// addPassesToEmitMC - Add passes to the specified pass manager to get
267   /// machine code emitted with the MCJIT. This method returns true if machine
268   /// code is not supported. It fills the MCContext Ctx pointer which can be
269   /// used to build custom MCStreamer.
270   ///
271   virtual bool addPassesToEmitMC(PassManagerBase &,
272                                  MCContext *&,
273                                  raw_ostream &,
274                                  bool /*DisableVerify*/ = true) {
275     return true;
276   }
277 };
278
279 /// LLVMTargetMachine - This class describes a target machine that is
280 /// implemented with the LLVM target-independent code generator.
281 ///
282 class LLVMTargetMachine : public TargetMachine {
283 protected: // Can only create subclasses.
284   LLVMTargetMachine(const Target &T, StringRef TargetTriple,
285                     StringRef CPU, StringRef FS, TargetOptions Options,
286                     Reloc::Model RM, CodeModel::Model CM,
287                     CodeGenOpt::Level OL);
288
289 public:
290   /// createPassConfig - Create a pass configuration object to be used by
291   /// addPassToEmitX methods for generating a pipeline of CodeGen passes.
292   virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
293
294   /// addPassesToEmitFile - Add passes to the specified pass manager to get the
295   /// specified file emitted.  Typically this will involve several steps of code
296   /// generation.
297   virtual bool addPassesToEmitFile(PassManagerBase &PM,
298                                    formatted_raw_ostream &Out,
299                                    CodeGenFileType FileType,
300                                    bool DisableVerify = true);
301
302   /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
303   /// get machine code emitted.  This uses a JITCodeEmitter object to handle
304   /// actually outputting the machine code and resolving things like the address
305   /// of functions.  This method returns true if machine code emission is
306   /// not supported.
307   ///
308   virtual bool addPassesToEmitMachineCode(PassManagerBase &PM,
309                                           JITCodeEmitter &MCE,
310                                           bool DisableVerify = true);
311
312   /// addPassesToEmitMC - Add passes to the specified pass manager to get
313   /// machine code emitted with the MCJIT. This method returns true if machine
314   /// code is not supported. It fills the MCContext Ctx pointer which can be
315   /// used to build custom MCStreamer.
316   ///
317   virtual bool addPassesToEmitMC(PassManagerBase &PM,
318                                  MCContext *&Ctx,
319                                  raw_ostream &OS,
320                                  bool DisableVerify = true);
321
322   /// addCodeEmitter - This pass should be overridden by the target to add a
323   /// code emitter, if supported.  If this is not supported, 'true' should be
324   /// returned.
325   virtual bool addCodeEmitter(PassManagerBase &,
326                               JITCodeEmitter &) {
327     return true;
328   }
329 };
330
331 } // End llvm namespace
332
333 #endif