]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/Target/TargetOptions.h
Merge ^/head r326936 through r327149.
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / Target / TargetOptions.h
1 //===-- llvm/Target/TargetOptions.h - Target Options ------------*- 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 command line option flags that are shared across various
11 // targets.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_TARGET_TARGETOPTIONS_H
16 #define LLVM_TARGET_TARGETOPTIONS_H
17
18 #include "llvm/MC/MCTargetOptions.h"
19
20 namespace llvm {
21   class MachineFunction;
22   class Module;
23
24   namespace FloatABI {
25     enum ABIType {
26       Default, // Target-specific (either soft or hard depending on triple, etc).
27       Soft,    // Soft float.
28       Hard     // Hard float.
29     };
30   }
31
32   namespace FPOpFusion {
33     enum FPOpFusionMode {
34       Fast,     // Enable fusion of FP ops wherever it's profitable.
35       Standard, // Only allow fusion of 'blessed' ops (currently just fmuladd).
36       Strict    // Never fuse FP-ops.
37     };
38   }
39
40   namespace JumpTable {
41     enum JumpTableType {
42       Single,          // Use a single table for all indirect jumptable calls.
43       Arity,           // Use one table per number of function parameters.
44       Simplified,      // Use one table per function type, with types projected
45                        // into 4 types: pointer to non-function, struct,
46                        // primitive, and function pointer.
47       Full             // Use one table per unique function type
48     };
49   }
50
51   namespace ThreadModel {
52     enum Model {
53       POSIX,  // POSIX Threads
54       Single  // Single Threaded Environment
55     };
56   }
57
58   namespace FPDenormal {
59     enum DenormalMode {
60       IEEE,           // IEEE 754 denormal numbers
61       PreserveSign,   // the sign of a flushed-to-zero number is preserved in
62                       // the sign of 0
63       PositiveZero    // denormals are flushed to positive zero
64     };
65   }
66
67   enum class EABI {
68     Unknown,
69     Default, // Default means not specified
70     EABI4,   // Target-specific (either 4, 5 or gnu depending on triple).
71     EABI5,
72     GNU
73   };
74
75   /// Identify a debugger for "tuning" the debug info.
76   ///
77   /// The "debugger tuning" concept allows us to present a more intuitive
78   /// interface that unpacks into different sets of defaults for the various
79   /// individual feature-flag settings, that suit the preferences of the
80   /// various debuggers.  However, it's worth remembering that debuggers are
81   /// not the only consumers of debug info, and some variations in DWARF might
82   /// better be treated as target/platform issues. Fundamentally,
83   /// o if the feature is useful (or not) to a particular debugger, regardless
84   ///   of the target, that's a tuning decision;
85   /// o if the feature is useful (or not) on a particular platform, regardless
86   ///   of the debugger, that's a target decision.
87   /// It's not impossible to see both factors in some specific case.
88   ///
89   /// The "tuning" should be used to set defaults for individual feature flags
90   /// in DwarfDebug; if a given feature has a more specific command-line option,
91   /// that option should take precedence over the tuning.
92   enum class DebuggerKind {
93     Default,  // No specific tuning requested.
94     GDB,      // Tune debug info for gdb.
95     LLDB,     // Tune debug info for lldb.
96     SCE       // Tune debug info for SCE targets (e.g. PS4).
97   };
98
99   class TargetOptions {
100   public:
101     TargetOptions()
102         : PrintMachineCode(false), UnsafeFPMath(false), NoInfsFPMath(false),
103           NoNaNsFPMath(false), NoTrappingFPMath(false),
104           NoSignedZerosFPMath(false),
105           HonorSignDependentRoundingFPMathOption(false), NoZerosInBSS(false),
106           GuaranteedTailCallOpt(false), StackSymbolOrdering(true),
107           EnableFastISel(false), UseInitArray(false),
108           DisableIntegratedAS(false), RelaxELFRelocations(false),
109           FunctionSections(false), DataSections(false),
110           UniqueSectionNames(true), TrapUnreachable(false), EmulatedTLS(false),
111           EnableIPRA(false), EmitStackSizeSection(false) {}
112
113     /// PrintMachineCode - This flag is enabled when the -print-machineinstrs
114     /// option is specified on the command line, and should enable debugging
115     /// output from the code generator.
116     unsigned PrintMachineCode : 1;
117
118     /// DisableFramePointerElim - This returns true if frame pointer elimination
119     /// optimization should be disabled for the given machine function.
120     bool DisableFramePointerElim(const MachineFunction &MF) const;
121
122     /// UnsafeFPMath - This flag is enabled when the
123     /// -enable-unsafe-fp-math flag is specified on the command line.  When
124     /// this flag is off (the default), the code generator is not allowed to
125     /// produce results that are "less precise" than IEEE allows.  This includes
126     /// use of X86 instructions like FSIN and FCOS instead of libcalls.
127     unsigned UnsafeFPMath : 1;
128
129     /// NoInfsFPMath - This flag is enabled when the
130     /// -enable-no-infs-fp-math flag is specified on the command line. When
131     /// this flag is off (the default), the code generator is not allowed to
132     /// assume the FP arithmetic arguments and results are never +-Infs.
133     unsigned NoInfsFPMath : 1;
134
135     /// NoNaNsFPMath - This flag is enabled when the
136     /// -enable-no-nans-fp-math flag is specified on the command line. When
137     /// this flag is off (the default), the code generator is not allowed to
138     /// assume the FP arithmetic arguments and results are never NaNs.
139     unsigned NoNaNsFPMath : 1;
140
141     /// NoTrappingFPMath - This flag is enabled when the
142     /// -enable-no-trapping-fp-math is specified on the command line. This
143     /// specifies that there are no trap handlers to handle exceptions.
144     unsigned NoTrappingFPMath : 1;
145
146     /// NoSignedZerosFPMath - This flag is enabled when the
147     /// -enable-no-signed-zeros-fp-math is specified on the command line. This
148     /// specifies that optimizations are allowed to treat the sign of a zero
149     /// argument or result as insignificant.
150     unsigned NoSignedZerosFPMath : 1;
151
152     /// HonorSignDependentRoundingFPMath - This returns true when the
153     /// -enable-sign-dependent-rounding-fp-math is specified.  If this returns
154     /// false (the default), the code generator is allowed to assume that the
155     /// rounding behavior is the default (round-to-zero for all floating point
156     /// to integer conversions, and round-to-nearest for all other arithmetic
157     /// truncations).  If this is enabled (set to true), the code generator must
158     /// assume that the rounding mode may dynamically change.
159     unsigned HonorSignDependentRoundingFPMathOption : 1;
160     bool HonorSignDependentRoundingFPMath() const;
161
162     /// NoZerosInBSS - By default some codegens place zero-initialized data to
163     /// .bss section. This flag disables such behaviour (necessary, e.g. for
164     /// crt*.o compiling).
165     unsigned NoZerosInBSS : 1;
166
167     /// GuaranteedTailCallOpt - This flag is enabled when -tailcallopt is
168     /// specified on the commandline. When the flag is on, participating targets
169     /// will perform tail call optimization on all calls which use the fastcc
170     /// calling convention and which satisfy certain target-independent
171     /// criteria (being at the end of a function, having the same return type
172     /// as their parent function, etc.), using an alternate ABI if necessary.
173     unsigned GuaranteedTailCallOpt : 1;
174
175     /// StackAlignmentOverride - Override default stack alignment for target.
176     unsigned StackAlignmentOverride = 0;
177
178     /// StackSymbolOrdering - When true, this will allow CodeGen to order
179     /// the local stack symbols (for code size, code locality, or any other
180     /// heuristics). When false, the local symbols are left in whatever order
181     /// they were generated. Default is true.
182     unsigned StackSymbolOrdering : 1;
183
184     /// EnableFastISel - This flag enables fast-path instruction selection
185     /// which trades away generated code quality in favor of reducing
186     /// compile time.
187     unsigned EnableFastISel : 1;
188
189     /// UseInitArray - Use .init_array instead of .ctors for static
190     /// constructors.
191     unsigned UseInitArray : 1;
192
193     /// Disable the integrated assembler.
194     unsigned DisableIntegratedAS : 1;
195
196     /// Compress DWARF debug sections.
197     DebugCompressionType CompressDebugSections = DebugCompressionType::None;
198
199     unsigned RelaxELFRelocations : 1;
200
201     /// Emit functions into separate sections.
202     unsigned FunctionSections : 1;
203
204     /// Emit data into separate sections.
205     unsigned DataSections : 1;
206
207     unsigned UniqueSectionNames : 1;
208
209     /// Emit target-specific trap instruction for 'unreachable' IR instructions.
210     unsigned TrapUnreachable : 1;
211
212     /// EmulatedTLS - This flag enables emulated TLS model, using emutls
213     /// function in the runtime library..
214     unsigned EmulatedTLS : 1;
215
216     /// This flag enables InterProcedural Register Allocation (IPRA).
217     unsigned EnableIPRA : 1;
218
219     /// Emit section containing metadata on function stack sizes.
220     unsigned EmitStackSizeSection : 1;
221
222     /// FloatABIType - This setting is set by -float-abi=xxx option is specfied
223     /// on the command line. This setting may either be Default, Soft, or Hard.
224     /// Default selects the target's default behavior. Soft selects the ABI for
225     /// software floating point, but does not indicate that FP hardware may not
226     /// be used. Such a combination is unfortunately popular (e.g.
227     /// arm-apple-darwin). Hard presumes that the normal FP ABI is used.
228     FloatABI::ABIType FloatABIType = FloatABI::Default;
229
230     /// AllowFPOpFusion - This flag is set by the -fuse-fp-ops=xxx option.
231     /// This controls the creation of fused FP ops that store intermediate
232     /// results in higher precision than IEEE allows (E.g. FMAs).
233     ///
234     /// Fast mode - allows formation of fused FP ops whenever they're
235     /// profitable.
236     /// Standard mode - allow fusion only for 'blessed' FP ops. At present the
237     /// only blessed op is the fmuladd intrinsic. In the future more blessed ops
238     /// may be added.
239     /// Strict mode - allow fusion only if/when it can be proven that the excess
240     /// precision won't effect the result.
241     ///
242     /// Note: This option only controls formation of fused ops by the
243     /// optimizers.  Fused operations that are explicitly specified (e.g. FMA
244     /// via the llvm.fma.* intrinsic) will always be honored, regardless of
245     /// the value of this option.
246     FPOpFusion::FPOpFusionMode AllowFPOpFusion = FPOpFusion::Standard;
247
248     /// ThreadModel - This flag specifies the type of threading model to assume
249     /// for things like atomics
250     ThreadModel::Model ThreadModel = ThreadModel::POSIX;
251
252     /// EABIVersion - This flag specifies the EABI version
253     EABI EABIVersion = EABI::Default;
254
255     /// Which debugger to tune for.
256     DebuggerKind DebuggerTuning = DebuggerKind::Default;
257
258     /// FPDenormalMode - This flags specificies which denormal numbers the code
259     /// is permitted to require.
260     FPDenormal::DenormalMode FPDenormalMode = FPDenormal::IEEE;
261
262     /// What exception model to use
263     ExceptionHandling ExceptionModel = ExceptionHandling::None;
264
265     /// Machine level options.
266     MCTargetOptions MCOptions;
267   };
268
269 } // End llvm namespace
270
271 #endif