//===--- CodeGenOptions.h ---------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  This file defines the CodeGenOptions interface.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H
#define LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H

#include <string>
#include <vector>

namespace clang {

/// CodeGenOptions - Track various options which control how the code
/// is optimized and passed to the backend.
class CodeGenOptions {
public:
  enum InliningMethod {
    NoInlining,         // Perform no inlining whatsoever.
    NormalInlining,     // Use the standard function inlining pass.
    OnlyAlwaysInlining  // Only run the always inlining pass.
  };

  enum ObjCDispatchMethodKind {
    Legacy = 0,
    NonLegacy = 1,
    Mixed = 2
  };

  enum DebugInfoKind {
    NoDebugInfo,          // Don't generate debug info.
    DebugLineTablesOnly,  // Emit only debug info necessary for generating
                          // line number tables (-gline-tables-only).
    LimitedDebugInfo,     // Limit generated debug info to reduce size
                          // (-flimit-debug-info).
    FullDebugInfo         // Generate complete debug info.
  };

  enum TLSModel {
    GeneralDynamicTLSModel,
    LocalDynamicTLSModel,
    InitialExecTLSModel,
    LocalExecTLSModel
  };

  unsigned AsmVerbose        : 1; ///< -dA, -fverbose-asm.
  unsigned ObjCAutoRefCountExceptions : 1; ///< Whether ARC should be EH-safe.
  unsigned CUDAIsDevice      : 1; ///< Set when compiling for CUDA device.
  unsigned CXAAtExit         : 1; ///< Use __cxa_atexit for calling destructors.
  unsigned CXXCtorDtorAliases: 1; ///< Emit complete ctors/dtors as linker
                                  ///< aliases to base ctors when possible.
  unsigned DataSections      : 1; ///< Set when -fdata-sections is enabled.
  unsigned DisableFPElim     : 1; ///< Set when -fomit-frame-pointer is enabled.
  unsigned DisableLLVMOpts   : 1; ///< Don't run any optimizations, for use in
                                  ///< getting .bc files that correspond to the
                                  ///< internal state before optimizations are
                                  ///< done.
  unsigned DisableRedZone    : 1; ///< Set when -mno-red-zone is enabled.
  unsigned DisableTailCalls  : 1; ///< Do not emit tail calls.
  unsigned EmitDeclMetadata  : 1; ///< Emit special metadata indicating what
                                  ///< Decl* various IR entities came from. Only
                                  ///< useful when running CodeGen as a
                                  ///< subroutine.
  unsigned EmitGcovArcs      : 1; ///< Emit coverage data files, aka. GCDA.
  unsigned EmitGcovNotes     : 1; ///< Emit coverage "notes" files, aka GCNO.
  unsigned EmitOpenCLArgMetadata : 1; ///< Emit OpenCL kernel arg metadata.
  unsigned ForbidGuardVariables : 1; ///< Issue errors if C++ guard variables
                                     ///< are required.
  unsigned FunctionSections  : 1; ///< Set when -ffunction-sections is enabled.
  unsigned HiddenWeakTemplateVTables : 1; ///< Emit weak vtables and RTTI for
                                  ///< template classes with hidden visibility
  unsigned HiddenWeakVTables : 1; ///< Emit weak vtables, RTTI, and thunks with
                                  ///< hidden visibility.
  unsigned InstrumentFunctions : 1; ///< Set when -finstrument-functions is
                                    ///< enabled.
  unsigned InstrumentForProfiling : 1; ///< Set when -pg is enabled.
  unsigned LessPreciseFPMAD  : 1; ///< Enable less precise MAD instructions to
                                  ///< be generated.
  unsigned MergeAllConstants : 1; ///< Merge identical constants.
  unsigned NoCommon          : 1; ///< Set when -fno-common or C++ is enabled.
  unsigned NoDwarf2CFIAsm    : 1; ///< Set when -fno-dwarf2-cfi-asm is enabled.
  unsigned NoDwarfDirectoryAsm : 1; ///< Set when -fno-dwarf-directory-asm is
                                    ///< enabled.
  unsigned NoExecStack       : 1; ///< Set when -Wa,--noexecstack is enabled.
  unsigned NoGlobalMerge     : 1; ///< Set when -mno-global-merge is enabled.
  unsigned NoImplicitFloat   : 1; ///< Set when -mno-implicit-float is enabled.
  unsigned NoInfsFPMath      : 1; ///< Assume FP arguments, results not +-Inf.
  unsigned NoInline          : 1; ///< Set when -fno-inline is enabled. Disables
                                  ///< use of the inline keyword.
  unsigned NoNaNsFPMath      : 1; ///< Assume FP arguments, results not NaN.
  unsigned NoZeroInitializedInBSS : 1; ///< -fno-zero-initialized-in-bss.
  unsigned ObjCDispatchMethod : 2; ///< Method of Objective-C dispatch to use.
  unsigned OmitLeafFramePointer : 1; ///< Set when -momit-leaf-frame-pointer is
                                     ///< enabled.
  unsigned OptimizationLevel : 3; ///< The -O[0-4] option specified.
  unsigned OptimizeSize      : 2; ///< If -Os (==1) or -Oz (==2) is specified.
  unsigned RelaxAll          : 1; ///< Relax all machine code instructions.
  unsigned RelaxedAliasing   : 1; ///< Set when -fno-strict-aliasing is enabled.
  unsigned SaveTempLabels    : 1; ///< Save temporary labels.
  unsigned SimplifyLibCalls  : 1; ///< Set when -fbuiltin is enabled.
  unsigned SoftFloat         : 1; ///< -soft-float.
  unsigned StrictEnums       : 1; ///< Optimize based on strict enum definition.
  unsigned TimePasses        : 1; ///< Set when -ftime-report is enabled.
  unsigned UnitAtATime       : 1; ///< Unused. For mirroring GCC optimization
                                  ///< selection.
  unsigned UnrollLoops       : 1; ///< Control whether loops are unrolled.
  unsigned UnsafeFPMath      : 1; ///< Allow unsafe floating point optzns.
  unsigned UnwindTables      : 1; ///< Emit unwind tables.

  /// Attempt to use register sized accesses to bit-fields in structures, when
  /// possible.
  unsigned UseRegisterSizedBitfieldAccess : 1;

  unsigned VerifyModule      : 1; ///< Control whether the module should be run
                                  ///< through the LLVM Verifier.

  unsigned StackRealignment  : 1; ///< Control whether to permit stack
                                  ///< realignment.
  unsigned UseInitArray      : 1; ///< Control whether to use .init_array or
                                  ///< .ctors.
  unsigned StackAlignment;        ///< Overrides default stack alignment,
                                  ///< if not 0.

  /// The code model to use (-mcmodel).
  std::string CodeModel;

  /// The filename with path we use for coverage files. The extension will be
  /// replaced.
  std::string CoverageFile;

  /// Enable additional debugging information.
  std::string DebugPass;

  /// The string to embed in debug information as the current working directory.
  std::string DebugCompilationDir;

  /// The kind of generated debug info.
  DebugInfoKind DebugInfo;

  /// The string to embed in the debug information for the compile unit, if
  /// non-empty.
  std::string DwarfDebugFlags;

  /// The ABI to use for passing floating point arguments.
  std::string FloatABI;

  /// The float precision limit to use, if non-empty.
  std::string LimitFloatPrecision;

  /// The name of the bitcode file to link before optzns.
  std::string LinkBitcodeFile;

  /// The kind of inlining to perform.
  InliningMethod Inlining;

  /// The user provided name for the "main file", if non-empty. This is useful
  /// in situations where the input file name does not match the original input
  /// file, for example with -save-temps.
  std::string MainFileName;

  /// The name of the relocation model to use.
  std::string RelocationModel;

  /// If not an empty string, trap intrinsics are lowered to calls to this
  /// function instead of to trap instructions.
  std::string TrapFuncName;

  /// A list of command-line options to forward to the LLVM backend.
  std::vector<std::string> BackendOptions;

  /// The user specified number of registers to be used for integral arguments,
  /// or 0 if unspecified.
  unsigned NumRegisterParameters;

  /// The run-time penalty for bounds checking, or 0 to disable.
  unsigned char BoundsChecking;

  /// The lower bound for a buffer to be considered for stack protection.
  unsigned SSPBufferSize;

  /// The default TLS model to use.
  TLSModel DefaultTLSModel;

public:
  CodeGenOptions() {
    AsmVerbose = 0;
    CUDAIsDevice = 0;
    CXAAtExit = 1;
    CXXCtorDtorAliases = 0;
    DataSections = 0;
    DisableFPElim = 0;
    DisableLLVMOpts = 0;
    DisableRedZone = 0;
    DisableTailCalls = 0;
    EmitDeclMetadata = 0;
    EmitGcovArcs = 0;
    EmitGcovNotes = 0;
    EmitOpenCLArgMetadata = 0;
    ForbidGuardVariables = 0;
    FunctionSections = 0;
    HiddenWeakTemplateVTables = 0;
    HiddenWeakVTables = 0;
    InstrumentFunctions = 0;
    InstrumentForProfiling = 0;
    LessPreciseFPMAD = 0;
    MergeAllConstants = 1;
    NoCommon = 0;
    NoDwarf2CFIAsm = 0;
    NoImplicitFloat = 0;
    NoInfsFPMath = 0;
    NoInline = 0;
    NoNaNsFPMath = 0;
    NoZeroInitializedInBSS = 0;
    NumRegisterParameters = 0;
    ObjCAutoRefCountExceptions = 0;
    ObjCDispatchMethod = Legacy;
    OmitLeafFramePointer = 0;
    OptimizationLevel = 0;
    OptimizeSize = 0;
    RelaxAll = 0;
    RelaxedAliasing = 0;
    SaveTempLabels = 0;
    SimplifyLibCalls = 1;
    SoftFloat = 0;
    StrictEnums = 0;
    TimePasses = 0;
    UnitAtATime = 1;
    UnrollLoops = 0;
    UnsafeFPMath = 0;
    UnwindTables = 0;
    UseRegisterSizedBitfieldAccess = 0;
    VerifyModule = 1;
    StackRealignment = 0;
    StackAlignment = 0;
    BoundsChecking = 0;
    SSPBufferSize = 8;
    UseInitArray = 0;

    DebugInfo = NoDebugInfo;
    Inlining = NoInlining;
    RelocationModel = "pic";
    DefaultTLSModel = GeneralDynamicTLSModel;
  }

  ObjCDispatchMethodKind getObjCDispatchMethod() const {
    return ObjCDispatchMethodKind(ObjCDispatchMethod);
  }
};

}  // end namespace clang

#endif
