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. getLevel(IDType ID)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. parseLevel(char C)74 inline std::optional<Level> parseLevel(char C) { 75 if (C < '0') 76 return std::nullopt; 77 return getLevel(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