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