1 | //===-- llvm/Support/CodeGen.h - CodeGen Concepts ---------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file define some types which define code generation concepts. For |
10 | // example, relocation model. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_SUPPORT_CODEGEN_H |
15 | #define LLVM_SUPPORT_CODEGEN_H |
16 | |
17 | #include <cstdint> |
18 | #include <optional> |
19 | |
20 | namespace llvm { |
21 | |
22 | // Relocation model types. |
23 | namespace Reloc { |
24 | // Cannot be named PIC due to collision with -DPIC |
25 | enum Model { Static, PIC_, DynamicNoPIC, ROPI, RWPI, ROPI_RWPI }; |
26 | } |
27 | |
28 | // Code model types. |
29 | namespace CodeModel { |
30 | // Sync changes with CodeGenCWrappers.h. |
31 | enum Model { Tiny, Small, Kernel, Medium, Large }; |
32 | } |
33 | |
34 | namespace PICLevel { |
35 | // This is used to map -fpic/-fPIC. |
36 | enum Level { NotPIC=0, SmallPIC=1, BigPIC=2 }; |
37 | } |
38 | |
39 | namespace PIELevel { |
40 | enum Level { Default=0, Small=1, Large=2 }; |
41 | } |
42 | |
43 | // TLS models. |
44 | namespace TLSModel { |
45 | enum Model { |
46 | GeneralDynamic, |
47 | LocalDynamic, |
48 | InitialExec, |
49 | LocalExec |
50 | }; |
51 | } |
52 | |
53 | namespace CodeGenOpt { |
54 | /// Type for the unique integer IDs of code generation optimization levels. |
55 | using IDType = int; |
56 | /// Code generation optimization level. |
57 | enum Level : IDType { |
58 | None = 0, ///< -O0 |
59 | Less = 1, ///< -O1 |
60 | Default = 2, ///< -O2, -Os |
61 | Aggressive = 3 ///< -O3 |
62 | }; |
63 | /// Get the \c Level identified by the integer \p ID. |
64 | /// |
65 | /// Returns std::nullopt if \p ID is invalid. |
66 | inline std::optional<Level> getLevel(IDType ID) { |
67 | if (ID < 0 || ID > 3) |
68 | return std::nullopt; |
69 | return static_cast<Level>(ID); |
70 | } |
71 | /// Parse \p C as a single digit integer ID and get matching \c Level. |
72 | /// |
73 | /// Returns std::nullopt if the input is not a valid digit or not a valid ID. |
74 | inline std::optional<Level> parseLevel(char C) { |
75 | if (C < '0') |
76 | return std::nullopt; |
77 | return getLevel(ID: static_cast<IDType>(C - '0')); |
78 | } |
79 | } // namespace CodeGenOpt |
80 | |
81 | /// These enums are meant to be passed into addPassesToEmitFile to indicate |
82 | /// what type of file to emit, and returned by it to indicate what type of |
83 | /// file could actually be made. |
84 | enum CodeGenFileType { |
85 | CGFT_AssemblyFile, |
86 | CGFT_ObjectFile, |
87 | CGFT_Null // Do not emit any output. |
88 | }; |
89 | |
90 | // Specify what functions should keep the frame pointer. |
91 | enum class FramePointerKind { None, NonLeaf, All }; |
92 | |
93 | // Specify what type of zeroing callee-used registers. |
94 | namespace ZeroCallUsedRegs { |
95 | const unsigned ONLY_USED = 1U << 1; |
96 | const unsigned ONLY_GPR = 1U << 2; |
97 | const unsigned ONLY_ARG = 1U << 3; |
98 | |
99 | enum class ZeroCallUsedRegsKind : unsigned int { |
100 | // Don't zero any call-used regs. |
101 | Skip = 1U << 0, |
102 | // Only zeros call-used GPRs used in the fn and pass args. |
103 | UsedGPRArg = ONLY_USED | ONLY_GPR | ONLY_ARG, |
104 | // Only zeros call-used GPRs used in the fn. |
105 | UsedGPR = ONLY_USED | ONLY_GPR, |
106 | // Only zeros call-used regs used in the fn and pass args. |
107 | UsedArg = ONLY_USED | ONLY_ARG, |
108 | // Only zeros call-used regs used in the fn. |
109 | Used = ONLY_USED, |
110 | // Zeros all call-used GPRs that pass args. |
111 | AllGPRArg = ONLY_GPR | ONLY_ARG, |
112 | // Zeros all call-used GPRs. |
113 | AllGPR = ONLY_GPR, |
114 | // Zeros all call-used regs that pass args. |
115 | AllArg = ONLY_ARG, |
116 | // Zeros all call-used regs. |
117 | All = 0, |
118 | }; |
119 | } // namespace ZeroCallUsedRegs |
120 | |
121 | enum class UWTableKind { |
122 | None = 0, ///< No unwind table requested |
123 | Sync = 1, ///< "Synchronous" unwind tables |
124 | Async = 2, ///< "Asynchronous" unwind tables (instr precise) |
125 | Default = 2, |
126 | }; |
127 | |
128 | enum class FunctionReturnThunksKind : unsigned int { |
129 | Keep = 0, ///< No function return thunk. |
130 | Extern = 1, ///< Replace returns with jump to thunk, don't emit thunk. |
131 | Invalid = 2, ///< Not used. |
132 | }; |
133 | |
134 | } // namespace llvm |
135 | |
136 | #endif |
137 | |