| /*===----------- llvm-c/OrcBindings.h - Orc Lib C Iface ---------*- C++ -*-===*\ | |
| |* *| | |
| |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| | |
| |* Exceptions. *| | |
| |* See https://llvm.org/LICENSE.txt for license information. *| | |
| |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| | |
| |* *| | |
| |*===----------------------------------------------------------------------===*| | |
| |* *| | |
| |* This header declares the C interface to libLLVMOrcJIT.a, which implements *| | |
| |* JIT compilation of LLVM IR. *| | |
| |* *| | |
| |* Many exotic languages can interoperate with C code but have a harder time *| | |
| |* with C++ due to name mangling. So in addition to C, this interface enables *| | |
| |* tools written in such languages. *| | |
| |* *| | |
| |* Note: This interface is experimental. It is *NOT* stable, and may be *| | |
| |* changed without warning. *| | |
| |* *| | |
| \*===----------------------------------------------------------------------===*/ | |
| #ifndef LLVM_C_ORCBINDINGS_H | |
| #define LLVM_C_ORCBINDINGS_H | |
| #include "llvm-c/Error.h" | |
| #include "llvm-c/ExternC.h" | |
| #include "llvm-c/Object.h" | |
| #include "llvm-c/TargetMachine.h" | |
| LLVM_C_EXTERN_C_BEGIN | |
| typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef; | |
| typedef uint64_t LLVMOrcModuleHandle; | |
| typedef uint64_t LLVMOrcTargetAddress; | |
| typedef uint64_t (*LLVMOrcSymbolResolverFn)(const char *Name, void *LookupCtx); | |
| typedef uint64_t (*LLVMOrcLazyCompileCallbackFn)(LLVMOrcJITStackRef JITStack, | |
| void *CallbackCtx); | |
| /** | |
| * Create an ORC JIT stack. | |
| * | |
| * The client owns the resulting stack, and must call OrcDisposeInstance(...) | |
| * to destroy it and free its memory. The JIT stack will take ownership of the | |
| * TargetMachine, which will be destroyed when the stack is destroyed. The | |
| * client should not attempt to dispose of the Target Machine, or it will result | |
| * in a double-free. | |
| */ | |
| LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM); | |
| /** | |
| * Get the error message for the most recent error (if any). | |
| * | |
| * This message is owned by the ORC JIT Stack and will be freed when the stack | |
| * is disposed of by LLVMOrcDisposeInstance. | |
| */ | |
| const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack); | |
| /** | |
| * Mangle the given symbol. | |
| * Memory will be allocated for MangledSymbol to hold the result. The client | |
| */ | |
| void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledSymbol, | |
| const char *Symbol); | |
| /** | |
| * Dispose of a mangled symbol. | |
| */ | |
| void LLVMOrcDisposeMangledSymbol(char *MangledSymbol); | |
| /** | |
| * Create a lazy compile callback. | |
| */ | |
| LLVMErrorRef LLVMOrcCreateLazyCompileCallback( | |
| LLVMOrcJITStackRef JITStack, LLVMOrcTargetAddress *RetAddr, | |
| LLVMOrcLazyCompileCallbackFn Callback, void *CallbackCtx); | |
| /** | |
| * Create a named indirect call stub. | |
| */ | |
| LLVMErrorRef LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, | |
| const char *StubName, | |
| LLVMOrcTargetAddress InitAddr); | |
| /** | |
| * Set the pointer for the given indirect stub. | |
| */ | |
| LLVMErrorRef LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, | |
| const char *StubName, | |
| LLVMOrcTargetAddress NewAddr); | |
| /** | |
| * Add module to be eagerly compiled. | |
| */ | |
| LLVMErrorRef LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, | |
| LLVMOrcModuleHandle *RetHandle, | |
| LLVMModuleRef Mod, | |
| LLVMOrcSymbolResolverFn SymbolResolver, | |
| void *SymbolResolverCtx); | |
| /** | |
| * Add module to be lazily compiled one function at a time. | |
| */ | |
| LLVMErrorRef LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, | |
| LLVMOrcModuleHandle *RetHandle, | |
| LLVMModuleRef Mod, | |
| LLVMOrcSymbolResolverFn SymbolResolver, | |
| void *SymbolResolverCtx); | |
| /** | |
| * Add an object file. | |
| * | |
| * This method takes ownership of the given memory buffer and attempts to add | |
| * it to the JIT as an object file. | |
| * Clients should *not* dispose of the 'Obj' argument: the JIT will manage it | |
| * from this call onwards. | |
| */ | |
| LLVMErrorRef LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack, | |
| LLVMOrcModuleHandle *RetHandle, | |
| LLVMMemoryBufferRef Obj, | |
| LLVMOrcSymbolResolverFn SymbolResolver, | |
| void *SymbolResolverCtx); | |
| /** | |
| * Remove a module set from the JIT. | |
| * | |
| * This works for all modules that can be added via OrcAdd*, including object | |
| * files. | |
| */ | |
| LLVMErrorRef LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, | |
| LLVMOrcModuleHandle H); | |
| /** | |
| * Get symbol address from JIT instance. | |
| */ | |
| LLVMErrorRef LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, | |
| LLVMOrcTargetAddress *RetAddr, | |
| const char *SymbolName); | |
| /** | |
| * Get symbol address from JIT instance, searching only the specified | |
| * handle. | |
| */ | |
| LLVMErrorRef LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack, | |
| LLVMOrcTargetAddress *RetAddr, | |
| LLVMOrcModuleHandle H, | |
| const char *SymbolName); | |
| /** | |
| * Dispose of an ORC JIT stack. | |
| */ | |
| LLVMErrorRef LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack); | |
| /** | |
| * Register a JIT Event Listener. | |
| * | |
| * A NULL listener is ignored. | |
| */ | |
| void LLVMOrcRegisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L); | |
| /** | |
| * Unegister a JIT Event Listener. | |
| * | |
| * A NULL listener is ignored. | |
| */ | |
| void LLVMOrcUnregisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L); | |
| LLVM_C_EXTERN_C_END | |
| #endif /* LLVM_C_ORCBINDINGS_H */ |