1226584Sdim//===-- llvm/Support/CodeGen.h - CodeGen Concepts ---------------*- C++ -*-===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim// 10226584Sdim// This file define some types which define code generation concepts. For 11226584Sdim// example, relocation model. 12226584Sdim// 13226584Sdim//===----------------------------------------------------------------------===// 14226584Sdim 15226584Sdim#ifndef LLVM_SUPPORT_CODEGEN_H 16226584Sdim#define LLVM_SUPPORT_CODEGEN_H 17226584Sdim 18251662Sdim#include "llvm-c/TargetMachine.h" 19251662Sdim#include "llvm/Support/ErrorHandling.h" 20251662Sdim 21226584Sdimnamespace llvm { 22226584Sdim 23226584Sdim // Relocation model types. 24226584Sdim namespace Reloc { 25226584Sdim enum Model { Default, Static, PIC_, DynamicNoPIC }; 26226584Sdim } 27226584Sdim 28226584Sdim // Code model types. 29226584Sdim namespace CodeModel { 30226584Sdim enum Model { Default, JITDefault, Small, Kernel, Medium, Large }; 31226584Sdim } 32226584Sdim 33234353Sdim // TLS models. 34234353Sdim namespace TLSModel { 35234353Sdim enum Model { 36234353Sdim GeneralDynamic, 37234353Sdim LocalDynamic, 38234353Sdim InitialExec, 39234353Sdim LocalExec 40234353Sdim }; 41234353Sdim } 42234353Sdim 43234353Sdim // Code generation optimization level. 44234353Sdim namespace CodeGenOpt { 45234353Sdim enum Level { 46234353Sdim None, // -O0 47234353Sdim Less, // -O1 48234353Sdim Default, // -O2, -Os 49234353Sdim Aggressive // -O3 50234353Sdim }; 51234353Sdim } 52234353Sdim 53251662Sdim // Create wrappers for C Binding types (see CBindingWrapping.h). 54251662Sdim inline CodeModel::Model unwrap(LLVMCodeModel Model) { 55251662Sdim switch (Model) { 56251662Sdim case LLVMCodeModelDefault: 57251662Sdim return CodeModel::Default; 58251662Sdim case LLVMCodeModelJITDefault: 59251662Sdim return CodeModel::JITDefault; 60251662Sdim case LLVMCodeModelSmall: 61251662Sdim return CodeModel::Small; 62251662Sdim case LLVMCodeModelKernel: 63251662Sdim return CodeModel::Kernel; 64251662Sdim case LLVMCodeModelMedium: 65251662Sdim return CodeModel::Medium; 66251662Sdim case LLVMCodeModelLarge: 67251662Sdim return CodeModel::Large; 68251662Sdim } 69251662Sdim return CodeModel::Default; 70251662Sdim } 71251662Sdim 72251662Sdim inline LLVMCodeModel wrap(CodeModel::Model Model) { 73251662Sdim switch (Model) { 74251662Sdim case CodeModel::Default: 75251662Sdim return LLVMCodeModelDefault; 76251662Sdim case CodeModel::JITDefault: 77251662Sdim return LLVMCodeModelJITDefault; 78251662Sdim case CodeModel::Small: 79251662Sdim return LLVMCodeModelSmall; 80251662Sdim case CodeModel::Kernel: 81251662Sdim return LLVMCodeModelKernel; 82251662Sdim case CodeModel::Medium: 83251662Sdim return LLVMCodeModelMedium; 84251662Sdim case CodeModel::Large: 85251662Sdim return LLVMCodeModelLarge; 86251662Sdim } 87251662Sdim llvm_unreachable("Bad CodeModel!"); 88251662Sdim } 89226584Sdim} // end llvm namespace 90226584Sdim 91226584Sdim#endif 92