//===-- llvm/Target/TargetOptions.h - Target Options ------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// This file defines command line option flags that are shared across various
 
// targets.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_TARGET_TARGETOPTIONS_H
 
#define LLVM_TARGET_TARGETOPTIONS_H
 
 
 
#include "llvm/ADT/FloatingPointMode.h"
 
#include "llvm/MC/MCTargetOptions.h"
 
 
 
#include <memory>
 
 
 
namespace llvm {
 
  struct fltSemantics;
 
  class MachineFunction;
 
  class MemoryBuffer;
 
 
 
  namespace FloatABI {
 
    enum ABIType {
 
      Default, // Target-specific (either soft or hard depending on triple, etc).
 
      Soft,    // Soft float.
 
      Hard     // Hard float.
 
    };
 
  }
 
 
 
  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.
 
    };
 
  }
 
 
 
  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
 
    };
 
  }
 
 
 
  namespace ThreadModel {
 
    enum Model {
 
      POSIX,  // POSIX Threads
 
      Single  // Single Threaded Environment
 
    };
 
  }
 
 
 
  enum class BasicBlockSection {
 
    All,    // Use Basic Block Sections for all basic blocks.  A section
 
            // for every basic block can significantly bloat object file sizes.
 
    List,   // Get list of functions & BBs from a file. Selectively enables
 
            // basic block sections for a subset of basic blocks which can be
 
            // used to control object size bloats from creating sections.
 
    Labels, // Do not use Basic Block Sections but label basic blocks.  This
 
            // is useful when associating profile counts from virtual addresses
 
            // to basic blocks.
 
    Preset, // Similar to list but the blocks are identified by passes which
 
            // seek to use Basic Block Sections, e.g. MachineFunctionSplitter.
 
            // This option cannot be set via the command line.
 
    None    // Do not use Basic Block Sections.
 
  };
 
 
 
  enum class EABI {
 
    Unknown,
 
    Default, // Default means not specified
 
    EABI4,   // Target-specific (either 4, 5 or gnu depending on triple).
 
    EABI5,
 
    GNU
 
  };
 
 
 
  /// Identify a debugger for "tuning" the debug info.
 
  ///
 
  /// The "debugger tuning" concept allows us to present a more intuitive
 
  /// interface that unpacks into different sets of defaults for the various
 
  /// individual feature-flag settings, that suit the preferences of the
 
  /// various debuggers.  However, it's worth remembering that debuggers are
 
  /// not the only consumers of debug info, and some variations in DWARF might
 
  /// better be treated as target/platform issues. Fundamentally,
 
  /// o if the feature is useful (or not) to a particular debugger, regardless
 
  ///   of the target, that's a tuning decision;
 
  /// o if the feature is useful (or not) on a particular platform, regardless
 
  ///   of the debugger, that's a target decision.
 
  /// It's not impossible to see both factors in some specific case.
 
  enum class DebuggerKind {
 
    Default, ///< No specific tuning requested.
 
    GDB,     ///< Tune debug info for gdb.
 
    LLDB,    ///< Tune debug info for lldb.
 
    SCE,     ///< Tune debug info for SCE targets (e.g. PS4).
 
    DBX      ///< Tune debug info for dbx.
 
  };
 
 
 
  /// Enable abort calls when global instruction selection fails to lower/select
 
  /// an instruction.
 
  enum class GlobalISelAbortMode {
 
    Disable,        // Disable the abort.
 
    Enable,         // Enable the abort.
 
    DisableWithDiag // Disable the abort but emit a diagnostic on failure.
 
  };
 
 
 
  /// Indicates when and how the Swift async frame pointer bit should be set.
 
  enum class SwiftAsyncFramePointerMode {
 
    /// Determine whether to set the bit statically or dynamically based
 
    /// on the deployment target.
 
    DeploymentBased,
 
    /// Always set the bit.
 
    Always,
 
    /// Never set the bit.
 
    Never,
 
  };
 
 
 
  class TargetOptions {
 
  public:
 
    TargetOptions()
 
        : UnsafeFPMath(false), NoInfsFPMath(false), NoNaNsFPMath(false),
 
          NoTrappingFPMath(true), NoSignedZerosFPMath(false),
 
          ApproxFuncFPMath(false), EnableAIXExtendedAltivecABI(false),
 
          HonorSignDependentRoundingFPMathOption(false), NoZerosInBSS(false),
 
          GuaranteedTailCallOpt(false), StackSymbolOrdering(true),
 
          EnableFastISel(false), EnableGlobalISel(false), UseInitArray(false),
 
          LowerGlobalDtorsViaCxaAtExit(false), DisableIntegratedAS(false),
 
          RelaxELFRelocations(true), FunctionSections(false),
 
          DataSections(false), IgnoreXCOFFVisibility(false),
 
          XCOFFTracebackTable(true), UniqueSectionNames(true),
 
          UniqueBasicBlockSectionNames(false), TrapUnreachable(false),
 
          NoTrapAfterNoreturn(false), TLSSize(0), EmulatedTLS(false),
 
          ExplicitEmulatedTLS(false), EnableIPRA(false),
 
          EmitStackSizeSection(false), EnableMachineOutliner(false),
 
          EnableMachineFunctionSplitter(false), SupportsDefaultOutlining(false),
 
          EmitAddrsig(false), EmitCallSiteInfo(false),
 
          SupportsDebugEntryValues(false), EnableDebugEntryValues(false),
 
          ValueTrackingVariableLocations(false), ForceDwarfFrameSection(false),
 
          XRayOmitFunctionIndex(false), DebugStrictDwarf(false),
 
          Hotpatch(false), PPCGenScalarMASSEntries(false), JMCInstrument(false),
 
          EnableCFIFixup(false), MisExpect(false),
 
          FPDenormalMode(DenormalMode::IEEE, DenormalMode::IEEE) {}
 
 
 
    /// DisableFramePointerElim - This returns true if frame pointer elimination
 
    /// optimization should be disabled for the given machine function.
 
    bool DisableFramePointerElim(const MachineFunction &MF) const;
 
 
 
    /// If greater than 0, override the default value of
 
    /// MCAsmInfo::BinutilsVersion.
 
    std::pair<int, int> BinutilsVersion{0, 0};
 
 
 
    /// 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.
 
    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;
 
 
 
    /// NoTrappingFPMath - This flag is enabled when the
 
    /// -enable-no-trapping-fp-math is specified on the command line. This
 
    /// specifies that there are no trap handlers to handle exceptions.
 
    unsigned NoTrappingFPMath : 1;
 
 
 
    /// NoSignedZerosFPMath - This flag is enabled when the
 
    /// -enable-no-signed-zeros-fp-math is specified on the command line. This
 
    /// specifies that optimizations are allowed to treat the sign of a zero
 
    /// argument or result as insignificant.
 
    unsigned NoSignedZerosFPMath : 1;
 
 
 
    /// ApproxFuncFPMath - This flag is enabled when the
 
    /// -enable-approx-func-fp-math is specified on the command line. This
 
    /// specifies that optimizations are allowed to substitute math functions
 
    /// with approximate calculations
 
    unsigned ApproxFuncFPMath : 1;
 
 
 
    /// EnableAIXExtendedAltivecABI - This flag returns true when -vec-extabi is
 
    /// specified. The code generator is then able to use both volatile and
 
    /// nonvolitle vector registers. When false, the code generator only uses
 
    /// volatile vector registers which is the default setting on AIX.
 
    unsigned EnableAIXExtendedAltivecABI : 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;
 
 
 
    /// 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;
 
 
 
    /// 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;
 
 
 
    /// StackSymbolOrdering - When true, this will allow CodeGen to order
 
    /// the local stack symbols (for code size, code locality, or any other
 
    /// heuristics). When false, the local symbols are left in whatever order
 
    /// they were generated. Default is true.
 
    unsigned StackSymbolOrdering : 1;
 
 
 
    /// EnableFastISel - This flag enables fast-path instruction selection
 
    /// which trades away generated code quality in favor of reducing
 
    /// compile time.
 
    unsigned EnableFastISel : 1;
 
 
 
    /// EnableGlobalISel - This flag enables global instruction selection.
 
    unsigned EnableGlobalISel : 1;
 
 
 
    /// EnableGlobalISelAbort - Control abort behaviour when global instruction
 
    /// selection fails to lower/select an instruction.
 
    GlobalISelAbortMode GlobalISelAbort = GlobalISelAbortMode::Enable;
 
 
 
    /// Control when and how the Swift async frame pointer bit should
 
    /// be set.
 
    SwiftAsyncFramePointerMode SwiftAsyncFramePointer =
 
        SwiftAsyncFramePointerMode::Always;
 
 
 
    /// UseInitArray - Use .init_array instead of .ctors for static
 
    /// constructors.
 
    unsigned UseInitArray : 1;
 
 
 
    /// Use __cxa_atexit to register global destructors; determines how
 
    /// llvm.global_dtors is lowered.
 
    unsigned LowerGlobalDtorsViaCxaAtExit : 1;
 
 
 
    /// Disable the integrated assembler.
 
    unsigned DisableIntegratedAS : 1;
 
 
 
    /// Compress DWARF debug sections.
 
    DebugCompressionType CompressDebugSections = DebugCompressionType::None;
 
 
 
    unsigned RelaxELFRelocations : 1;
 
 
 
    /// Emit functions into separate sections.
 
    unsigned FunctionSections : 1;
 
 
 
    /// Emit data into separate sections.
 
    unsigned DataSections : 1;
 
 
 
    /// Do not emit visibility attribute for xcoff.
 
    unsigned IgnoreXCOFFVisibility : 1;
 
 
 
    /// Emit XCOFF traceback table.
 
    unsigned XCOFFTracebackTable : 1;
 
 
 
    unsigned UniqueSectionNames : 1;
 
 
 
    /// Use unique names for basic block sections.
 
    unsigned UniqueBasicBlockSectionNames : 1;
 
 
 
    /// Emit target-specific trap instruction for 'unreachable' IR instructions.
 
    unsigned TrapUnreachable : 1;
 
 
 
    /// Do not emit a trap instruction for 'unreachable' IR instructions behind
 
    /// noreturn calls, even if TrapUnreachable is true.
 
    unsigned NoTrapAfterNoreturn : 1;
 
 
 
    /// Bit size of immediate TLS offsets (0 == use the default).
 
    unsigned TLSSize : 8;
 
 
 
    /// EmulatedTLS - This flag enables emulated TLS model, using emutls
 
    /// function in the runtime library..
 
    unsigned EmulatedTLS : 1;
 
 
 
    /// Whether -emulated-tls or -no-emulated-tls is set.
 
    unsigned ExplicitEmulatedTLS : 1;
 
 
 
    /// This flag enables InterProcedural Register Allocation (IPRA).
 
    unsigned EnableIPRA : 1;
 
 
 
    /// Emit section containing metadata on function stack sizes.
 
    unsigned EmitStackSizeSection : 1;
 
 
 
    /// Enables the MachineOutliner pass.
 
    unsigned EnableMachineOutliner : 1;
 
 
 
    /// Enables the MachineFunctionSplitter pass.
 
    unsigned EnableMachineFunctionSplitter : 1;
 
 
 
    /// Set if the target supports default outlining behaviour.
 
    unsigned SupportsDefaultOutlining : 1;
 
 
 
    /// Emit address-significance table.
 
    unsigned EmitAddrsig : 1;
 
 
 
    /// Emit basic blocks into separate sections.
 
    BasicBlockSection BBSections = BasicBlockSection::None;
 
 
 
    /// Memory Buffer that contains information on sampled basic blocks and used
 
    /// to selectively generate basic block sections.
 
    std::shared_ptr<MemoryBuffer> BBSectionsFuncListBuf;
 
 
 
    /// The flag enables call site info production. It is used only for debug
 
    /// info, and it is restricted only to optimized code. This can be used for
 
    /// something else, so that should be controlled in the frontend.
 
    unsigned EmitCallSiteInfo : 1;
 
    /// Set if the target supports the debug entry values by default.
 
    unsigned SupportsDebugEntryValues : 1;
 
    /// When set to true, the EnableDebugEntryValues option forces production
 
    /// of debug entry values even if the target does not officially support
 
    /// it. Useful for testing purposes only. This flag should never be checked
 
    /// directly, always use \ref ShouldEmitDebugEntryValues instead.
 
     unsigned EnableDebugEntryValues : 1;
 
    /// NOTE: There are targets that still do not support the debug entry values
 
    /// production.
 
    bool ShouldEmitDebugEntryValues() const;
 
 
 
    // When set to true, use experimental new debug variable location tracking,
 
    // which seeks to follow the values of variables rather than their location,
 
    // post isel.
 
    unsigned ValueTrackingVariableLocations : 1;
 
 
 
    /// Emit DWARF debug frame section.
 
    unsigned ForceDwarfFrameSection : 1;
 
 
 
    /// Emit XRay Function Index section
 
    unsigned XRayOmitFunctionIndex : 1;
 
 
 
    /// When set to true, don't use DWARF extensions in later DWARF versions.
 
    /// By default, it is set to false.
 
    unsigned DebugStrictDwarf : 1;
 
 
 
    /// Emit the hotpatch flag in CodeView debug.
 
    unsigned Hotpatch : 1;
 
 
 
    /// Enables scalar MASS conversions
 
    unsigned PPCGenScalarMASSEntries : 1;
 
 
 
    /// Enable JustMyCode instrumentation.
 
    unsigned JMCInstrument : 1;
 
 
 
    /// Enable the CFIFixup pass.
 
    unsigned EnableCFIFixup : 1;
 
 
 
    /// When set to true, enable MisExpect Diagnostics
 
    /// By default, it is set to false
 
    unsigned MisExpect : 1;
 
 
 
    /// Name of the stack usage file (i.e., .su file) if user passes
 
    /// -fstack-usage. If empty, it can be implied that -fstack-usage is not
 
    /// passed on the command line.
 
    std::string StackUsageOutput;
 
 
 
    /// If greater than 0, override TargetLoweringBase::PrefLoopAlignment.
 
    unsigned LoopAlignment = 0;
 
 
 
    /// 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
 
    /// software floating point, 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 = FloatABI::Default;
 
 
 
    /// AllowFPOpFusion - This flag is set by the -fp-contract=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.
 
    ///
 
    /// 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
 
    /// the value of this option.
 
    FPOpFusion::FPOpFusionMode AllowFPOpFusion = FPOpFusion::Standard;
 
 
 
    /// ThreadModel - This flag specifies the type of threading model to assume
 
    /// for things like atomics
 
    ThreadModel::Model ThreadModel = ThreadModel::POSIX;
 
 
 
    /// EABIVersion - This flag specifies the EABI version
 
    EABI EABIVersion = EABI::Default;
 
 
 
    /// Which debugger to tune for.
 
    DebuggerKind DebuggerTuning = DebuggerKind::Default;
 
 
 
  private:
 
    /// Flushing mode to assume in default FP environment.
 
    DenormalMode FPDenormalMode;
 
 
 
    /// Flushing mode to assume in default FP environment, for float/vector of
 
    /// float.
 
    DenormalMode FP32DenormalMode;
 
 
 
  public:
 
    void setFPDenormalMode(DenormalMode Mode) {
 
      FPDenormalMode = Mode;
 
    }
 
 
 
    void setFP32DenormalMode(DenormalMode Mode) {
 
      FP32DenormalMode = Mode;
 
    }
 
 
 
    DenormalMode getRawFPDenormalMode() const {
 
      return FPDenormalMode;
 
    }
 
 
 
    DenormalMode getRawFP32DenormalMode() const {
 
      return FP32DenormalMode;
 
    }
 
 
 
    DenormalMode getDenormalMode(const fltSemantics &FPType) const;
 
 
 
    /// What exception model to use
 
    ExceptionHandling ExceptionModel = ExceptionHandling::None;
 
 
 
    /// Machine level options.
 
    MCTargetOptions MCOptions;
 
 
 
    /// Stores the filename/path of the final .o/.obj file, to be written in the
 
    /// debug information. This is used for emitting the CodeView S_OBJNAME
 
    /// record.
 
    std::string ObjectFilenameForDebug;
 
  };
 
 
 
} // End llvm namespace
 
 
 
#endif