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"
23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm-c/Target.h"
24d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
25d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifdef __cplusplus
26d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsextern "C" {
27d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif
28c9e180aaea66d0b167580d911772e4a867a5efaeFilip Pizlotypedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef;
29d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef struct LLVMTarget *LLVMTargetRef;
30d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
31d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
32d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelNone,
33d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelLess,
34d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelDefault,
35d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeGenLevelAggressive
36d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeGenOptLevel;
37d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
38d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
39d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocDefault,
40d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocStatic,
41d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocPIC,
42d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMRelocDynamicNoPic
43d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMRelocMode;
44d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
45d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
46d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelDefault,
47d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelJITDefault,
48d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelSmall,
49d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelKernel,
50d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelMedium,
51d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMCodeModelLarge
52d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeModel;
53d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
54d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum {
55d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMAssemblyFile,
56d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands    LLVMObjectFile
57d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeGenFileType;
58d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
59d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the first llvm::Target in the registered targets list. */
60f89dacb78244825a5c555be1eb4c18d12365845cAnders WaldenborgLLVMTargetRef LLVMGetFirstTarget(void);
61d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the next llvm::Target given a previous one (or null if there's none) */
62d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T);
63d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
64d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- Target ------------------------------------------------------------===*/
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/** Finds the target corresponding to the given name and stores it in \p T.
661acb2127bad420af19a5929df54a892957ba3c13Peter Zotov  Returns 0 on success. */
675ea0c20ce7a161d23a9bf8f1beea0ffb6a02898cPeter ZotovLLVMTargetRef LLVMGetTargetFromName(const char *Name);
681acb2127bad420af19a5929df54a892957ba3c13Peter Zotov
691acb2127bad420af19a5929df54a892957ba3c13Peter Zotov/** Finds the target corresponding to the given triple and stores it in \p T.
701acb2127bad420af19a5929df54a892957ba3c13Peter Zotov  Returns 0 on success. Optionally returns any error in ErrorMessage.
711acb2127bad420af19a5929df54a892957ba3c13Peter Zotov  Use LLVMDisposeMessage to dispose the message. */
721acb2127bad420af19a5929df54a892957ba3c13Peter ZotovLLVMBool LLVMGetTargetFromTriple(const char* Triple, LLVMTargetRef *T,
731acb2127bad420af19a5929df54a892957ba3c13Peter Zotov                                 char **ErrorMessage);
741acb2127bad420af19a5929df54a892957ba3c13Peter Zotov
75d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the name of a target. See llvm::Target::getName */
76d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char *LLVMGetTargetName(LLVMTargetRef T);
77d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
78d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the description  of a target. See llvm::Target::getDescription */
79d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char *LLVMGetTargetDescription(LLVMTargetRef T);
80d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
81d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target has a JIT */
82d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasJIT(LLVMTargetRef T);
83d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
84d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target has a TargetMachine associated */
85d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T);
86d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
87d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target as an ASM backend (required for emitting output) */
88d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T);
89d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
90d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- Target Machine ----------------------------------------------------===*/
91d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */
92fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter ZotovLLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T,
93fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov  const char *Triple, const char *CPU, const char *Features,
94fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov  LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, LLVMCodeModel CodeModel);
95d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
96d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Dispose the LLVMTargetMachineRef instance generated by
97d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMCreateTargetMachine. */
98d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsvoid LLVMDisposeTargetMachine(LLVMTargetMachineRef T);
99d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
100d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the Target used in a TargetMachine */
101d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T);
102d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
103d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the triple used creating this target machine. See
104d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  llvm::TargetMachine::getTriple. The result needs to be disposed with
105d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMDisposeMessage. */
106d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T);
107d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
108d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the cpu used creating this target machine. See
109d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  llvm::TargetMachine::getCPU. The result needs to be disposed with
110d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMDisposeMessage. */
111d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T);
112d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
113d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the feature string used creating this target machine. See
114d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  llvm::TargetMachine::getFeatureString. The result needs to be disposed with
115d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  LLVMDisposeMessage. */
116d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T);
117d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
1183574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow/** Returns the llvm::DataLayout used for this llvm:TargetMachine. */
119d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T);
120d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
1211acb2127bad420af19a5929df54a892957ba3c13Peter Zotov/** Set the target machine's ASM verbosity. */
1221acb2127bad420af19a5929df54a892957ba3c13Peter Zotovvoid LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T,
1231acb2127bad420af19a5929df54a892957ba3c13Peter Zotov                                      LLVMBool VerboseAsm);
1241acb2127bad420af19a5929df54a892957ba3c13Peter Zotov
125d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Emits an asm or object file for the given module to the filename. This
126d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  wraps several c++ only classes (among them a file stream). Returns any
127d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */
128d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
129d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands  char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage);
130d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
131ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */
132ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom StellardLLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M,
133ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard  LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf);
1341acb2127bad420af19a5929df54a892957ba3c13Peter Zotov
1351acb2127bad420af19a5929df54a892957ba3c13Peter Zotov/*===-- Triple ------------------------------------------------------------===*/
1361acb2127bad420af19a5929df54a892957ba3c13Peter Zotov/** Get a triple for the host machine as a string. The result needs to be
1371acb2127bad420af19a5929df54a892957ba3c13Peter Zotov  disposed with LLVMDisposeMessage. */
1381acb2127bad420af19a5929df54a892957ba3c13Peter Zotovchar* LLVMGetDefaultTargetTriple(void);
1391acb2127bad420af19a5929df54a892957ba3c13Peter Zotov
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/** Adds the target-specific analysis passes to the pass manager. */
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM);
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
143d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifdef __cplusplus
144d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands}
1459313da5a90838c7242101dae250e86dcfc708e6aEvan Cheng#endif
146d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands
147d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif
148