1d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- llvm-c/TargetMachine.h - Target Machine Library C Interface - C++ -*-=*\
2d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                                                                            *|
3d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                     The LLVM Compiler Infrastructure                       *|
4d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                                                                            *|
5d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* This file is distributed under the University of Illinois Open Source      *|
6d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* License. See LICENSE.TXT for details.                                      *|
7d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                                                                            *|
8d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*===----------------------------------------------------------------------===*|
9d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                                                                            *|
10d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* This header declares the C interface to the Target and TargetMachine       *|
11d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* classes, which can be used to generate assembly or object files.           *|
12d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                                                                            *|
13d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* Many exotic languages can interoperate with C code but have a harder time  *|
14d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* with C++ due to name mangling. So in addition to C, this interface enables *|
15d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* tools written in such languages.                                           *|
16d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*                                                                            *|
17d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands\*===----------------------------------------------------------------------===*/
18d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
19d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifndef LLVM_C_TARGETMACHINE_H
20d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#define LLVM_C_TARGETMACHINE_H
21d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
22d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include "llvm-c/Core.h"
23d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
24d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifdef __cplusplus
25d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsextern "C" {
26d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif
27d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef struct LLVMTargetMachine *LLVMTargetMachineRef;
28d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef struct LLVMTarget *LLVMTargetRef;
29d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
30d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
31d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelNone,
32d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelLess,
33d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelDefault,
34d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelAggressive
35d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeGenOptLevel;
36d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
37d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
38d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocDefault,
39d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocStatic,
40d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocPIC,
41d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocDynamicNoPic
42d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMRelocMode;
43d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
44d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
45d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelDefault,
46d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelJITDefault,
47d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelSmall,
48d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelKernel,
49d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelMedium,
50d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelLarge
51d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeModel;
52d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
53d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
54d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMAssemblyFile,
55d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMObjectFile
56d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeGenFileType;
57d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
58d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the first llvm::Target in the registered targets list. */
59d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetFirstTarget();
60d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the next llvm::Target given a previous one (or null if there's none) */
61d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T);
62d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
63d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- Target ------------------------------------------------------------===*/
64d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the name of a target. See llvm::Target::getName */
65d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char *LLVMGetTargetName(LLVMTargetRef T);
66d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
67d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the description  of a target. See llvm::Target::getDescription */
68d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char *LLVMGetTargetDescription(LLVMTargetRef T);
69d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
70d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target has a JIT */
71d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasJIT(LLVMTargetRef T);
72d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
73d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target has a TargetMachine associated */
74d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T);
75d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
76d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target as an ASM backend (required for emitting output) */
77d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T);
78d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
79d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- Target Machine ----------------------------------------------------===*/
80d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */
81d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, char *Triple,
82d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  char *CPU, char *Features, LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc,
83d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMCodeModel CodeModel);
84d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
85d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Dispose the LLVMTargetMachineRef instance generated by
86d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMCreateTargetMachine. */
87d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsvoid LLVMDisposeTargetMachine(LLVMTargetMachineRef T);
88d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
89d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the Target used in a TargetMachine */
90d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T);
91d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
92d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the triple used creating this target machine. See
93d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  llvm::TargetMachine::getTriple. The result needs to be disposed with
94d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMDisposeMessage. */
95d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T);
96d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
97d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the cpu used creating this target machine. See
98d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  llvm::TargetMachine::getCPU. The result needs to be disposed with
99d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMDisposeMessage. */
100d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T);
101d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
102d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the feature string used creating this target machine. See
103d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  llvm::TargetMachine::getFeatureString. The result needs to be disposed with
104d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMDisposeMessage. */
105d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T);
106d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
107d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the llvm::TargetData used for this llvm:TargetMachine. */
108d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T);
109d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
110d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Emits an asm or object file for the given module to the filename. This
111d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  wraps several c++ only classes (among them a file stream). Returns any
112d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */
113d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
114d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage);
115d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
116d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
117d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
118d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
119d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifdef __cplusplus
120d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands}
121d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
122d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsnamespace llvm {
123d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  class TargetMachine;
124d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  class Target;
125d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
126d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  inline TargetMachine *unwrap(LLVMTargetMachineRef P) {
127d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    return reinterpret_cast<TargetMachine*>(P);
128d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  }
129d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  inline Target *unwrap(LLVMTargetRef P) {
130d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    return reinterpret_cast<Target*>(P);
131d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  }
132d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  inline LLVMTargetMachineRef wrap(const TargetMachine *P) {
133d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    return reinterpret_cast<LLVMTargetMachineRef>(
134d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands      const_cast<TargetMachine*>(P));
135d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  }
136d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  inline LLVMTargetRef wrap(const Target * P) {
137d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    return reinterpret_cast<LLVMTargetRef>(const_cast<Target*>(P));
138d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  }
139d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands}
140d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif
141d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
142d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif
143