Revert "[Orc] Directly emit machine code for the x86 resolver block and trampolines."
[oota-llvm.git] / include / llvm-c / OrcBindings.h
1 /*===----------- llvm-c/OrcBindings.h - Orc Lib C Iface ---------*- C++ -*-===*\
2 |*                                                                            *|
3 |*                     The LLVM Compiler Infrastructure                       *|
4 |*                                                                            *|
5 |* This file is distributed under the University of Illinois Open Source      *|
6 |* License. See LICENSE.TXT for details.                                      *|
7 |*                                                                            *|
8 |*===----------------------------------------------------------------------===*|
9 |*                                                                            *|
10 |* This header declares the C interface to libLLVMOrcJIT.a, which implements  *|
11 |* JIT compilation of LLVM IR.                                                *|
12 |*                                                                            *|
13 |* Many exotic languages can interoperate with C code but have a harder time  *|
14 |* with C++ due to name mangling. So in addition to C, this interface enables *|
15 |* tools written in such languages.                                           *|
16 |*                                                                            *|
17 |* Note: This interface is experimental. It is *NOT* stable, and may be       *|
18 |*       changed without warning.                                             *|
19 |*                                                                            *|
20 \*===----------------------------------------------------------------------===*/
21
22 #ifndef LLVM_C_ORCBINDINGS_H
23 #define LLVM_C_ORCBINDINGS_H
24
25 #include "llvm-c/Object.h"
26 #include "llvm-c/Support.h"
27 #include "llvm-c/TargetMachine.h"
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef;
34 typedef uint32_t LLVMOrcModuleHandle;
35 typedef uint64_t LLVMOrcTargetAddress;
36 typedef uint64_t (*LLVMOrcSymbolResolverFn)(const char *Name,
37                                             void *LookupCtx);
38 typedef uint64_t (*LLVMOrcLazyCompileCallbackFn)(LLVMOrcJITStackRef JITStack,
39                                                  void *CallbackCtx);
40
41 /**
42  * Create an ORC JIT stack.
43  *
44  * The client owns the resulting stack, and must call OrcDisposeInstance(...)
45  * to destroy it and free its memory. The JIT stack will take ownership of the
46  * TargetMachine, which will be destroyed when the stack is destroyed. The
47  * client should not attempt to dispose of the Target Machine, or it will result
48  * in a double-free.
49  */
50 LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM,
51                                          LLVMContextRef Context);
52
53 /**
54  * Mangle the given symbol.
55  * Memory will be allocated for MangledSymbol to hold the result. The client
56  */
57 void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledSymbol,
58                              const char *Symbol);
59
60 /**
61  * Dispose of a mangled symbol.
62  */
63
64 void LLVMOrcDisposeMangledSymbol(char *MangledSymbol);
65
66 /**
67  * Create a lazy compile callback.
68  */
69 LLVMOrcTargetAddress
70 LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
71                                  LLVMOrcLazyCompileCallbackFn Callback,
72                                  void *CallbackCtx);
73
74 /**
75  * Create a named indirect call stub.
76  */
77 void LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
78                                const char *StubName,
79                                LLVMOrcTargetAddress InitAddr);
80
81 /**
82  * Set the pointer for the given indirect stub.
83  */
84 void LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
85                                    const char *StubName,
86                                    LLVMOrcTargetAddress NewAddr);
87
88 /**
89  * Add module to be eagerly compiled.
90  */
91 LLVMOrcModuleHandle
92 LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
93                             LLVMOrcSymbolResolverFn SymbolResolver,
94                             void *SymbolResolverCtx);
95
96 /**
97  * Add module to be lazily compiled one function at a time.
98  */
99 LLVMOrcModuleHandle
100 LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
101                            LLVMOrcSymbolResolverFn SymbolResolver,
102                            void *SymbolResolverCtx);
103
104 /**
105  * Add an object file.
106  */
107 LLVMOrcModuleHandle
108 LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack, LLVMObjectFileRef Obj,
109                      LLVMOrcSymbolResolverFn SymbolResolver,
110                      void *SymbolResolverCtx);
111
112 /**
113  * Remove a module set from the JIT.
114  *
115  * This works for all modules that can be added via OrcAdd*, including object
116  * files.
117  */
118 void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H);
119
120 /**
121  * Get symbol address from JIT instance.
122  */
123 LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
124                                              const char *SymbolName);
125
126 /**
127  * Dispose of an ORC JIT stack.
128  */
129 void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack);
130
131 #ifdef __cplusplus
132 }
133 #endif /* extern "C" */
134
135 #endif /* LLVM_C_ORCBINDINGS_H */