CodeGenOptions.h revision 41a621d00e974829b75ff95cdff556755116dea1
12811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth//===--- CodeGenOptions.h ---------------------------------------*- C++ -*-===//
270f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//
370f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//                     The LLVM Compiler Infrastructure
470f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//
570f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar// This file is distributed under the University of Illinois Open Source
670f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar// License. See LICENSE.TXT for details.
770f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//
870f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//===----------------------------------------------------------------------===//
970f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//
102811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth//  This file defines the CodeGenOptions interface.
1170f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//
1270f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar//===----------------------------------------------------------------------===//
1370f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar
1406057cef0bcd7804e80f3ce2bbe352178396c715Chandler Carruth#ifndef LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H
1506057cef0bcd7804e80f3ce2bbe352178396c715Chandler Carruth#define LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H
1670f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar
17e062533e298f72d970b2aa99cd0e3818b20d73dfChris Lattner#include <string>
18e062533e298f72d970b2aa99cd0e3818b20d73dfChris Lattner
1970f92436f5828c11ef108463da4473d44e114c28Daniel Dunbarnamespace clang {
2070f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar
212811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth/// CodeGenOptions - Track various options which control how the code
2270f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar/// is optimized and passed to the backend.
232811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruthclass CodeGenOptions {
24e062533e298f72d970b2aa99cd0e3818b20d73dfChris Lattnerpublic:
25877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar  enum InliningMethod {
26877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar    NoInlining,         // Perform no inlining whatsoever.
27877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar    NormalInlining,     // Use the standard function inlining pass.
28877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar    OnlyAlwaysInlining  // Only run the always inlining pass.
29877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar  };
30877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar
31f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  enum ObjCDispatchMethodKind {
32f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar    Legacy = 0,
33f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar    NonLegacy = 1,
34f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar    Mixed = 2
35f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  };
36f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar
373b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar  unsigned AsmVerbose        : 1; /// -dA, -fverbose-asm.
38efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  unsigned CXAAtExit         : 1; /// Use __cxa_atexit for calling destructors.
39efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  unsigned CXXCtorDtorAliases: 1; /// Emit complete ctors/dtors as linker
40efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar                                  /// aliases to base ctors when possible.
41bbea7168326d810eff18dfb8bc43c7790fd55010Chris Lattner  unsigned DataSections      : 1; /// Set when -fdata-sections is enabled
42515ddd8f7a36fc2684492c13665642153fc690c0Sebastian Redl  unsigned DebugInfo         : 1; /// Should generate debug info (-g).
43f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  unsigned DisableFPElim     : 1; /// Set when -fomit-frame-pointer is enabled.
448d35314401047092eb97b989ed930967ed9e8cccDaniel Dunbar  unsigned DisableLLVMOpts   : 1; /// Don't run any optimizations, for use in
458d35314401047092eb97b989ed930967ed9e8cccDaniel Dunbar                                  /// getting .bc files that correspond to the
468d35314401047092eb97b989ed930967ed9e8cccDaniel Dunbar                                  /// internal state before optimizations are
478d35314401047092eb97b989ed930967ed9e8cccDaniel Dunbar                                  /// done.
48145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned DisableRedZone    : 1; /// Set when -mno-red-zone is enabled.
497a536907da776bdc47a704e7cafd641e8150e653John McCall  unsigned EmitDeclMetadata  : 1; /// Emit special metadata indicating what Decl*
507a536907da776bdc47a704e7cafd641e8150e653John McCall                                  /// various IR entities came from.  Only useful
517a536907da776bdc47a704e7cafd641e8150e653John McCall                                  /// when running CodeGen as a subroutine.
52bbea7168326d810eff18dfb8bc43c7790fd55010Chris Lattner  unsigned FunctionSections  : 1; /// Set when -ffunction-sections is enabled
53279b5eb6910d64a293e9c0e2887a05c65d8737d7John McCall  unsigned HiddenWeakTemplateVTables : 1; /// Emit weak vtables and RTTI for
547a536907da776bdc47a704e7cafd641e8150e653John McCall                                  /// template classes with hidden visibility
55279b5eb6910d64a293e9c0e2887a05c65d8737d7John McCall  unsigned HiddenWeakVTables : 1; /// Emit weak vtables, RTTI, and thunks with
56279b5eb6910d64a293e9c0e2887a05c65d8737d7John McCall                                  /// hidden visibility
577255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  unsigned InstrumentFunctions : 1; /// Set when -finstrument-functions is enabled
58145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned MergeAllConstants : 1; /// Merge identical constants.
59145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned NoCommon          : 1; /// Set when -fno-common or C++ is enabled.
60145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned NoImplicitFloat   : 1; /// Set when -mno-implicit-float is enabled.
61f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  unsigned NoZeroInitializedInBSS : 1; /// -fno-zero-initialized-in-bss
62f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  unsigned ObjCDispatchMethod : 2; /// Method of Objective-C dispatch to use.
631ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar  unsigned OmitLeafFramePointer : 1; /// Set when -momit-leaf-frame-pointer is
641ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar                                     /// enabled.
65145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned OptimizationLevel : 3; /// The -O[0-4] option specified.
66145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned OptimizeSize      : 1; /// If -Os is specified.
674ecc9b73b3716775ed4e09091e300796a9a72378Daniel Dunbar  unsigned RelaxAll          : 1; /// Relax all machine code instructions.
686b0cf67ae72a9ebb90e94cc9a14e09364a2b3466Daniel Dunbar  unsigned SimplifyLibCalls  : 1; /// Set when -fbuiltin is enabled.
693b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar  unsigned SoftFloat         : 1; /// -soft-float.
70145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned TimePasses        : 1; /// Set when -ftime-report is enabled.
71145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned UnitAtATime       : 1; /// Unused. For mirroring GCC optimization
72145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar                                  /// selection.
73145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned UnrollLoops       : 1; /// Control whether loops are unrolled.
74f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  unsigned UnwindTables      : 1; /// Emit unwind tables.
75145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar  unsigned VerifyModule      : 1; /// Control whether the module should be run
76145e2ea10fb6240265c3fac8137a5f2b01b1a426Daniel Dunbar                                  /// through the LLVM Verifier.
778d35314401047092eb97b989ed930967ed9e8cccDaniel Dunbar
78f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  /// The code model to use (-mcmodel).
79f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  std::string CodeModel;
80f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
813b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar  /// Enable additional debugging information.
82f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  std::string DebugPass;
83f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
84f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  /// The string to embed in the debug information for the compile unit, if
85f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  /// non-empty.
86f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  std::string DwarfDebugFlags;
87f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
883b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar  /// The ABI to use for passing floating point arguments.
893b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar  std::string FloatABI;
903b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar
91f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  /// The float precision limit to use, if non-empty.
92f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  std::string LimitFloatPrecision;
93f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
94f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  /// The kind of inlining to perform.
95877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar  InliningMethod Inlining;
96877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar
977d065d0f21b35f445cee13730398bc2bec6edff2Daniel Dunbar  /// The user provided name for the "main file", if non-empty. This is useful
987d065d0f21b35f445cee13730398bc2bec6edff2Daniel Dunbar  /// in situations where the input file name does not match the original input
997d065d0f21b35f445cee13730398bc2bec6edff2Daniel Dunbar  /// file, for example with -save-temps.
1007d065d0f21b35f445cee13730398bc2bec6edff2Daniel Dunbar  std::string MainFileName;
1017d065d0f21b35f445cee13730398bc2bec6edff2Daniel Dunbar
102f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  /// The name of the relocation model to use.
103f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  std::string RelocationModel;
104f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
10570f92436f5828c11ef108463da4473d44e114c28Daniel Dunbarpublic:
1062811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth  CodeGenOptions() {
107f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    AsmVerbose = 0;
108efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    CXAAtExit = 1;
109efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    CXXCtorDtorAliases = 0;
110bbea7168326d810eff18dfb8bc43c7790fd55010Chris Lattner    DataSections = 0;
111f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    DebugInfo = 0;
112f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    DisableFPElim = 0;
113f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    DisableLLVMOpts = 0;
114f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    DisableRedZone = 0;
1157a536907da776bdc47a704e7cafd641e8150e653John McCall    EmitDeclMetadata = 0;
116bbea7168326d810eff18dfb8bc43c7790fd55010Chris Lattner    FunctionSections = 0;
117279b5eb6910d64a293e9c0e2887a05c65d8737d7John McCall    HiddenWeakTemplateVTables = 0;
118279b5eb6910d64a293e9c0e2887a05c65d8737d7John McCall    HiddenWeakVTables = 0;
11941a621d00e974829b75ff95cdff556755116dea1Douglas Gregor    InstrumentFunctions = 0;
120f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    MergeAllConstants = 1;
121f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    NoCommon = 0;
122f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    NoImplicitFloat = 0;
123f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    NoZeroInitializedInBSS = 0;
124f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar    ObjCDispatchMethod = Legacy;
1251ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar    OmitLeafFramePointer = 0;
12670f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar    OptimizationLevel = 0;
12770f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar    OptimizeSize = 0;
1284ecc9b73b3716775ed4e09091e300796a9a72378Daniel Dunbar    RelaxAll = 0;
1296b0cf67ae72a9ebb90e94cc9a14e09364a2b3466Daniel Dunbar    SimplifyLibCalls = 1;
1303b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar    SoftFloat = 0;
131445026698ca8f97ee7320464dedbe0d077b32d16Chris Lattner    TimePasses = 0;
132f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    UnitAtATime = 1;
133984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    UnrollLoops = 0;
134f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    UnwindTables = 0;
135f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    VerifyModule = 1;
136f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
137877db3852e29c5b5a2dc25b3fe4a3b78619aa904Daniel Dunbar    Inlining = NoInlining;
138f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    RelocationModel = "pic";
1391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
140f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar
141f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  ObjCDispatchMethodKind getObjCDispatchMethod() const {
142f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar    return ObjCDispatchMethodKind(ObjCDispatchMethod);
143f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  }
14470f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar};
14570f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar
14670f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar}  // end namespace clang
14770f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar
14870f92436f5828c11ef108463da4473d44e114c28Daniel Dunbar#endif
149