Home | History | Annotate | Download | only in Frontend
      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   /// The code model to use (-mcmodel).
     75   std::string CodeModel;
     76 
     77   /// The filename with path we use for coverage files. The extension will be
     78   /// replaced.
     79   std::string CoverageFile;
     80 
     81   /// The version string to put into coverage files.
     82   char CoverageVersion[4];
     83 
     84   /// Enable additional debugging information.
     85   std::string DebugPass;
     86 
     87   /// The string to embed in debug information as the current working directory.
     88   std::string DebugCompilationDir;
     89 
     90   /// The string to embed in the debug information for the compile unit, if
     91   /// non-empty.
     92   std::string DwarfDebugFlags;
     93 
     94   /// The ABI to use for passing floating point arguments.
     95   std::string FloatABI;
     96 
     97   /// The float precision limit to use, if non-empty.
     98   std::string LimitFloatPrecision;
     99 
    100   /// The name of the bitcode file to link before optzns.
    101   std::string LinkBitcodeFile;
    102 
    103   /// The user provided name for the "main file", if non-empty. This is useful
    104   /// in situations where the input file name does not match the original input
    105   /// file, for example with -save-temps.
    106   std::string MainFileName;
    107 
    108   /// The name for the split debug info file that we'll break out. This is used
    109   /// in the backend for setting the name in the skeleton cu.
    110   std::string SplitDwarfFile;
    111 
    112   /// The name of the relocation model to use.
    113   std::string RelocationModel;
    114 
    115   /// Path to blacklist file for sanitizers.
    116   std::string SanitizerBlacklistFile;
    117 
    118   /// If not an empty string, trap intrinsics are lowered to calls to this
    119   /// function instead of to trap instructions.
    120   std::string TrapFuncName;
    121 
    122   /// A list of command-line options to forward to the LLVM backend.
    123   std::vector<std::string> BackendOptions;
    124 
    125 public:
    126   // Define accessors/mutators for code generation options of enumeration type.
    127 #define CODEGENOPT(Name, Bits, Default)
    128 #define ENUM_CODEGENOPT(Name, Type, Bits, Default) \
    129   Type get##Name() const { return static_cast<Type>(Name); } \
    130   void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
    131 #include "clang/Frontend/CodeGenOptions.def"
    132 
    133   CodeGenOptions() {
    134 #define CODEGENOPT(Name, Bits, Default) Name = Default;
    135 #define ENUM_CODEGENOPT(Name, Type, Bits, Default) \
    136   set##Name(Default);
    137 #include "clang/Frontend/CodeGenOptions.def"
    138 
    139     RelocationModel = "pic";
    140     memcpy(CoverageVersion, "*204", 4);
    141   }
    142 };
    143 
    144 }  // end namespace clang
    145 
    146 #endif
    147