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   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