17801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//===-- llvm/Support/CodeGen.h - CodeGen Concepts ---------------*- C++ -*-===//
27801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//
37801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//                     The LLVM Compiler Infrastructure
47801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//
57801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng// This file is distributed under the University of Illinois Open Source
67801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng// License. See LICENSE.TXT for details.
77801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//
87801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//===----------------------------------------------------------------------===//
97801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//
107801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng// This file define some types which define code generation concepts. For
117801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng// example, relocation model.
127801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//
137801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng//===----------------------------------------------------------------------===//
147801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
157801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#ifndef LLVM_SUPPORT_CODEGEN_H
167801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#define LLVM_SUPPORT_CODEGEN_H
177801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
180e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo#include "llvm-c/TargetMachine.h"
190e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo#include "llvm/Support/ErrorHandling.h"
200e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
217801136b95d1fbe515b9655b73ada39b05a33559Evan Chengnamespace llvm {
227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
237801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  // Relocation model types.
247801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  namespace Reloc {
257801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    enum Model { Default, Static, PIC_, DynamicNoPIC };
267801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  }
277801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
287801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  // Code model types.
297801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  namespace CodeModel {
307801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    enum Model { Default, JITDefault, Small, Kernel, Medium, Large };
317801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  }
327801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
3334797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth  // TLS models.
3434797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth  namespace TLSModel {
3534797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth    enum Model {
3634797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth      GeneralDynamic,
3734797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth      LocalDynamic,
3834797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth      InitialExec,
3934797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth      LocalExec
4034797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth    };
4134797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth  }
4234797136cb9fa9f450c0e1c47983482083979dd4Chandler Carruth
43b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  // Code generation optimization level.
44b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  namespace CodeGenOpt {
45b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    enum Level {
46b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      None,        // -O0
47b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      Less,        // -O1
48b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      Default,     // -O2, -Os
49b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      Aggressive   // -O3
50b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    };
51b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  }
52b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng
530e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  // Create wrappers for C Binding types (see CBindingWrapping.h).
540e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  inline CodeModel::Model unwrap(LLVMCodeModel Model) {
550e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    switch (Model) {
560e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case LLVMCodeModelDefault:
570e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return CodeModel::Default;
580e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case LLVMCodeModelJITDefault:
590e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return CodeModel::JITDefault;
600e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case LLVMCodeModelSmall:
610e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return CodeModel::Small;
620e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case LLVMCodeModelKernel:
630e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return CodeModel::Kernel;
640e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case LLVMCodeModelMedium:
650e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return CodeModel::Medium;
660e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case LLVMCodeModelLarge:
670e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return CodeModel::Large;
680e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    }
690e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    return CodeModel::Default;
700e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  }
710e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
720e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  inline LLVMCodeModel wrap(CodeModel::Model Model) {
730e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    switch (Model) {
740e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case CodeModel::Default:
750e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return LLVMCodeModelDefault;
760e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case CodeModel::JITDefault:
770e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return LLVMCodeModelJITDefault;
780e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case CodeModel::Small:
790e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return LLVMCodeModelSmall;
800e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case CodeModel::Kernel:
810e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return LLVMCodeModelKernel;
820e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case CodeModel::Medium:
830e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return LLVMCodeModelMedium;
840e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      case CodeModel::Large:
850e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo        return LLVMCodeModelLarge;
860e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    }
870e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    llvm_unreachable("Bad CodeModel!");
880e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  }
897801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng}  // end llvm namespace
907801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
917801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#endif
92