Files
clang-r547379/include/llvm/Support/CodeGen.h
Ryan Prichard 6024e5c395 Update prebuilt Clang to r547379 (20.0.0).
clang 20.0.0 (based on r547379) from build 12806354.

Bug: http://b/379133546
Test: N/A
Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b

Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
2025-11-26 14:59:46 -05:00

136 lines
3.9 KiB
C++

//===-- 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
};
}
/// Code generation optimization level.
enum class CodeGenOptLevel {
None = 0, ///< -O0
Less = 1, ///< -O1
Default = 2, ///< -O2, -Os
Aggressive = 3 ///< -O3
};
namespace CodeGenOpt {
/// Get the \c Level identified by the integer \p OL.
///
/// Returns std::nullopt if \p OL is invalid.
inline std::optional<CodeGenOptLevel> getLevel(int OL) {
if (OL < 0 || OL > 3)
return std::nullopt;
return static_cast<CodeGenOptLevel>(OL);
}
/// Parse \p C as a single digit integer and get matching \c CodeGenLevel.
///
/// Returns std::nullopt if the input is not a valid optimization level.
inline std::optional<CodeGenOptLevel> parseLevel(char C) {
if (C < '0')
return std::nullopt;
return getLevel(static_cast<int>(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 class CodeGenFileType {
AssemblyFile,
ObjectFile,
Null // Do not emit any output.
};
// Specify what functions should keep the frame pointer.
enum class FramePointerKind { None, NonLeaf, All, Reserved };
// 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