1292915Sdim/*===----------- llvm-c/OrcBindings.h - Orc Lib C Iface ---------*- C++ -*-===*\
2292915Sdim|*                                                                            *|
3292915Sdim|*                     The LLVM Compiler Infrastructure                       *|
4292915Sdim|*                                                                            *|
5292915Sdim|* This file is distributed under the University of Illinois Open Source      *|
6292915Sdim|* License. See LICENSE.TXT for details.                                      *|
7292915Sdim|*                                                                            *|
8292915Sdim|*===----------------------------------------------------------------------===*|
9292915Sdim|*                                                                            *|
10292915Sdim|* This header declares the C interface to libLLVMOrcJIT.a, which implements  *|
11292915Sdim|* JIT compilation of LLVM IR.                                                *|
12292915Sdim|*                                                                            *|
13292915Sdim|* Many exotic languages can interoperate with C code but have a harder time  *|
14292915Sdim|* with C++ due to name mangling. So in addition to C, this interface enables *|
15292915Sdim|* tools written in such languages.                                           *|
16292915Sdim|*                                                                            *|
17292915Sdim|* Note: This interface is experimental. It is *NOT* stable, and may be       *|
18292915Sdim|*       changed without warning.                                             *|
19292915Sdim|*                                                                            *|
20292915Sdim\*===----------------------------------------------------------------------===*/
21292915Sdim
22292915Sdim#ifndef LLVM_C_ORCBINDINGS_H
23292915Sdim#define LLVM_C_ORCBINDINGS_H
24292915Sdim
25292915Sdim#include "llvm-c/Object.h"
26292915Sdim#include "llvm-c/Support.h"
27292915Sdim#include "llvm-c/TargetMachine.h"
28292915Sdim
29292915Sdim#ifdef __cplusplus
30292915Sdimextern "C" {
31292915Sdim#endif
32292915Sdim
33292915Sdimtypedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef;
34292915Sdimtypedef uint32_t LLVMOrcModuleHandle;
35292915Sdimtypedef uint64_t LLVMOrcTargetAddress;
36292915Sdimtypedef uint64_t (*LLVMOrcSymbolResolverFn)(const char *Name,
37292915Sdim                                            void *LookupCtx);
38292915Sdimtypedef uint64_t (*LLVMOrcLazyCompileCallbackFn)(LLVMOrcJITStackRef JITStack,
39292915Sdim                                                 void *CallbackCtx);
40292915Sdim
41292915Sdim/**
42292915Sdim * Create an ORC JIT stack.
43292915Sdim *
44292915Sdim * The client owns the resulting stack, and must call OrcDisposeInstance(...)
45292915Sdim * to destroy it and free its memory. The JIT stack will take ownership of the
46292915Sdim * TargetMachine, which will be destroyed when the stack is destroyed. The
47292915Sdim * client should not attempt to dispose of the Target Machine, or it will result
48292915Sdim * in a double-free.
49292915Sdim */
50292915SdimLLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM);
51292915Sdim
52292915Sdim/**
53292915Sdim * Mangle the given symbol.
54292915Sdim * Memory will be allocated for MangledSymbol to hold the result. The client
55292915Sdim */
56292915Sdimvoid LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledSymbol,
57292915Sdim                             const char *Symbol);
58292915Sdim
59292915Sdim/**
60292915Sdim * Dispose of a mangled symbol.
61292915Sdim */
62292915Sdim
63292915Sdimvoid LLVMOrcDisposeMangledSymbol(char *MangledSymbol);
64292915Sdim
65292915Sdim/**
66292915Sdim * Create a lazy compile callback.
67292915Sdim */
68292915SdimLLVMOrcTargetAddress
69292915SdimLLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
70292915Sdim                                 LLVMOrcLazyCompileCallbackFn Callback,
71292915Sdim                                 void *CallbackCtx);
72292915Sdim
73292915Sdim/**
74292915Sdim * Create a named indirect call stub.
75292915Sdim */
76292915Sdimvoid LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
77292915Sdim                               const char *StubName,
78292915Sdim                               LLVMOrcTargetAddress InitAddr);
79292915Sdim
80292915Sdim/**
81292915Sdim * Set the pointer for the given indirect stub.
82292915Sdim */
83292915Sdimvoid LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
84292915Sdim                                   const char *StubName,
85292915Sdim                                   LLVMOrcTargetAddress NewAddr);
86292915Sdim
87292915Sdim/**
88292915Sdim * Add module to be eagerly compiled.
89292915Sdim */
90292915SdimLLVMOrcModuleHandle
91292915SdimLLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
92292915Sdim                            LLVMOrcSymbolResolverFn SymbolResolver,
93292915Sdim                            void *SymbolResolverCtx);
94292915Sdim
95292915Sdim/**
96292915Sdim * Add module to be lazily compiled one function at a time.
97292915Sdim */
98292915SdimLLVMOrcModuleHandle
99292915SdimLLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
100292915Sdim                           LLVMOrcSymbolResolverFn SymbolResolver,
101292915Sdim                           void *SymbolResolverCtx);
102292915Sdim
103292915Sdim/**
104292915Sdim * Add an object file.
105292915Sdim */
106292915SdimLLVMOrcModuleHandle
107292915SdimLLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack, LLVMObjectFileRef Obj,
108292915Sdim                     LLVMOrcSymbolResolverFn SymbolResolver,
109292915Sdim                     void *SymbolResolverCtx);
110292915Sdim
111292915Sdim/**
112292915Sdim * Remove a module set from the JIT.
113292915Sdim *
114292915Sdim * This works for all modules that can be added via OrcAdd*, including object
115292915Sdim * files.
116292915Sdim */
117292915Sdimvoid LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H);
118292915Sdim
119292915Sdim/**
120292915Sdim * Get symbol address from JIT instance.
121292915Sdim */
122292915SdimLLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
123292915Sdim                                             const char *SymbolName);
124292915Sdim
125292915Sdim/**
126292915Sdim * Dispose of an ORC JIT stack.
127292915Sdim */
128292915Sdimvoid LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack);
129292915Sdim
130292915Sdim#ifdef __cplusplus
131292915Sdim}
132292915Sdim#endif /* extern "C" */
133292915Sdim
134292915Sdim#endif /* LLVM_C_ORCBINDINGS_H */
135