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 namespace PICLevel { 34 enum Level { Default=0, Small=1, Large=2 }; 35 } 36 37 // TLS models. 38 namespace TLSModel { 39 enum Model { 40 GeneralDynamic, 41 LocalDynamic, 42 InitialExec, 43 LocalExec 44 }; 45 } 46 47 // Code generation optimization level. 48 namespace CodeGenOpt { 49 enum Level { 50 None, // -O0 51 Less, // -O1 52 Default, // -O2, -Os 53 Aggressive // -O3 54 }; 55 } 56 57 // Create wrappers for C Binding types (see CBindingWrapping.h). 58 inline CodeModel::Model unwrap(LLVMCodeModel Model) { 59 switch (Model) { 60 case LLVMCodeModelDefault: 61 return CodeModel::Default; 62 case LLVMCodeModelJITDefault: 63 return CodeModel::JITDefault; 64 case LLVMCodeModelSmall: 65 return CodeModel::Small; 66 case LLVMCodeModelKernel: 67 return CodeModel::Kernel; 68 case LLVMCodeModelMedium: 69 return CodeModel::Medium; 70 case LLVMCodeModelLarge: 71 return CodeModel::Large; 72 } 73 return CodeModel::Default; 74 } 75 76 inline LLVMCodeModel wrap(CodeModel::Model Model) { 77 switch (Model) { 78 case CodeModel::Default: 79 return LLVMCodeModelDefault; 80 case CodeModel::JITDefault: 81 return LLVMCodeModelJITDefault; 82 case CodeModel::Small: 83 return LLVMCodeModelSmall; 84 case CodeModel::Kernel: 85 return LLVMCodeModelKernel; 86 case CodeModel::Medium: 87 return LLVMCodeModelMedium; 88 case CodeModel::Large: 89 return LLVMCodeModelLarge; 90 } 91 llvm_unreachable("Bad CodeModel!"); 92 } 93 } // end llvm namespace 94 95 #endif 96