Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- llvm/Support/CodeGen.h - CodeGen Concepts ---------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file define some types which define code generation concepts. For
  10. // example, relocation model.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_SUPPORT_CODEGEN_H
  15. #define LLVM_SUPPORT_CODEGEN_H
  16.  
  17. #include <cstdint>
  18. #include <optional>
  19.  
  20. namespace llvm {
  21.  
  22.   // Relocation model types.
  23.   namespace Reloc {
  24.     // Cannot be named PIC due to collision with -DPIC
  25.     enum Model { Static, PIC_, DynamicNoPIC, ROPI, RWPI, ROPI_RWPI };
  26.   }
  27.  
  28.   // Code model types.
  29.   namespace CodeModel {
  30.     // Sync changes with CodeGenCWrappers.h.
  31.     enum Model { Tiny, Small, Kernel, Medium, Large };
  32.   }
  33.  
  34.   namespace PICLevel {
  35.     // This is used to map -fpic/-fPIC.
  36.     enum Level { NotPIC=0, SmallPIC=1, BigPIC=2 };
  37.   }
  38.  
  39.   namespace PIELevel {
  40.     enum Level { Default=0, Small=1, Large=2 };
  41.   }
  42.  
  43.   // TLS models.
  44.   namespace TLSModel {
  45.     enum Model {
  46.       GeneralDynamic,
  47.       LocalDynamic,
  48.       InitialExec,
  49.       LocalExec
  50.     };
  51.   }
  52.  
  53.   namespace CodeGenOpt {
  54.   /// Type for the unique integer IDs of code generation optimization levels.
  55.   using IDType = int;
  56.   /// Code generation optimization level.
  57.   enum Level : IDType {
  58.     None = 0,      ///< -O0
  59.     Less = 1,      ///< -O1
  60.     Default = 2,   ///< -O2, -Os
  61.     Aggressive = 3 ///< -O3
  62.   };
  63.   /// Get the \c Level identified by the integer \p ID.
  64.   ///
  65.   /// Returns std::nullopt if \p ID is invalid.
  66.   inline std::optional<Level> getLevel(IDType ID) {
  67.     if (ID < 0 || ID > 3)
  68.       return std::nullopt;
  69.     return static_cast<Level>(ID);
  70.   }
  71.   /// Parse \p C as a single digit integer ID and get matching \c Level.
  72.   ///
  73.   /// Returns std::nullopt if the input is not a valid digit or not a valid ID.
  74.   inline std::optional<Level> parseLevel(char C) {
  75.     if (C < '0')
  76.       return std::nullopt;
  77.     return getLevel(static_cast<IDType>(C - '0'));
  78.   }
  79.   } // namespace CodeGenOpt
  80.  
  81.   /// These enums are meant to be passed into addPassesToEmitFile to indicate
  82.   /// what type of file to emit, and returned by it to indicate what type of
  83.   /// file could actually be made.
  84.   enum CodeGenFileType {
  85.     CGFT_AssemblyFile,
  86.     CGFT_ObjectFile,
  87.     CGFT_Null         // Do not emit any output.
  88.   };
  89.  
  90.   // Specify what functions should keep the frame pointer.
  91.   enum class FramePointerKind { None, NonLeaf, All };
  92.  
  93.   // Specify what type of zeroing callee-used registers.
  94.   namespace ZeroCallUsedRegs {
  95.   const unsigned ONLY_USED = 1U << 1;
  96.   const unsigned ONLY_GPR = 1U << 2;
  97.   const unsigned ONLY_ARG = 1U << 3;
  98.  
  99.   enum class ZeroCallUsedRegsKind : unsigned int {
  100.     // Don't zero any call-used regs.
  101.     Skip = 1U << 0,
  102.     // Only zeros call-used GPRs used in the fn and pass args.
  103.     UsedGPRArg = ONLY_USED | ONLY_GPR | ONLY_ARG,
  104.     // Only zeros call-used GPRs used in the fn.
  105.     UsedGPR = ONLY_USED | ONLY_GPR,
  106.     // Only zeros call-used regs used in the fn and pass args.
  107.     UsedArg = ONLY_USED | ONLY_ARG,
  108.     // Only zeros call-used regs used in the fn.
  109.     Used = ONLY_USED,
  110.     // Zeros all call-used GPRs that pass args.
  111.     AllGPRArg = ONLY_GPR | ONLY_ARG,
  112.     // Zeros all call-used GPRs.
  113.     AllGPR = ONLY_GPR,
  114.     // Zeros all call-used regs that pass args.
  115.     AllArg = ONLY_ARG,
  116.     // Zeros all call-used regs.
  117.     All = 0,
  118.   };
  119.   } // namespace ZeroCallUsedRegs
  120.  
  121.   enum class UWTableKind {
  122.     None = 0,  ///< No unwind table requested
  123.     Sync = 1,  ///< "Synchronous" unwind tables
  124.     Async = 2, ///< "Asynchronous" unwind tables (instr precise)
  125.     Default = 2,
  126.   };
  127.  
  128.   enum class FunctionReturnThunksKind : unsigned int {
  129.     Keep = 0,    ///< No function return thunk.
  130.     Extern = 1,  ///< Replace returns with jump to thunk, don't emit thunk.
  131.     Invalid = 2, ///< Not used.
  132.   };
  133.  
  134.   } // namespace llvm
  135.  
  136. #endif
  137.