2004-07-11 06:15:52 +02:00
|
|
|
//===-- llvm/Target/TargetOptions.h - Target Options ------------*- C++ -*-===//
|
2005-04-21 22:59:05 +02:00
|
|
|
//
|
2004-07-11 06:15:52 +02:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 20:59:42 +01:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-04-21 22:59:05 +02:00
|
|
|
//
|
2004-07-11 06:15:52 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines command line option flags that are shared across various
|
|
|
|
// targets.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_TARGET_TARGETOPTIONS_H
|
|
|
|
#define LLVM_TARGET_TARGETOPTIONS_H
|
|
|
|
|
2014-04-23 13:16:03 +02:00
|
|
|
#include "llvm/MC/MCTargetOptions.h"
|
2011-12-02 23:16:29 +01:00
|
|
|
#include <string>
|
|
|
|
|
2004-07-11 06:15:52 +02:00
|
|
|
namespace llvm {
|
2010-04-21 05:18:23 +02:00
|
|
|
class MachineFunction;
|
2011-11-04 19:45:34 +01:00
|
|
|
class StringRef;
|
2010-04-21 05:18:23 +02:00
|
|
|
|
2009-08-02 06:08:52 +02:00
|
|
|
// Possible float ABI settings. Used with FloatABIType in TargetOptions.h.
|
|
|
|
namespace FloatABI {
|
|
|
|
enum ABIType {
|
2012-11-29 21:56:58 +01:00
|
|
|
Default, // Target-specific (either soft or hard depending on triple,etc).
|
2009-08-02 06:08:52 +02:00
|
|
|
Soft, // Soft float.
|
|
|
|
Hard // Hard float.
|
|
|
|
};
|
|
|
|
}
|
2011-12-02 23:16:29 +01:00
|
|
|
|
2012-06-22 03:09:09 +02:00
|
|
|
namespace FPOpFusion {
|
|
|
|
enum FPOpFusionMode {
|
|
|
|
Fast, // Enable fusion of FP ops wherever it's profitable.
|
|
|
|
Standard, // Only allow fusion of 'blessed' ops (currently just fmuladd).
|
|
|
|
Strict // Never fuse FP-ops.
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2014-06-05 21:29:43 +02:00
|
|
|
namespace JumpTable {
|
|
|
|
enum JumpTableType {
|
|
|
|
Single, // Use a single table for all indirect jumptable calls.
|
|
|
|
Arity, // Use one table per number of function parameters.
|
|
|
|
Simplified, // Use one table per function type, with types projected
|
|
|
|
// into 4 types: pointer to non-function, struct,
|
|
|
|
// primitive, and function pointer.
|
|
|
|
Full // Use one table per unique function type
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2011-12-02 23:16:29 +01:00
|
|
|
class TargetOptions {
|
|
|
|
public:
|
|
|
|
TargetOptions()
|
|
|
|
: PrintMachineCode(false), NoFramePointerElim(false),
|
2014-02-21 04:13:54 +01:00
|
|
|
LessPreciseFPMADOption(false), UnsafeFPMath(false),
|
|
|
|
NoInfsFPMath(false), NoNaNsFPMath(false),
|
|
|
|
HonorSignDependentRoundingFPMathOption(false), UseSoftFloat(false),
|
|
|
|
NoZerosInBSS(false), JITEmitDebugInfo(false),
|
|
|
|
JITEmitDebugInfoToDisk(false), GuaranteedTailCallOpt(false),
|
|
|
|
DisableTailCalls(false), StackAlignmentOverride(0),
|
2013-01-23 20:32:37 +01:00
|
|
|
EnableFastISel(false), PositionIndependentExecutable(false),
|
2014-05-20 23:25:34 +02:00
|
|
|
UseInitArray(false), DisableIntegratedAS(false),
|
|
|
|
CompressDebugSections(false), FunctionSections(false),
|
|
|
|
DataSections(false), TrapUnreachable(false), TrapFuncName(""),
|
|
|
|
FloatABIType(FloatABI::Default),
|
2014-06-05 21:29:43 +02:00
|
|
|
AllowFPOpFusion(FPOpFusion::Standard), JTType(JumpTable::Single) {}
|
2011-12-02 23:16:29 +01:00
|
|
|
|
|
|
|
/// PrintMachineCode - This flag is enabled when the -print-machineinstrs
|
|
|
|
/// option is specified on the command line, and should enable debugging
|
|
|
|
/// output from the code generator.
|
|
|
|
unsigned PrintMachineCode : 1;
|
|
|
|
|
|
|
|
/// NoFramePointerElim - This flag is enabled when the -disable-fp-elim is
|
|
|
|
/// specified on the command line. If the target supports the frame pointer
|
|
|
|
/// elimination optimization, this option should disable it.
|
|
|
|
unsigned NoFramePointerElim : 1;
|
|
|
|
|
|
|
|
/// DisableFramePointerElim - This returns true if frame pointer elimination
|
|
|
|
/// optimization should be disabled for the given machine function.
|
|
|
|
bool DisableFramePointerElim(const MachineFunction &MF) const;
|
|
|
|
|
|
|
|
/// LessPreciseFPMAD - This flag is enabled when the
|
|
|
|
/// -enable-fp-mad is specified on the command line. When this flag is off
|
|
|
|
/// (the default), the code generator is not allowed to generate mad
|
|
|
|
/// (multiply add) if the result is "less precise" than doing those
|
|
|
|
/// operations individually.
|
|
|
|
unsigned LessPreciseFPMADOption : 1;
|
|
|
|
bool LessPreciseFPMAD() const;
|
|
|
|
|
|
|
|
/// UnsafeFPMath - This flag is enabled when the
|
|
|
|
/// -enable-unsafe-fp-math flag is specified on the command line. When
|
|
|
|
/// this flag is off (the default), the code generator is not allowed to
|
|
|
|
/// produce results that are "less precise" than IEEE allows. This includes
|
|
|
|
/// use of X86 instructions like FSIN and FCOS instead of libcalls.
|
|
|
|
/// UnsafeFPMath implies LessPreciseFPMAD.
|
|
|
|
unsigned UnsafeFPMath : 1;
|
|
|
|
|
|
|
|
/// NoInfsFPMath - This flag is enabled when the
|
|
|
|
/// -enable-no-infs-fp-math flag is specified on the command line. When
|
|
|
|
/// this flag is off (the default), the code generator is not allowed to
|
|
|
|
/// assume the FP arithmetic arguments and results are never +-Infs.
|
|
|
|
unsigned NoInfsFPMath : 1;
|
|
|
|
|
|
|
|
/// NoNaNsFPMath - This flag is enabled when the
|
|
|
|
/// -enable-no-nans-fp-math flag is specified on the command line. When
|
|
|
|
/// this flag is off (the default), the code generator is not allowed to
|
|
|
|
/// assume the FP arithmetic arguments and results are never NaNs.
|
|
|
|
unsigned NoNaNsFPMath : 1;
|
|
|
|
|
|
|
|
/// HonorSignDependentRoundingFPMath - This returns true when the
|
|
|
|
/// -enable-sign-dependent-rounding-fp-math is specified. If this returns
|
|
|
|
/// false (the default), the code generator is allowed to assume that the
|
|
|
|
/// rounding behavior is the default (round-to-zero for all floating point
|
|
|
|
/// to integer conversions, and round-to-nearest for all other arithmetic
|
|
|
|
/// truncations). If this is enabled (set to true), the code generator must
|
|
|
|
/// assume that the rounding mode may dynamically change.
|
|
|
|
unsigned HonorSignDependentRoundingFPMathOption : 1;
|
|
|
|
bool HonorSignDependentRoundingFPMath() const;
|
2012-01-13 07:30:25 +01:00
|
|
|
|
2011-12-02 23:16:29 +01:00
|
|
|
/// UseSoftFloat - This flag is enabled when the -soft-float flag is
|
|
|
|
/// specified on the command line. When this flag is on, the code generator
|
|
|
|
/// will generate libcalls to the software floating point library instead of
|
|
|
|
/// target FP instructions.
|
|
|
|
unsigned UseSoftFloat : 1;
|
|
|
|
|
|
|
|
/// NoZerosInBSS - By default some codegens place zero-initialized data to
|
|
|
|
/// .bss section. This flag disables such behaviour (necessary, e.g. for
|
|
|
|
/// crt*.o compiling).
|
|
|
|
unsigned NoZerosInBSS : 1;
|
|
|
|
|
|
|
|
/// JITEmitDebugInfo - This flag indicates that the JIT should try to emit
|
|
|
|
/// debug information and notify a debugger about it.
|
|
|
|
unsigned JITEmitDebugInfo : 1;
|
|
|
|
|
|
|
|
/// JITEmitDebugInfoToDisk - This flag indicates that the JIT should write
|
|
|
|
/// the object files generated by the JITEmitDebugInfo flag to disk. This
|
|
|
|
/// flag is hidden and is only for debugging the debug info.
|
|
|
|
unsigned JITEmitDebugInfoToDisk : 1;
|
|
|
|
|
|
|
|
/// GuaranteedTailCallOpt - This flag is enabled when -tailcallopt is
|
|
|
|
/// specified on the commandline. When the flag is on, participating targets
|
|
|
|
/// will perform tail call optimization on all calls which use the fastcc
|
|
|
|
/// calling convention and which satisfy certain target-independent
|
|
|
|
/// criteria (being at the end of a function, having the same return type
|
|
|
|
/// as their parent function, etc.), using an alternate ABI if necessary.
|
|
|
|
unsigned GuaranteedTailCallOpt : 1;
|
|
|
|
|
2012-01-19 01:34:10 +01:00
|
|
|
/// DisableTailCalls - This flag controls whether we will use tail calls.
|
|
|
|
/// Disabling them may be useful to maintain a correct call stack.
|
|
|
|
unsigned DisableTailCalls : 1;
|
|
|
|
|
2011-12-02 23:16:29 +01:00
|
|
|
/// StackAlignmentOverride - Override default stack alignment for target.
|
|
|
|
unsigned StackAlignmentOverride;
|
|
|
|
|
|
|
|
/// EnableFastISel - This flag enables fast-path instruction selection
|
|
|
|
/// which trades away generated code quality in favor of reducing
|
|
|
|
/// compile time.
|
|
|
|
unsigned EnableFastISel : 1;
|
2012-01-13 07:30:25 +01:00
|
|
|
|
2012-04-08 19:51:45 +02:00
|
|
|
/// PositionIndependentExecutable - This flag indicates whether the code
|
|
|
|
/// will eventually be linked into a single executable, despite the PIC
|
|
|
|
/// relocation model being in use. It's value is undefined (and irrelevant)
|
|
|
|
/// if the relocation model is anything other than PIC.
|
|
|
|
unsigned PositionIndependentExecutable : 1;
|
|
|
|
|
2012-06-19 02:48:28 +02:00
|
|
|
/// UseInitArray - Use .init_array instead of .ctors for static
|
|
|
|
/// constructors.
|
|
|
|
unsigned UseInitArray : 1;
|
|
|
|
|
2014-02-21 04:13:54 +01:00
|
|
|
/// Disable the integrated assembler.
|
|
|
|
unsigned DisableIntegratedAS : 1;
|
|
|
|
|
2014-03-27 21:45:41 +01:00
|
|
|
/// Compress DWARF debug sections.
|
|
|
|
unsigned CompressDebugSections : 1;
|
|
|
|
|
2014-05-20 23:25:34 +02:00
|
|
|
/// Emit functions into separate sections.
|
|
|
|
unsigned FunctionSections : 1;
|
|
|
|
|
|
|
|
/// Emit data into separate sections.
|
|
|
|
unsigned DataSections : 1;
|
|
|
|
|
2014-04-19 15:47:43 +02:00
|
|
|
/// Emit target-specific trap instruction for 'unreachable' IR instructions.
|
|
|
|
unsigned TrapUnreachable : 1;
|
|
|
|
|
2011-12-02 23:16:29 +01:00
|
|
|
/// getTrapFunctionName - If this returns a non-empty string, this means
|
|
|
|
/// isel should lower Intrinsic::trap to a call to the specified function
|
|
|
|
/// name instead of an ISD::TRAP node.
|
|
|
|
std::string TrapFuncName;
|
|
|
|
StringRef getTrapFunctionName() const;
|
|
|
|
|
|
|
|
/// FloatABIType - This setting is set by -float-abi=xxx option is specfied
|
|
|
|
/// on the command line. This setting may either be Default, Soft, or Hard.
|
|
|
|
/// Default selects the target's default behavior. Soft selects the ABI for
|
|
|
|
/// UseSoftFloat, but does not indicate that FP hardware may not be used.
|
|
|
|
/// Such a combination is unfortunately popular (e.g. arm-apple-darwin).
|
|
|
|
/// Hard presumes that the normal FP ABI is used.
|
|
|
|
FloatABI::ABIType FloatABIType;
|
2012-06-22 03:09:09 +02:00
|
|
|
|
|
|
|
/// AllowFPOpFusion - This flag is set by the -fuse-fp-ops=xxx option.
|
|
|
|
/// This controls the creation of fused FP ops that store intermediate
|
|
|
|
/// results in higher precision than IEEE allows (E.g. FMAs).
|
|
|
|
///
|
|
|
|
/// Fast mode - allows formation of fused FP ops whenever they're
|
|
|
|
/// profitable.
|
|
|
|
/// Standard mode - allow fusion only for 'blessed' FP ops. At present the
|
|
|
|
/// only blessed op is the fmuladd intrinsic. In the future more blessed ops
|
|
|
|
/// may be added.
|
|
|
|
/// Strict mode - allow fusion only if/when it can be proven that the excess
|
|
|
|
/// precision won't effect the result.
|
|
|
|
///
|
2012-11-29 21:56:58 +01:00
|
|
|
/// Note: This option only controls formation of fused ops by the
|
|
|
|
/// optimizers. Fused operations that are explicitly specified (e.g. FMA
|
|
|
|
/// via the llvm.fma.* intrinsic) will always be honored, regardless of
|
2012-11-29 21:58:08 +01:00
|
|
|
/// the value of this option.
|
2012-06-22 03:09:09 +02:00
|
|
|
FPOpFusion::FPOpFusionMode AllowFPOpFusion;
|
2014-04-23 13:16:03 +02:00
|
|
|
|
2014-06-05 21:29:43 +02:00
|
|
|
/// JTType - This flag specifies the type of jump-instruction table to
|
|
|
|
/// create for functions that have the jumptable attribute.
|
|
|
|
JumpTable::JumpTableType JTType;
|
|
|
|
|
2014-04-23 13:16:03 +02:00
|
|
|
/// Machine level options.
|
|
|
|
MCTargetOptions MCOptions;
|
2011-12-02 23:16:29 +01:00
|
|
|
};
|
2013-06-20 00:09:25 +02:00
|
|
|
|
|
|
|
// Comparison operators:
|
|
|
|
|
|
|
|
|
2013-06-20 08:51:06 +02:00
|
|
|
inline bool operator==(const TargetOptions &LHS,
|
|
|
|
const TargetOptions &RHS) {
|
2013-06-20 00:16:11 +02:00
|
|
|
#define ARE_EQUAL(X) LHS.X == RHS.X
|
|
|
|
return
|
|
|
|
ARE_EQUAL(UnsafeFPMath) &&
|
|
|
|
ARE_EQUAL(NoInfsFPMath) &&
|
|
|
|
ARE_EQUAL(NoNaNsFPMath) &&
|
|
|
|
ARE_EQUAL(HonorSignDependentRoundingFPMathOption) &&
|
|
|
|
ARE_EQUAL(UseSoftFloat) &&
|
|
|
|
ARE_EQUAL(NoZerosInBSS) &&
|
|
|
|
ARE_EQUAL(JITEmitDebugInfo) &&
|
|
|
|
ARE_EQUAL(JITEmitDebugInfoToDisk) &&
|
|
|
|
ARE_EQUAL(GuaranteedTailCallOpt) &&
|
|
|
|
ARE_EQUAL(DisableTailCalls) &&
|
|
|
|
ARE_EQUAL(StackAlignmentOverride) &&
|
|
|
|
ARE_EQUAL(EnableFastISel) &&
|
|
|
|
ARE_EQUAL(PositionIndependentExecutable) &&
|
|
|
|
ARE_EQUAL(UseInitArray) &&
|
2014-04-19 15:47:43 +02:00
|
|
|
ARE_EQUAL(TrapUnreachable) &&
|
2013-06-20 00:16:11 +02:00
|
|
|
ARE_EQUAL(TrapFuncName) &&
|
|
|
|
ARE_EQUAL(FloatABIType) &&
|
2014-04-23 13:16:03 +02:00
|
|
|
ARE_EQUAL(AllowFPOpFusion) &&
|
|
|
|
ARE_EQUAL(MCOptions);
|
2013-06-20 00:16:11 +02:00
|
|
|
#undef ARE_EQUAL
|
|
|
|
}
|
|
|
|
|
2013-06-20 08:51:06 +02:00
|
|
|
inline bool operator!=(const TargetOptions &LHS,
|
|
|
|
const TargetOptions &RHS) {
|
2013-06-20 00:09:25 +02:00
|
|
|
return !(LHS == RHS);
|
|
|
|
}
|
|
|
|
|
2004-07-11 06:15:52 +02:00
|
|
|
} // End llvm namespace
|
|
|
|
|
|
|
|
#endif
|