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