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 /// \brief Bitfields of CodeGenOptions, split out from CodeGenOptions to ensure 23 /// that this large collection of bitfields is a trivial class type. 24 class CodeGenOptionsBase { 25 public: 26 #define CODEGENOPT(Name, Bits, Default) unsigned Name : Bits; 27 #define ENUM_CODEGENOPT(Name, Type, Bits, Default) 28 #include "clang/Frontend/CodeGenOptions.def" 29 30 protected: 31 #define CODEGENOPT(Name, Bits, Default) 32 #define ENUM_CODEGENOPT(Name, Type, Bits, Default) unsigned Name : Bits; 33 #include "clang/Frontend/CodeGenOptions.def" 34 }; 35 36 /// CodeGenOptions - Track various options which control how the code 37 /// is optimized and passed to the backend. 38 class CodeGenOptions : public CodeGenOptionsBase { 39 public: 40 enum InliningMethod { 41 NoInlining, // Perform no inlining whatsoever. 42 NormalInlining, // Use the standard function inlining pass. 43 OnlyAlwaysInlining // Only run the always inlining pass. 44 }; 45 46 enum ObjCDispatchMethodKind { 47 Legacy = 0, 48 NonLegacy = 1, 49 Mixed = 2 50 }; 51 52 enum DebugInfoKind { 53 NoDebugInfo, // Don't generate debug info. 54 DebugLineTablesOnly, // Emit only debug info necessary for generating 55 // line number tables (-gline-tables-only). 56 LimitedDebugInfo, // Limit generated debug info to reduce size 57 // (-flimit-debug-info). 58 FullDebugInfo // Generate complete debug info. 59 }; 60 61 enum TLSModel { 62 GeneralDynamicTLSModel, 63 LocalDynamicTLSModel, 64 InitialExecTLSModel, 65 LocalExecTLSModel 66 }; 67 68 enum FPContractModeKind { 69 FPC_Off, // Form fused FP ops only where result will not be affected. 70 FPC_On, // Form fused FP ops according to FP_CONTRACT rules. 71 FPC_Fast // Aggressively fuse FP ops (E.g. FMA). 72 }; 73 74 enum StructReturnConventionKind { 75 SRCK_Default, // No special option was passed. 76 SRCK_OnStack, // Small structs on the stack (-fpcc-struct-return). 77 SRCK_InRegs // Small structs in registers (-freg-struct-return). 78 }; 79 80 /// The code model to use (-mcmodel). 81 std::string CodeModel; 82 83 /// The filename with path we use for coverage files. The extension will be 84 /// replaced. 85 std::string CoverageFile; 86 87 /// The version string to put into coverage files. 88 char CoverageVersion[4]; 89 90 /// Enable additional debugging information. 91 std::string DebugPass; 92 93 /// The string to embed in debug information as the current working directory. 94 std::string DebugCompilationDir; 95 96 /// The string to embed in the debug information for the compile unit, if 97 /// non-empty. 98 std::string DwarfDebugFlags; 99 100 /// The ABI to use for passing floating point arguments. 101 std::string FloatABI; 102 103 /// The float precision limit to use, if non-empty. 104 std::string LimitFloatPrecision; 105 106 /// The name of the bitcode file to link before optzns. 107 std::string LinkBitcodeFile; 108 109 /// The user provided name for the "main file", if non-empty. This is useful 110 /// in situations where the input file name does not match the original input 111 /// file, for example with -save-temps. 112 std::string MainFileName; 113 114 /// The name for the split debug info file that we'll break out. This is used 115 /// in the backend for setting the name in the skeleton cu. 116 std::string SplitDwarfFile; 117 118 /// The name of the relocation model to use. 119 std::string RelocationModel; 120 121 /// Path to blacklist file for sanitizers. 122 std::string SanitizerBlacklistFile; 123 124 /// If not an empty string, trap intrinsics are lowered to calls to this 125 /// function instead of to trap instructions. 126 std::string TrapFuncName; 127 128 /// A list of command-line options to forward to the LLVM backend. 129 std::vector<std::string> BackendOptions; 130 131 public: 132 // Define accessors/mutators for code generation options of enumeration type. 133 #define CODEGENOPT(Name, Bits, Default) 134 #define ENUM_CODEGENOPT(Name, Type, Bits, Default) \ 135 Type get##Name() const { return static_cast<Type>(Name); } \ 136 void set##Name(Type Value) { Name = static_cast<unsigned>(Value); } 137 #include "clang/Frontend/CodeGenOptions.def" 138 139 CodeGenOptions() { 140 #define CODEGENOPT(Name, Bits, Default) Name = Default; 141 #define ENUM_CODEGENOPT(Name, Type, Bits, Default) \ 142 set##Name(Default); 143 #include "clang/Frontend/CodeGenOptions.def" 144 145 RelocationModel = "pic"; 146 memcpy(CoverageVersion, "402*", 4); 147 } 148 }; 149 150 } // end namespace clang 151 152 #endif 153