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 18252723Sdim#include "llvm-c/TargetMachine.h" 19252723Sdim#include "llvm/Support/ErrorHandling.h" 20252723Sdim 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 33235633Sdim // TLS models. 34235633Sdim namespace TLSModel { 35235633Sdim enum Model { 36235633Sdim GeneralDynamic, 37235633Sdim LocalDynamic, 38235633Sdim InitialExec, 39235633Sdim LocalExec 40235633Sdim }; 41235633Sdim } 42235633Sdim 43235633Sdim // Code generation optimization level. 44235633Sdim namespace CodeGenOpt { 45235633Sdim enum Level { 46235633Sdim None, // -O0 47235633Sdim Less, // -O1 48235633Sdim Default, // -O2, -Os 49235633Sdim Aggressive // -O3 50235633Sdim }; 51235633Sdim } 52235633Sdim 53252723Sdim // Create wrappers for C Binding types (see CBindingWrapping.h). 54252723Sdim inline CodeModel::Model unwrap(LLVMCodeModel Model) { 55252723Sdim switch (Model) { 56252723Sdim case LLVMCodeModelDefault: 57252723Sdim return CodeModel::Default; 58252723Sdim case LLVMCodeModelJITDefault: 59252723Sdim return CodeModel::JITDefault; 60252723Sdim case LLVMCodeModelSmall: 61252723Sdim return CodeModel::Small; 62252723Sdim case LLVMCodeModelKernel: 63252723Sdim return CodeModel::Kernel; 64252723Sdim case LLVMCodeModelMedium: 65252723Sdim return CodeModel::Medium; 66252723Sdim case LLVMCodeModelLarge: 67252723Sdim return CodeModel::Large; 68252723Sdim } 69252723Sdim return CodeModel::Default; 70252723Sdim } 71252723Sdim 72252723Sdim inline LLVMCodeModel wrap(CodeModel::Model Model) { 73252723Sdim switch (Model) { 74252723Sdim case CodeModel::Default: 75252723Sdim return LLVMCodeModelDefault; 76252723Sdim case CodeModel::JITDefault: 77252723Sdim return LLVMCodeModelJITDefault; 78252723Sdim case CodeModel::Small: 79252723Sdim return LLVMCodeModelSmall; 80252723Sdim case CodeModel::Kernel: 81252723Sdim return LLVMCodeModelKernel; 82252723Sdim case CodeModel::Medium: 83252723Sdim return LLVMCodeModelMedium; 84252723Sdim case CodeModel::Large: 85252723Sdim return LLVMCodeModelLarge; 86252723Sdim } 87252723Sdim llvm_unreachable("Bad CodeModel!"); 88252723Sdim } 89226584Sdim} // end llvm namespace 90226584Sdim 91226584Sdim#endif 92