-- | <http://llvm.org/doxygen/classllvm_1_1TargetOptions.html>
module LLVM.General.Target.Options where

import LLVM.General.Prelude

-- | <http://llvm.org/doxygen/namespacellvm_1_1FloatABI.html#aea077c52d84934aabf9445cef9eab2e2>
data FloatABI
  = FloatABIDefault
  | FloatABISoft
  | FloatABIHard
  deriving (Eq, Ord, Read, Show, Enum, Bounded, Typeable, Data)

-- | <http://llvm.org/doxygen/namespacellvm_1_1FPOpFusion.html#a9c71bae9f02af273833fde586d529fc5>
data FloatingPointOperationFusionMode
  = FloatingPointOperationFusionFast
  | FloatingPointOperationFusionStandard
  | FloatingPointOperationFusionStrict
  deriving (Eq, Ord, Read, Show, Enum, Bounded, Typeable, Data)

-- | The options of a 'LLVM.General.Target.TargetOptions'
-- <http://llvm.org/doxygen/classllvm_1_1TargetOptions.html>
data Options = Options {
  printMachineCode :: Bool,
  noFramePointerElimination :: Bool,
  lessPreciseFloatingPointMultiplyAddOption :: Bool,
  unsafeFloatingPointMath :: Bool,
  noInfinitiesFloatingPointMath :: Bool,
  noNaNsFloatingPointMath :: Bool,
  honorSignDependentRoundingFloatingPointMathOption :: Bool,
  useSoftFloat :: Bool,
  noZerosInBSS :: Bool,
  jITEmitDebugInfo :: Bool,
  jITEmitDebugInfoToDisk :: Bool,
  guaranteedTailCallOptimization :: Bool,
  disableTailCalls :: Bool,
  enableFastInstructionSelection :: Bool,
  positionIndependentExecutable :: Bool,
  useInitArray :: Bool,
  disableIntegratedAssembler :: Bool,
  compressDebugSections :: Bool,
  trapUnreachable :: Bool,
  stackAlignmentOverride :: Word32,
  trapFunctionName :: String,
  floatABIType :: FloatABI,
  allowFloatingPointOperationFusion :: FloatingPointOperationFusionMode
  }
  deriving (Eq, Ord, Read, Show)