blob: de2969ab1c9bbb5baa2986172e8823de27394e80 [file] [log] [blame]
Lang Hames130a7c42015-10-28 02:40:04 +00001/*===----------- 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"
Lang Hames130a7c42015-10-28 02:40:04 +000026#include "llvm-c/TargetMachine.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef;
33typedef uint32_t LLVMOrcModuleHandle;
34typedef uint64_t LLVMOrcTargetAddress;
Lang Hames1fa0e0e2016-04-25 21:21:20 +000035typedef uint64_t (*LLVMOrcSymbolResolverFn)(const char *Name, void *LookupCtx);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000036typedef uint64_t (*LLVMOrcLazyCompileCallbackFn)(LLVMOrcJITStackRef JITStack,
37 void *CallbackCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000038
Lang Hames1fa0e0e2016-04-25 21:21:20 +000039typedef enum { LLVMOrcErrSuccess = 0, LLVMOrcErrGeneric } LLVMOrcErrorCode;
Lang Hamesef5a0ee2016-04-25 19:56:45 +000040
Lang Hames130a7c42015-10-28 02:40:04 +000041/**
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 */
Rafael Espindolae63e0182015-11-03 16:40:37 +000050LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM);
Lang Hames130a7c42015-10-28 02:40:04 +000051
52/**
Lang Hamesef5a0ee2016-04-25 19:56:45 +000053 * 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/**
Lang Hames130a7c42015-10-28 02:40:04 +000061 * 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 */
Lang Hames130a7c42015-10-28 02:40:04 +000070void LLVMOrcDisposeMangledSymbol(char *MangledSymbol);
71
72/**
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000073 * Create a lazy compile callback.
74 */
75LLVMOrcTargetAddress
76LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
77 LLVMOrcLazyCompileCallbackFn Callback,
78 void *CallbackCtx);
79
80/**
81 * Create a named indirect call stub.
82 */
Lang Hamesef5a0ee2016-04-25 19:56:45 +000083LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
84 const char *StubName,
85 LLVMOrcTargetAddress InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000086
87/**
88 * Set the pointer for the given indirect stub.
89 */
Lang Hamesef5a0ee2016-04-25 19:56:45 +000090LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
91 const char *StubName,
92 LLVMOrcTargetAddress NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000093
94/**
Lang Hames130a7c42015-10-28 02:40:04 +000095 * Add module to be eagerly compiled.
96 */
97LLVMOrcModuleHandle
98LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
99 LLVMOrcSymbolResolverFn SymbolResolver,
100 void *SymbolResolverCtx);
101
102/**
103 * Add module to be lazily compiled one function at a time.
104 */
105LLVMOrcModuleHandle
106LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
107 LLVMOrcSymbolResolverFn SymbolResolver,
108 void *SymbolResolverCtx);
109
110/**
111 * Add an object file.
112 */
Lang Hames1fa0e0e2016-04-25 21:21:20 +0000113LLVMOrcModuleHandle LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack,
114 LLVMObjectFileRef Obj,
115 LLVMOrcSymbolResolverFn SymbolResolver,
116 void *SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +0000117
118/**
119 * Remove a module set from the JIT.
120 *
121 * This works for all modules that can be added via OrcAdd*, including object
122 * files.
123 */
124void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H);
125
126/**
127 * Get symbol address from JIT instance.
128 */
129LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
130 const char *SymbolName);
131
132/**
133 * Dispose of an ORC JIT stack.
134 */
135void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack);
136
137#ifdef __cplusplus
138}
139#endif /* extern "C" */
140
141#endif /* LLVM_C_ORCBINDINGS_H */