1 //===--- CodeGenOptions.h ---------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the CodeGenOptions interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H 15 #define LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H 16 17 #include <string> 18 #include <vector> 19 20 namespace clang { 21 22 /// CodeGenOptions - Track various options which control how the code 23 /// is optimized and passed to the backend. 24 class CodeGenOptions { 25 public: 26 enum InliningMethod { 27 NoInlining, // Perform no inlining whatsoever. 28 NormalInlining, // Use the standard function inlining pass. 29 OnlyAlwaysInlining // Only run the always inlining pass. 30 }; 31 32 enum ObjCDispatchMethodKind { 33 Legacy = 0, 34 NonLegacy = 1, 35 Mixed = 2 36 }; 37 38 enum DebugInfoKind { 39 NoDebugInfo, // Don't generate debug info. 40 DebugLineTablesOnly, // Emit only debug info necessary for generating 41 // line number tables (-gline-tables-only). 42 LimitedDebugInfo, // Limit generated debug info to reduce size 43 // (-flimit-debug-info). 44 FullDebugInfo // Generate complete debug info. 45 }; 46 47 enum TLSModel { 48 GeneralDynamicTLSModel, 49 LocalDynamicTLSModel, 50 InitialExecTLSModel, 51 LocalExecTLSModel 52 }; 53 54 unsigned AsmVerbose : 1; ///< -dA, -fverbose-asm. 55 unsigned ObjCAutoRefCountExceptions : 1; ///< Whether ARC should be EH-safe. 56 unsigned CUDAIsDevice : 1; ///< Set when compiling for CUDA device. 57 unsigned CXAAtExit : 1; ///< Use __cxa_atexit for calling destructors. 58 unsigned CXXCtorDtorAliases: 1; ///< Emit complete ctors/dtors as linker 59 ///< aliases to base ctors when possible. 60 unsigned DataSections : 1; ///< Set when -fdata-sections is enabled. 61 unsigned DisableFPElim : 1; ///< Set when -fomit-frame-pointer is enabled. 62 unsigned DisableLLVMOpts : 1; ///< Don't run any optimizations, for use in 63 ///< getting .bc files that correspond to the 64 ///< internal state before optimizations are 65 ///< done. 66 unsigned DisableRedZone : 1; ///< Set when -mno-red-zone is enabled. 67 unsigned DisableTailCalls : 1; ///< Do not emit tail calls. 68 unsigned EmitDeclMetadata : 1; ///< Emit special metadata indicating what 69 ///< Decl* various IR entities came from. Only 70 ///< useful when running CodeGen as a 71 ///< subroutine. 72 unsigned EmitGcovArcs : 1; ///< Emit coverage data files, aka. GCDA. 73 unsigned EmitGcovNotes : 1; ///< Emit coverage "notes" files, aka GCNO. 74 unsigned EmitOpenCLArgMetadata : 1; ///< Emit OpenCL kernel arg metadata. 75 unsigned ForbidGuardVariables : 1; ///< Issue errors if C++ guard variables 76 ///< are required. 77 unsigned FunctionSections : 1; ///< Set when -ffunction-sections is enabled. 78 unsigned HiddenWeakTemplateVTables : 1; ///< Emit weak vtables and RTTI for 79 ///< template classes with hidden visibility 80 unsigned HiddenWeakVTables : 1; ///< Emit weak vtables, RTTI, and thunks with 81 ///< hidden visibility. 82 unsigned InstrumentFunctions : 1; ///< Set when -finstrument-functions is 83 ///< enabled. 84 unsigned InstrumentForProfiling : 1; ///< Set when -pg is enabled. 85 unsigned LessPreciseFPMAD : 1; ///< Enable less precise MAD instructions to 86 ///< be generated. 87 unsigned MergeAllConstants : 1; ///< Merge identical constants. 88 unsigned NoCommon : 1; ///< Set when -fno-common or C++ is enabled. 89 unsigned NoDwarf2CFIAsm : 1; ///< Set when -fno-dwarf2-cfi-asm is enabled. 90 unsigned NoDwarfDirectoryAsm : 1; ///< Set when -fno-dwarf-directory-asm is 91 ///< enabled. 92 unsigned NoExecStack : 1; ///< Set when -Wa,--noexecstack is enabled. 93 unsigned NoGlobalMerge : 1; ///< Set when -mno-global-merge is enabled. 94 unsigned NoImplicitFloat : 1; ///< Set when -mno-implicit-float is enabled. 95 unsigned NoInfsFPMath : 1; ///< Assume FP arguments, results not +-Inf. 96 unsigned NoInline : 1; ///< Set when -fno-inline is enabled. Disables 97 ///< use of the inline keyword. 98 unsigned NoNaNsFPMath : 1; ///< Assume FP arguments, results not NaN. 99 unsigned NoZeroInitializedInBSS : 1; ///< -fno-zero-initialized-in-bss. 100 unsigned ObjCDispatchMethod : 2; ///< Method of Objective-C dispatch to use. 101 unsigned OmitLeafFramePointer : 1; ///< Set when -momit-leaf-frame-pointer is 102 ///< enabled. 103 unsigned OptimizationLevel : 3; ///< The -O[0-4] option specified. 104 unsigned OptimizeSize : 2; ///< If -Os (==1) or -Oz (==2) is specified. 105 unsigned RelaxAll : 1; ///< Relax all machine code instructions. 106 unsigned RelaxedAliasing : 1; ///< Set when -fno-strict-aliasing is enabled. 107 unsigned SaveTempLabels : 1; ///< Save temporary labels. 108 unsigned SimplifyLibCalls : 1; ///< Set when -fbuiltin is enabled. 109 unsigned SoftFloat : 1; ///< -soft-float. 110 unsigned StrictEnums : 1; ///< Optimize based on strict enum definition. 111 unsigned TimePasses : 1; ///< Set when -ftime-report is enabled. 112 unsigned UnitAtATime : 1; ///< Unused. For mirroring GCC optimization 113 ///< selection. 114 unsigned UnrollLoops : 1; ///< Control whether loops are unrolled. 115 unsigned UnsafeFPMath : 1; ///< Allow unsafe floating point optzns. 116 unsigned UnwindTables : 1; ///< Emit unwind tables. 117 118 /// Attempt to use register sized accesses to bit-fields in structures, when 119 /// possible. 120 unsigned UseRegisterSizedBitfieldAccess : 1; 121 122 unsigned VerifyModule : 1; ///< Control whether the module should be run 123 ///< through the LLVM Verifier. 124 125 unsigned StackRealignment : 1; ///< Control whether to permit stack 126 ///< realignment. 127 unsigned UseInitArray : 1; ///< Control whether to use .init_array or 128 ///< .ctors. 129 unsigned StackAlignment; ///< Overrides default stack alignment, 130 ///< if not 0. 131 132 /// The code model to use (-mcmodel). 133 std::string CodeModel; 134 135 /// The filename with path we use for coverage files. The extension will be 136 /// replaced. 137 std::string CoverageFile; 138 139 /// Enable additional debugging information. 140 std::string DebugPass; 141 142 /// The string to embed in debug information as the current working directory. 143 std::string DebugCompilationDir; 144 145 /// The kind of generated debug info. 146 DebugInfoKind DebugInfo; 147 148 /// The string to embed in the debug information for the compile unit, if 149 /// non-empty. 150 std::string DwarfDebugFlags; 151 152 /// The ABI to use for passing floating point arguments. 153 std::string FloatABI; 154 155 /// The float precision limit to use, if non-empty. 156 std::string LimitFloatPrecision; 157 158 /// The name of the bitcode file to link before optzns. 159 std::string LinkBitcodeFile; 160 161 /// The kind of inlining to perform. 162 InliningMethod Inlining; 163 164 /// The user provided name for the "main file", if non-empty. This is useful 165 /// in situations where the input file name does not match the original input 166 /// file, for example with -save-temps. 167 std::string MainFileName; 168 169 /// The name of the relocation model to use. 170 std::string RelocationModel; 171 172 /// If not an empty string, trap intrinsics are lowered to calls to this 173 /// function instead of to trap instructions. 174 std::string TrapFuncName; 175 176 /// A list of command-line options to forward to the LLVM backend. 177 std::vector<std::string> BackendOptions; 178 179 /// The user specified number of registers to be used for integral arguments, 180 /// or 0 if unspecified. 181 unsigned NumRegisterParameters; 182 183 /// The run-time penalty for bounds checking, or 0 to disable. 184 unsigned char BoundsChecking; 185 186 /// The lower bound for a buffer to be considered for stack protection. 187 unsigned SSPBufferSize; 188 189 /// The default TLS model to use. 190 TLSModel DefaultTLSModel; 191 192 public: CodeGenOptions()193 CodeGenOptions() { 194 AsmVerbose = 0; 195 CUDAIsDevice = 0; 196 CXAAtExit = 1; 197 CXXCtorDtorAliases = 0; 198 DataSections = 0; 199 DisableFPElim = 0; 200 DisableLLVMOpts = 0; 201 DisableRedZone = 0; 202 DisableTailCalls = 0; 203 EmitDeclMetadata = 0; 204 EmitGcovArcs = 0; 205 EmitGcovNotes = 0; 206 EmitOpenCLArgMetadata = 0; 207 ForbidGuardVariables = 0; 208 FunctionSections = 0; 209 HiddenWeakTemplateVTables = 0; 210 HiddenWeakVTables = 0; 211 InstrumentFunctions = 0; 212 InstrumentForProfiling = 0; 213 LessPreciseFPMAD = 0; 214 MergeAllConstants = 1; 215 NoCommon = 0; 216 NoDwarf2CFIAsm = 0; 217 NoImplicitFloat = 0; 218 NoInfsFPMath = 0; 219 NoInline = 0; 220 NoNaNsFPMath = 0; 221 NoZeroInitializedInBSS = 0; 222 NumRegisterParameters = 0; 223 ObjCAutoRefCountExceptions = 0; 224 ObjCDispatchMethod = Legacy; 225 OmitLeafFramePointer = 0; 226 OptimizationLevel = 0; 227 OptimizeSize = 0; 228 RelaxAll = 0; 229 RelaxedAliasing = 0; 230 SaveTempLabels = 0; 231 SimplifyLibCalls = 1; 232 SoftFloat = 0; 233 StrictEnums = 0; 234 TimePasses = 0; 235 UnitAtATime = 1; 236 UnrollLoops = 0; 237 UnsafeFPMath = 0; 238 UnwindTables = 0; 239 UseRegisterSizedBitfieldAccess = 0; 240 VerifyModule = 1; 241 StackRealignment = 0; 242 StackAlignment = 0; 243 BoundsChecking = 0; 244 SSPBufferSize = 8; 245 UseInitArray = 0; 246 247 DebugInfo = NoDebugInfo; 248 Inlining = NoInlining; 249 RelocationModel = "pic"; 250 DefaultTLSModel = GeneralDynamicTLSModel; 251 } 252 getObjCDispatchMethod()253 ObjCDispatchMethodKind getObjCDispatchMethod() const { 254 return ObjCDispatchMethodKind(ObjCDispatchMethod); 255 } 256 }; 257 258 } // end namespace clang 259 260 #endif 261