| //===-- 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 |