blob: 7f95bcb9e9d7b9473e907311ef4b3e1bcaccf370 [file] [log] [blame]
//===-- 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