blob: 9497f0d40776fbe9dca96d5f77bdf8fe3b9da0d1 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001/*===----------- 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/TargetMachine.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef;
33typedef uint64_t LLVMOrcModuleHandle;
34typedef uint64_t LLVMOrcTargetAddress;
35typedef uint64_t (*LLVMOrcSymbolResolverFn)(const char *Name, void *LookupCtx);
36typedef uint64_t (*LLVMOrcLazyCompileCallbackFn)(LLVMOrcJITStackRef JITStack,
37 void *CallbackCtx);
38
39typedef enum { LLVMOrcErrSuccess = 0, LLVMOrcErrGeneric } LLVMOrcErrorCode;
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 */
50LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM);
51
52/**
53 * Get the error message for the most recent error (if any).
54 *
55 * This message is owned by the ORC JIT Stack and will be freed when the stack
56 * is disposed of by LLVMOrcDisposeInstance.
57 */
58const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack);
59
60/**
61 * Mangle the given symbol.
62 * Memory will be allocated for MangledSymbol to hold the result. The client
63 */
64void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledSymbol,
65 const char *Symbol);
66
67/**
68 * Dispose of a mangled symbol.
69 */
70void LLVMOrcDisposeMangledSymbol(char *MangledSymbol);
71
72/**
73 * Create a lazy compile callback.
74 */
75LLVMOrcErrorCode
76LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
77 LLVMOrcTargetAddress *RetAddr,
78 LLVMOrcLazyCompileCallbackFn Callback,
79 void *CallbackCtx);
80
81/**
82 * Create a named indirect call stub.
83 */
84LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
85 const char *StubName,
86 LLVMOrcTargetAddress InitAddr);
87
88/**
89 * Set the pointer for the given indirect stub.
90 */
91LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
92 const char *StubName,
93 LLVMOrcTargetAddress NewAddr);
94
95/**
96 * Add module to be eagerly compiled.
97 */
98LLVMOrcErrorCode
99LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
100 LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod,
101 LLVMOrcSymbolResolverFn SymbolResolver,
102 void *SymbolResolverCtx);
103
104/**
105 * Add module to be lazily compiled one function at a time.
106 */
107LLVMOrcErrorCode
108LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack,
109 LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod,
110 LLVMOrcSymbolResolverFn SymbolResolver,
111 void *SymbolResolverCtx);
112
113/**
114 * Add an object file.
115 *
116 * This method takes ownership of the given memory buffer and attempts to add
117 * it to the JIT as an object file.
118 * Clients should *not* dispose of the 'Obj' argument: the JIT will manage it
119 * from this call onwards.
120 */
121LLVMOrcErrorCode LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack,
122 LLVMOrcModuleHandle *RetHandle,
123 LLVMMemoryBufferRef Obj,
124 LLVMOrcSymbolResolverFn SymbolResolver,
125 void *SymbolResolverCtx);
126
127/**
128 * Remove a module set from the JIT.
129 *
130 * This works for all modules that can be added via OrcAdd*, including object
131 * files.
132 */
133LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack,
134 LLVMOrcModuleHandle H);
135
136/**
137 * Get symbol address from JIT instance.
138 */
139LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
140 LLVMOrcTargetAddress *RetAddr,
141 const char *SymbolName);
142
143/**
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100144 * Get symbol address from JIT instance, searching only the specified
145 * handle.
146 */
147LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack,
148 LLVMOrcTargetAddress *RetAddr,
149 LLVMOrcModuleHandle H,
150 const char *SymbolName);
151
152/**
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100153 * Dispose of an ORC JIT stack.
154 */
155LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack);
156
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100157/**
158 * Register a JIT Event Listener.
159 *
160 * A NULL listener is ignored.
161 */
162void LLVMOrcRegisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L);
163
164/**
165 * Unegister a JIT Event Listener.
166 *
167 * A NULL listener is ignored.
168 */
169void LLVMOrcUnregisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L);
170
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100171#ifdef __cplusplus
172}
173#endif /* extern "C" */
174
175#endif /* LLVM_C_ORCBINDINGS_H */