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
20namespace clang {
21
22/// CodeGenOptions - Track various options which control how the code
23/// is optimized and passed to the backend.
24class CodeGenOptions {
25public:
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
192public:
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
253  ObjCDispatchMethodKind getObjCDispatchMethod() const {
254    return ObjCDispatchMethodKind(ObjCDispatchMethod);
255  }
256};
257
258}  // end namespace clang
259
260#endif
261