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