Fixing @llvm.memcpy not honoring volatile.
[llvm-core.git] / include / llvm-c / ExecutionEngine.h
blobef714cd0638480b6319d9d1b23b502a6ad94d6d5
1 /*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- 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 libLLVMExecutionEngine.o, which *|
11 |* implements various analyses of the LLVM IR. *|
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 \*===----------------------------------------------------------------------===*/
19 #ifndef LLVM_C_EXECUTIONENGINE_H
20 #define LLVM_C_EXECUTIONENGINE_H
22 #include "llvm-c/Target.h"
23 #include "llvm-c/TargetMachine.h"
24 #include "llvm-c/Types.h"
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
30 /**
31 * @defgroup LLVMCExecutionEngine Execution Engine
32 * @ingroup LLVMC
34 * @{
37 void LLVMLinkInMCJIT(void);
38 void LLVMLinkInInterpreter(void);
40 typedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef;
41 typedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef;
42 typedef struct LLVMOpaqueMCJITMemoryManager *LLVMMCJITMemoryManagerRef;
44 struct LLVMMCJITCompilerOptions {
45 unsigned OptLevel;
46 LLVMCodeModel CodeModel;
47 LLVMBool NoFramePointerElim;
48 LLVMBool EnableFastISel;
49 LLVMMCJITMemoryManagerRef MCJMM;
52 /*===-- Operations on generic values --------------------------------------===*/
54 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
55 unsigned long long N,
56 LLVMBool IsSigned);
58 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P);
60 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N);
62 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef);
64 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal,
65 LLVMBool IsSigned);
67 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal);
69 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal);
71 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal);
73 /*===-- Operations on execution engines -----------------------------------===*/
75 LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
76 LLVMModuleRef M,
77 char **OutError);
79 LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
80 LLVMModuleRef M,
81 char **OutError);
83 LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
84 LLVMModuleRef M,
85 unsigned OptLevel,
86 char **OutError);
88 void LLVMInitializeMCJITCompilerOptions(
89 struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions);
91 /**
92 * Create an MCJIT execution engine for a module, with the given options. It is
93 * the responsibility of the caller to ensure that all fields in Options up to
94 * the given SizeOfOptions are initialized. It is correct to pass a smaller
95 * value of SizeOfOptions that omits some fields. The canonical way of using
96 * this is:
98 * LLVMMCJITCompilerOptions options;
99 * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
100 * ... fill in those options you care about
101 * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options),
102 * &error);
104 * Note that this is also correct, though possibly suboptimal:
106 * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error);
108 LLVMBool LLVMCreateMCJITCompilerForModule(
109 LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
110 struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions,
111 char **OutError);
113 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE);
115 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE);
117 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE);
119 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
120 unsigned ArgC, const char * const *ArgV,
121 const char * const *EnvP);
123 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
124 unsigned NumArgs,
125 LLVMGenericValueRef *Args);
127 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F);
129 void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M);
131 LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
132 LLVMModuleRef *OutMod, char **OutError);
134 LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
135 LLVMValueRef *OutFn);
137 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
138 LLVMValueRef Fn);
140 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE);
141 LLVMTargetMachineRef
142 LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE);
144 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
145 void* Addr);
147 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global);
149 uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name);
151 uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name);
153 /*===-- Operations on memory managers -------------------------------------===*/
155 typedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback)(
156 void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID,
157 const char *SectionName);
158 typedef uint8_t *(*LLVMMemoryManagerAllocateDataSectionCallback)(
159 void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID,
160 const char *SectionName, LLVMBool IsReadOnly);
161 typedef LLVMBool (*LLVMMemoryManagerFinalizeMemoryCallback)(
162 void *Opaque, char **ErrMsg);
163 typedef void (*LLVMMemoryManagerDestroyCallback)(void *Opaque);
166 * Create a simple custom MCJIT memory manager. This memory manager can
167 * intercept allocations in a module-oblivious way. This will return NULL
168 * if any of the passed functions are NULL.
170 * @param Opaque An opaque client object to pass back to the callbacks.
171 * @param AllocateCodeSection Allocate a block of memory for executable code.
172 * @param AllocateDataSection Allocate a block of memory for data.
173 * @param FinalizeMemory Set page permissions and flush cache. Return 0 on
174 * success, 1 on error.
176 LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
177 void *Opaque,
178 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
179 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
180 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
181 LLVMMemoryManagerDestroyCallback Destroy);
183 void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM);
185 /*===-- JIT Event Listener functions -------------------------------------===*/
187 LLVMJITEventListenerRef LLVMCreateGDBRegistrationListener(void);
188 LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void);
189 LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void);
190 LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void);
193 * @}
196 #ifdef __cplusplus
198 #endif /* defined(__cplusplus) */
200 #endif