Home | History | Annotate | Download | only in Support
      1 //===-- llvm/Support/CodeGen.h - CodeGen Concepts ---------------*- 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 define some types which define code generation concepts. For
     11 // example, relocation model.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_SUPPORT_CODEGEN_H
     16 #define LLVM_SUPPORT_CODEGEN_H
     17 
     18 #include "llvm-c/TargetMachine.h"
     19 #include "llvm/Support/ErrorHandling.h"
     20 
     21 namespace llvm {
     22 
     23   // Relocation model types.
     24   namespace Reloc {
     25     enum Model { Default, Static, PIC_, DynamicNoPIC };
     26   }
     27 
     28   // Code model types.
     29   namespace CodeModel {
     30     enum Model { Default, JITDefault, Small, Kernel, Medium, Large };
     31   }
     32 
     33   // TLS models.
     34   namespace TLSModel {
     35     enum Model {
     36       GeneralDynamic,
     37       LocalDynamic,
     38       InitialExec,
     39       LocalExec
     40     };
     41   }
     42 
     43   // Code generation optimization level.
     44   namespace CodeGenOpt {
     45     enum Level {
     46       None,        // -O0
     47       Less,        // -O1
     48       Default,     // -O2, -Os
     49       Aggressive   // -O3
     50     };
     51   }
     52 
     53   // Create wrappers for C Binding types (see CBindingWrapping.h).
     54   inline CodeModel::Model unwrap(LLVMCodeModel Model) {
     55     switch (Model) {
     56       case LLVMCodeModelDefault:
     57         return CodeModel::Default;
     58       case LLVMCodeModelJITDefault:
     59         return CodeModel::JITDefault;
     60       case LLVMCodeModelSmall:
     61         return CodeModel::Small;
     62       case LLVMCodeModelKernel:
     63         return CodeModel::Kernel;
     64       case LLVMCodeModelMedium:
     65         return CodeModel::Medium;
     66       case LLVMCodeModelLarge:
     67         return CodeModel::Large;
     68     }
     69     return CodeModel::Default;
     70   }
     71 
     72   inline LLVMCodeModel wrap(CodeModel::Model Model) {
     73     switch (Model) {
     74       case CodeModel::Default:
     75         return LLVMCodeModelDefault;
     76       case CodeModel::JITDefault:
     77         return LLVMCodeModelJITDefault;
     78       case CodeModel::Small:
     79         return LLVMCodeModelSmall;
     80       case CodeModel::Kernel:
     81         return LLVMCodeModelKernel;
     82       case CodeModel::Medium:
     83         return LLVMCodeModelMedium;
     84       case CodeModel::Large:
     85         return LLVMCodeModelLarge;
     86     }
     87     llvm_unreachable("Bad CodeModel!");
     88   }
     89 }  // end llvm namespace
     90 
     91 #endif
     92