252 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
/*===----------- llvm-c/LLJIT.h - OrcV2 LLJIT C bindings --------*- 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 the LLJIT class in                 *|
 | 
						|
|* libLLVMOrcJIT.a, which provides a simple MCJIT-like ORC JIT.               *|
 | 
						|
|*                                                                            *|
 | 
						|
|* 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. Only C API usage documentation is           *|
 | 
						|
|*       provided. See the C++ documentation for all higher level ORC API     *|
 | 
						|
|*       details.                                                             *|
 | 
						|
|*                                                                            *|
 | 
						|
\*===----------------------------------------------------------------------===*/
 | 
						|
 | 
						|
#ifndef LLVM_C_LLJIT_H
 | 
						|
#define LLVM_C_LLJIT_H
 | 
						|
 | 
						|
#include "llvm-c/Error.h"
 | 
						|
#include "llvm-c/Orc.h"
 | 
						|
#include "llvm-c/TargetMachine.h"
 | 
						|
#include "llvm-c/Types.h"
 | 
						|
 | 
						|
LLVM_C_EXTERN_C_BEGIN
 | 
						|
 | 
						|
/**
 | 
						|
 * @defgroup LLVMCExecutionEngineLLJIT LLJIT
 | 
						|
 * @ingroup LLVMCExecutionEngine
 | 
						|
 *
 | 
						|
 * @{
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * A function for constructing an ObjectLinkingLayer instance to be used
 | 
						|
 * by an LLJIT instance.
 | 
						|
 *
 | 
						|
 * Clients can call LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator to
 | 
						|
 * set the creator function to use when constructing an LLJIT instance.
 | 
						|
 * This can be used to override the default linking layer implementation
 | 
						|
 * that would otherwise be chosen by LLJITBuilder.
 | 
						|
 *
 | 
						|
 * Object linking layers returned by this function will become owned by the
 | 
						|
 * LLJIT instance. The client is not responsible for managing their lifetimes
 | 
						|
 * after the function returns.
 | 
						|
 */
 | 
						|
typedef LLVMOrcObjectLayerRef (
 | 
						|
    *LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction)(
 | 
						|
    void *Ctx, LLVMOrcExecutionSessionRef ES, const char *Triple);
 | 
						|
 | 
						|
/**
 | 
						|
 * A reference to an orc::LLJITBuilder instance.
 | 
						|
 */
 | 
						|
typedef struct LLVMOrcOpaqueLLJITBuilder *LLVMOrcLLJITBuilderRef;
 | 
						|
 | 
						|
/**
 | 
						|
 * A reference to an orc::LLJIT instance.
 | 
						|
 */
 | 
						|
typedef struct LLVMOrcOpaqueLLJIT *LLVMOrcLLJITRef;
 | 
						|
 | 
						|
/**
 | 
						|
 * Create an LLVMOrcLLJITBuilder.
 | 
						|
 *
 | 
						|
 * The client owns the resulting LLJITBuilder and should dispose of it using
 | 
						|
 * LLVMOrcDisposeLLJITBuilder once they are done with it.
 | 
						|
 */
 | 
						|
LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void);
 | 
						|
 | 
						|
/**
 | 
						|
 * Dispose of an LLVMOrcLLJITBuilderRef. This should only be called if ownership
 | 
						|
 * has not been passed to LLVMOrcCreateLLJIT (e.g. because some error prevented
 | 
						|
 * that function from being called).
 | 
						|
 */
 | 
						|
void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder);
 | 
						|
 | 
						|
/**
 | 
						|
 * Set the JITTargetMachineBuilder to be used when constructing the LLJIT
 | 
						|
 * instance. Calling this function is optional: if it is not called then the
 | 
						|
 * LLJITBuilder will use JITTargeTMachineBuilder::detectHost to construct a
 | 
						|
 * JITTargetMachineBuilder.
 | 
						|
 *
 | 
						|
 * This function takes ownership of the JTMB argument: clients should not
 | 
						|
 * dispose of the JITTargetMachineBuilder after calling this function.
 | 
						|
 */
 | 
						|
void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
 | 
						|
    LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB);
 | 
						|
 | 
						|
/**
 | 
						|
 * Set an ObjectLinkingLayer creator function for this LLJIT instance.
 | 
						|
 */
 | 
						|
void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(
 | 
						|
    LLVMOrcLLJITBuilderRef Builder,
 | 
						|
    LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx);
 | 
						|
 | 
						|
/**
 | 
						|
 * Create an LLJIT instance from an LLJITBuilder.
 | 
						|
 *
 | 
						|
 * This operation takes ownership of the Builder argument: clients should not
 | 
						|
 * dispose of the builder after calling this function (even if the function
 | 
						|
 * returns an error). If a null Builder argument is provided then a
 | 
						|
 * default-constructed LLJITBuilder will be used.
 | 
						|
 *
 | 
						|
 * On success the resulting LLJIT instance is uniquely owned by the client and
 | 
						|
 * automatically manages the memory of all JIT'd code and all modules that are
 | 
						|
 * transferred to it (e.g. via LLVMOrcLLJITAddLLVMIRModule). Disposing of the
 | 
						|
 * LLJIT instance will free all memory managed by the JIT, including JIT'd code
 | 
						|
 * and not-yet compiled modules.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
 | 
						|
                                LLVMOrcLLJITBuilderRef Builder);
 | 
						|
 | 
						|
/**
 | 
						|
 * Dispose of an LLJIT instance.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Get a reference to the ExecutionSession for this LLJIT instance.
 | 
						|
 *
 | 
						|
 * The ExecutionSession is owned by the LLJIT instance. The client is not
 | 
						|
 * responsible for managing its memory.
 | 
						|
 */
 | 
						|
LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Return a reference to the Main JITDylib.
 | 
						|
 *
 | 
						|
 * The JITDylib is owned by the LLJIT instance. The client is not responsible
 | 
						|
 * for managing its memory.
 | 
						|
 */
 | 
						|
LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Return the target triple for this LLJIT instance. This string is owned by
 | 
						|
 * the LLJIT instance and should not be freed by the client.
 | 
						|
 */
 | 
						|
const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns the global prefix character according to the LLJIT's DataLayout.
 | 
						|
 */
 | 
						|
char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Mangles the given string according to the LLJIT instance's DataLayout, then
 | 
						|
 * interns the result in the SymbolStringPool and returns a reference to the
 | 
						|
 * pool entry. Clients should call LLVMOrcReleaseSymbolStringPoolEntry to
 | 
						|
 * decrement the ref-count on the pool entry once they are finished with this
 | 
						|
 * value.
 | 
						|
 */
 | 
						|
LLVMOrcSymbolStringPoolEntryRef
 | 
						|
LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName);
 | 
						|
 | 
						|
/**
 | 
						|
 * Add a buffer representing an object file to the given JITDylib in the given
 | 
						|
 * LLJIT instance. This operation transfers ownership of the buffer to the
 | 
						|
 * LLJIT instance. The buffer should not be disposed of or referenced once this
 | 
						|
 * function returns.
 | 
						|
 *
 | 
						|
 * Resources associated with the given object will be tracked by the given
 | 
						|
 * JITDylib's default resource tracker.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
 | 
						|
                                       LLVMMemoryBufferRef ObjBuffer);
 | 
						|
 | 
						|
/**
 | 
						|
 * Add a buffer representing an object file to the given ResourceTracker's
 | 
						|
 * JITDylib in the given LLJIT instance. This operation transfers ownership of
 | 
						|
 * the buffer to the LLJIT instance. The buffer should not be disposed of or
 | 
						|
 * referenced once this function returns.
 | 
						|
 *
 | 
						|
 * Resources associated with the given object will be tracked by ResourceTracker
 | 
						|
 * RT.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,
 | 
						|
                                             LLVMOrcResourceTrackerRef RT,
 | 
						|
                                             LLVMMemoryBufferRef ObjBuffer);
 | 
						|
 | 
						|
/**
 | 
						|
 * Add an IR module to the given JITDylib in the given LLJIT instance. This
 | 
						|
 * operation transfers ownership of the TSM argument to the LLJIT instance.
 | 
						|
 * The TSM argument should not be disposed of or referenced once this
 | 
						|
 * function returns.
 | 
						|
 *
 | 
						|
 * Resources associated with the given Module will be tracked by the given
 | 
						|
 * JITDylib's default resource tracker.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
 | 
						|
                                         LLVMOrcJITDylibRef JD,
 | 
						|
                                         LLVMOrcThreadSafeModuleRef TSM);
 | 
						|
 | 
						|
/**
 | 
						|
 * Add an IR module to the given ResourceTracker's JITDylib in the given LLJIT
 | 
						|
 * instance. This operation transfers ownership of the TSM argument to the LLJIT
 | 
						|
 * instance. The TSM argument should not be disposed of or referenced once this
 | 
						|
 * function returns.
 | 
						|
 *
 | 
						|
 * Resources associated with the given Module will be tracked by ResourceTracker
 | 
						|
 * RT.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,
 | 
						|
                                               LLVMOrcResourceTrackerRef JD,
 | 
						|
                                               LLVMOrcThreadSafeModuleRef TSM);
 | 
						|
 | 
						|
/**
 | 
						|
 * Look up the given symbol in the main JITDylib of the given LLJIT instance.
 | 
						|
 *
 | 
						|
 * This operation does not take ownership of the Name argument.
 | 
						|
 */
 | 
						|
LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
 | 
						|
                                LLVMOrcExecutorAddress *Result,
 | 
						|
                                const char *Name);
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns a non-owning reference to the LLJIT instance's object linking layer.
 | 
						|
 */
 | 
						|
LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns a non-owning reference to the LLJIT instance's object linking layer.
 | 
						|
 */
 | 
						|
LLVMOrcObjectTransformLayerRef
 | 
						|
LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns a non-owning reference to the LLJIT instance's IR transform layer.
 | 
						|
 */
 | 
						|
LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * Get the LLJIT instance's default data layout string.
 | 
						|
 *
 | 
						|
 * This string is owned by the LLJIT instance and does not need to be freed
 | 
						|
 * by the caller.
 | 
						|
 */
 | 
						|
const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J);
 | 
						|
 | 
						|
/**
 | 
						|
 * @}
 | 
						|
 */
 | 
						|
 | 
						|
LLVM_C_EXTERN_C_END
 | 
						|
 | 
						|
#endif /* LLVM_C_LLJIT_H */
 |