|  | /*===----------- llvm-c/OrcBindings.h - Orc Lib C Iface ---------*- C++ -*-===*\ | 
|  | |*                                                                            *| | 
|  | |*                     The LLVM Compiler Infrastructure                       *| | 
|  | |*                                                                            *| | 
|  | |* This file is distributed under the University of Illinois Open Source      *| | 
|  | |* License. See LICENSE.TXT for details.                                      *| | 
|  | |*                                                                            *| | 
|  | |*===----------------------------------------------------------------------===*| | 
|  | |*                                                                            *| | 
|  | |* 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/Object.h" | 
|  | #include "llvm-c/TargetMachine.h" | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | 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); | 
|  |  | 
|  | typedef enum { LLVMOrcErrSuccess = 0, LLVMOrcErrGeneric } LLVMOrcErrorCode; | 
|  |  | 
|  | /** | 
|  | * 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. | 
|  | */ | 
|  | LLVMOrcErrorCode | 
|  | LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, | 
|  | LLVMOrcTargetAddress *RetAddr, | 
|  | LLVMOrcLazyCompileCallbackFn Callback, | 
|  | void *CallbackCtx); | 
|  |  | 
|  | /** | 
|  | * Create a named indirect call stub. | 
|  | */ | 
|  | LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, | 
|  | const char *StubName, | 
|  | LLVMOrcTargetAddress InitAddr); | 
|  |  | 
|  | /** | 
|  | * Set the pointer for the given indirect stub. | 
|  | */ | 
|  | LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, | 
|  | const char *StubName, | 
|  | LLVMOrcTargetAddress NewAddr); | 
|  |  | 
|  | /** | 
|  | * Add module to be eagerly compiled. | 
|  | */ | 
|  | LLVMOrcErrorCode | 
|  | LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, | 
|  | LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod, | 
|  | LLVMOrcSymbolResolverFn SymbolResolver, | 
|  | void *SymbolResolverCtx); | 
|  |  | 
|  | /** | 
|  | * Add module to be lazily compiled one function at a time. | 
|  | */ | 
|  | LLVMOrcErrorCode | 
|  | 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. | 
|  | */ | 
|  | LLVMOrcErrorCode 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. | 
|  | */ | 
|  | LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, | 
|  | LLVMOrcModuleHandle H); | 
|  |  | 
|  | /** | 
|  | * Get symbol address from JIT instance. | 
|  | */ | 
|  | LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, | 
|  | LLVMOrcTargetAddress *RetAddr, | 
|  | const char *SymbolName); | 
|  |  | 
|  | /** | 
|  | * Get symbol address from JIT instance, searching only the specified | 
|  | * handle. | 
|  | */ | 
|  | LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack, | 
|  | LLVMOrcTargetAddress *RetAddr, | 
|  | LLVMOrcModuleHandle H, | 
|  | const char *SymbolName); | 
|  |  | 
|  | /** | 
|  | * Dispose of an ORC JIT stack. | 
|  | */ | 
|  | LLVMOrcErrorCode 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); | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif /* extern "C" */ | 
|  |  | 
|  | #endif /* LLVM_C_ORCBINDINGS_H */ |