//===-- llvm/Support/CodeGen.h - CodeGen Concepts ---------------*- 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 define some types which define code generation concepts. For
 
// example, relocation model.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_SUPPORT_CODEGEN_H
 
#define LLVM_SUPPORT_CODEGEN_H
 
 
 
#include <cstdint>
 
#include <optional>
 
 
 
namespace llvm {
 
 
 
  // Relocation model types.
 
  namespace Reloc {
 
    // Cannot be named PIC due to collision with -DPIC
 
    enum Model { Static, PIC_, DynamicNoPIC, ROPI, RWPI, ROPI_RWPI };
 
  }
 
 
 
  // Code model types.
 
  namespace CodeModel {
 
    // Sync changes with CodeGenCWrappers.h.
 
    enum Model { Tiny, Small, Kernel, Medium, Large };
 
  }
 
 
 
  namespace PICLevel {
 
    // This is used to map -fpic/-fPIC.
 
    enum Level { NotPIC=0, SmallPIC=1, BigPIC=2 };
 
  }
 
 
 
  namespace PIELevel {
 
    enum Level { Default=0, Small=1, Large=2 };
 
  }
 
 
 
  // TLS models.
 
  namespace TLSModel {
 
    enum Model {
 
      GeneralDynamic,
 
      LocalDynamic,
 
      InitialExec,
 
      LocalExec
 
    };
 
  }
 
 
 
  namespace CodeGenOpt {
 
  /// Type for the unique integer IDs of code generation optimization levels.
 
  using IDType = int;
 
  /// Code generation optimization level.
 
  enum Level : IDType {
 
    None = 0,      ///< -O0
 
    Less = 1,      ///< -O1
 
    Default = 2,   ///< -O2, -Os
 
    Aggressive = 3 ///< -O3
 
  };
 
  /// Get the \c Level identified by the integer \p ID.
 
  ///
 
  /// Returns std::nullopt if \p ID is invalid.
 
  inline std::optional<Level> getLevel(IDType ID) {
 
    if (ID < 0 || ID > 3)
 
      return std::nullopt;
 
    return static_cast<Level>(ID);
 
  }
 
  /// Parse \p C as a single digit integer ID and get matching \c Level.
 
  ///
 
  /// Returns std::nullopt if the input is not a valid digit or not a valid ID.
 
  inline std::optional<Level> parseLevel(char C) {
 
    if (C < '0')
 
      return std::nullopt;
 
    return getLevel(static_cast<IDType>(C - '0'));
 
  }
 
  } // namespace CodeGenOpt
 
 
 
  /// These enums are meant to be passed into addPassesToEmitFile to indicate
 
  /// what type of file to emit, and returned by it to indicate what type of
 
  /// file could actually be made.
 
  enum CodeGenFileType {
 
    CGFT_AssemblyFile,
 
    CGFT_ObjectFile,
 
    CGFT_Null         // Do not emit any output.
 
  };
 
 
 
  // Specify what functions should keep the frame pointer.
 
  enum class FramePointerKind { None, NonLeaf, All };
 
 
 
  // Specify what type of zeroing callee-used registers.
 
  namespace ZeroCallUsedRegs {
 
  const unsigned ONLY_USED = 1U << 1;
 
  const unsigned ONLY_GPR = 1U << 2;
 
  const unsigned ONLY_ARG = 1U << 3;
 
 
 
  enum class ZeroCallUsedRegsKind : unsigned int {
 
    // Don't zero any call-used regs.
 
    Skip = 1U << 0,
 
    // Only zeros call-used GPRs used in the fn and pass args.
 
    UsedGPRArg = ONLY_USED | ONLY_GPR | ONLY_ARG,
 
    // Only zeros call-used GPRs used in the fn.
 
    UsedGPR = ONLY_USED | ONLY_GPR,
 
    // Only zeros call-used regs used in the fn and pass args.
 
    UsedArg = ONLY_USED | ONLY_ARG,
 
    // Only zeros call-used regs used in the fn.
 
    Used = ONLY_USED,
 
    // Zeros all call-used GPRs that pass args.
 
    AllGPRArg = ONLY_GPR | ONLY_ARG,
 
    // Zeros all call-used GPRs.
 
    AllGPR = ONLY_GPR,
 
    // Zeros all call-used regs that pass args.
 
    AllArg = ONLY_ARG,
 
    // Zeros all call-used regs.
 
    All = 0,
 
  };
 
  } // namespace ZeroCallUsedRegs
 
 
 
  enum class UWTableKind {
 
    None = 0,  ///< No unwind table requested
 
    Sync = 1,  ///< "Synchronous" unwind tables
 
    Async = 2, ///< "Asynchronous" unwind tables (instr precise)
 
    Default = 2,
 
  };
 
 
 
  enum class FunctionReturnThunksKind : unsigned int {
 
    Keep = 0,    ///< No function return thunk.
 
    Extern = 1,  ///< Replace returns with jump to thunk, don't emit thunk.
 
    Invalid = 2, ///< Not used.
 
  };
 
 
 
  } // namespace llvm
 
 
 
#endif