105 lines · c
1/*===-- llvm-c/OrcEE.h - OrcV2 C bindings ExecutionEngine utils -*- C++ -*-===*\2|* *|3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|4|* Exceptions. *|5|* See https://llvm.org/LICENSE.txt for license information. *|6|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|7|* *|8|*===----------------------------------------------------------------------===*|9|* *|10|* This header declares the C interface to ExecutionEngine based utils, e.g. *|11|* RTDyldObjectLinkingLayer (based on RuntimeDyld) in Orc. *|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. Only C API usage documentation is *|19|* provided. See the C++ documentation for all higher level ORC API *|20|* details. *|21|* *|22\*===----------------------------------------------------------------------===*/23 24#ifndef LLVM_C_ORCEE_H25#define LLVM_C_ORCEE_H26 27#include "llvm-c/Error.h"28#include "llvm-c/ExecutionEngine.h"29#include "llvm-c/Orc.h"30#include "llvm-c/TargetMachine.h"31#include "llvm-c/Types.h"32#include "llvm-c/Visibility.h"33 34LLVM_C_EXTERN_C_BEGIN35 36typedef void *(*LLVMMemoryManagerCreateContextCallback)(void *CtxCtx);37typedef void (*LLVMMemoryManagerNotifyTerminatingCallback)(void *CtxCtx);38 39/**40 * @defgroup LLVMCExecutionEngineORCEE ExecutionEngine-based ORC Utils41 * @ingroup LLVMCExecutionEngine42 *43 * @{44 */45 46/**47 * Create a RTDyldObjectLinkingLayer instance using the standard48 * SectionMemoryManager for memory management.49 */50LLVM_C_ABI LLVMOrcObjectLayerRef51LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(52 LLVMOrcExecutionSessionRef ES);53 54/**55 * Create a RTDyldObjectLinkingLayer instance using MCJIT-memory-manager-like56 * callbacks.57 *58 * This is intended to simplify transitions for existing MCJIT clients. The59 * callbacks used are similar (but not identical) to the callbacks for60 * LLVMCreateSimpleMCJITMemoryManager: Unlike MCJIT, RTDyldObjectLinkingLayer61 * will create a new memory manager for each object linked by calling the given62 * CreateContext callback. This allows for code removal by destroying each63 * allocator individually. Every allocator will be destroyed (if it has not been64 * already) at RTDyldObjectLinkingLayer destruction time, and the65 * NotifyTerminating callback will be called to indicate that no further66 * allocation contexts will be created.67 *68 * To implement MCJIT-like behavior clients can implement CreateContext,69 * NotifyTerminating, and Destroy as:70 *71 * void *CreateContext(void *CtxCtx) { return CtxCtx; }72 * void NotifyTerminating(void *CtxCtx) { MyOriginalDestroy(CtxCtx); }73 * void Destroy(void *Ctx) { }74 *75 * This scheme simply reuses the CreateContextCtx pointer as the one-and-only76 * allocation context.77 */78LLVM_C_ABI LLVMOrcObjectLayerRef79LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(80 LLVMOrcExecutionSessionRef ES, void *CreateContextCtx,81 LLVMMemoryManagerCreateContextCallback CreateContext,82 LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,83 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,84 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,85 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,86 LLVMMemoryManagerDestroyCallback Destroy);87 88/**89 * Add the given listener to the given RTDyldObjectLinkingLayer.90 *91 * Note: Layer must be an RTDyldObjectLinkingLayer instance or92 * behavior is undefined.93 */94LLVM_C_ABI void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(95 LLVMOrcObjectLayerRef RTDyldObjLinkingLayer,96 LLVMJITEventListenerRef Listener);97 98/**99 * @}100 */101 102LLVM_C_EXTERN_C_END103 104#endif /* LLVM_C_ORCEE_H */105