blob: db3dead05a5ebbdcd3ff2bec96ed36fd723b6c33 [file] [log] [blame]
Gordon Henriksen2e855e62007-12-23 16:59:28 +00001//===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Gordon Henriksen2e855e62007-12-23 16:59:28 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the C bindings for the ExecutionEngine library.
11//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "jit"
15#include "llvm-c/ExecutionEngine.h"
Gordon Henriksen2e855e62007-12-23 16:59:28 +000016#include "llvm/ExecutionEngine/ExecutionEngine.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "llvm/ExecutionEngine/GenericValue.h"
Filip Pizlo6cfed362013-05-22 02:46:43 +000018#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
Filip Pizlo40be1e82013-05-01 20:59:00 +000019#include "llvm/IR/DerivedTypes.h"
20#include "llvm/IR/Module.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Anton Korobeynikovae9f3a32008-02-20 11:08:44 +000022#include <cstring>
Gordon Henriksen2e855e62007-12-23 16:59:28 +000023
24using namespace llvm;
25
Eric Christopher3e397312013-04-22 22:47:22 +000026// Wrapping the C bindings types.
Filip Pizlo40be1e82013-05-01 20:59:00 +000027DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
Eric Christopher3e397312013-04-22 22:47:22 +000028
29inline DataLayout *unwrap(LLVMTargetDataRef P) {
30 return reinterpret_cast<DataLayout*>(P);
31}
32
33inline LLVMTargetDataRef wrap(const DataLayout *P) {
34 return reinterpret_cast<LLVMTargetDataRef>(const_cast<DataLayout*>(P));
35}
36
37inline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) {
38 return reinterpret_cast<TargetLibraryInfo*>(P);
39}
40
41inline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) {
42 TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P);
43 return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
44}
45
Stephen Hines36b56882014-04-23 16:57:46 -070046inline LLVMTargetMachineRef wrap(const TargetMachine *P) {
47 return
48 reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
49}
50
Gordon Henriksen2e855e62007-12-23 16:59:28 +000051/*===-- Operations on generic values --------------------------------------===*/
52
53LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
54 unsigned long long N,
Chris Lattnerd686c8e2010-01-09 22:27:07 +000055 LLVMBool IsSigned) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +000056 GenericValue *GenVal = new GenericValue();
57 GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
58 return wrap(GenVal);
59}
60
61LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
62 GenericValue *GenVal = new GenericValue();
63 GenVal->PointerVal = P;
64 return wrap(GenVal);
65}
66
67LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
68 GenericValue *GenVal = new GenericValue();
69 switch (unwrap(TyRef)->getTypeID()) {
70 case Type::FloatTyID:
71 GenVal->FloatVal = N;
72 break;
73 case Type::DoubleTyID:
74 GenVal->DoubleVal = N;
75 break;
76 default:
Torok Edwinc23197a2009-07-14 16:55:14 +000077 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
Gordon Henriksen2e855e62007-12-23 16:59:28 +000078 }
79 return wrap(GenVal);
80}
81
82unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
83 return unwrap(GenValRef)->IntVal.getBitWidth();
84}
85
86unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
Chris Lattnerd686c8e2010-01-09 22:27:07 +000087 LLVMBool IsSigned) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +000088 GenericValue *GenVal = unwrap(GenValRef);
89 if (IsSigned)
90 return GenVal->IntVal.getSExtValue();
91 else
92 return GenVal->IntVal.getZExtValue();
93}
94
95void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
96 return unwrap(GenVal)->PointerVal;
97}
98
99double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
100 switch (unwrap(TyRef)->getTypeID()) {
101 case Type::FloatTyID:
102 return unwrap(GenVal)->FloatVal;
103 case Type::DoubleTyID:
104 return unwrap(GenVal)->DoubleVal;
105 default:
Torok Edwinc23197a2009-07-14 16:55:14 +0000106 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000107 }
108}
109
110void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
111 delete unwrap(GenVal);
112}
113
114/*===-- Operations on execution engines -----------------------------------===*/
115
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000116LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
117 LLVMModuleRef M,
118 char **OutError) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000119 std::string Error;
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000120 EngineBuilder builder(unwrap(M));
Reid Kleckner4b1511b2009-07-18 00:42:18 +0000121 builder.setEngineKind(EngineKind::Either)
122 .setErrorStr(&Error);
123 if (ExecutionEngine *EE = builder.create()){
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000124 *OutEE = wrap(EE);
125 return 0;
126 }
127 *OutError = strdup(Error.c_str());
128 return 1;
129}
130
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000131LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
132 LLVMModuleRef M,
133 char **OutError) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000134 std::string Error;
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000135 EngineBuilder builder(unwrap(M));
Reid Kleckner4b1511b2009-07-18 00:42:18 +0000136 builder.setEngineKind(EngineKind::Interpreter)
137 .setErrorStr(&Error);
138 if (ExecutionEngine *Interp = builder.create()) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000139 *OutInterp = wrap(Interp);
140 return 0;
141 }
142 *OutError = strdup(Error.c_str());
143 return 1;
144}
145
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000146LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
147 LLVMModuleRef M,
148 unsigned OptLevel,
149 char **OutError) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000150 std::string Error;
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000151 EngineBuilder builder(unwrap(M));
Reid Kleckner4b1511b2009-07-18 00:42:18 +0000152 builder.setEngineKind(EngineKind::JIT)
153 .setErrorStr(&Error)
154 .setOptLevel((CodeGenOpt::Level)OptLevel);
155 if (ExecutionEngine *JIT = builder.create()) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000156 *OutJIT = wrap(JIT);
157 return 0;
158 }
159 *OutError = strdup(Error.c_str());
160 return 1;
161}
162
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000163void LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
164 size_t SizeOfPassedOptions) {
165 LLVMMCJITCompilerOptions options;
Filip Pizlo6cfed362013-05-22 02:46:43 +0000166 memset(&options, 0, sizeof(options)); // Most fields are zero by default.
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000167 options.CodeModel = LLVMCodeModelJITDefault;
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000168
169 memcpy(PassedOptions, &options,
170 std::min(sizeof(options), SizeOfPassedOptions));
171}
172
173LLVMBool LLVMCreateMCJITCompilerForModule(
174 LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
175 LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
176 char **OutError) {
Andrew Kaylord2755af2013-04-29 17:49:40 +0000177 LLVMMCJITCompilerOptions options;
178 // If the user passed a larger sized options struct, then they were compiled
179 // against a newer LLVM. Tell them that something is wrong.
180 if (SizeOfPassedOptions > sizeof(options)) {
181 *OutError = strdup(
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000182 "Refusing to use options struct that is larger than my own; assuming "
183 "LLVM library mismatch.");
Andrew Kaylord2755af2013-04-29 17:49:40 +0000184 return 1;
185 }
186
187 // Defend against the user having an old version of the API by ensuring that
188 // any fields they didn't see are cleared. We must defend against fields being
189 // set to the bitwise equivalent of zero, and assume that this means "do the
190 // default" as if that option hadn't been available.
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000191 LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
Andrew Kaylord2755af2013-04-29 17:49:40 +0000192 memcpy(&options, PassedOptions, SizeOfPassedOptions);
193
194 TargetOptions targetOptions;
195 targetOptions.NoFramePointerElim = options.NoFramePointerElim;
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000196 targetOptions.EnableFastISel = options.EnableFastISel;
Andrew Kaylord2755af2013-04-29 17:49:40 +0000197
198 std::string Error;
199 EngineBuilder builder(unwrap(M));
200 builder.setEngineKind(EngineKind::JIT)
201 .setErrorStr(&Error)
202 .setUseMCJIT(true)
203 .setOptLevel((CodeGenOpt::Level)options.OptLevel)
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000204 .setCodeModel(unwrap(options.CodeModel))
Andrew Kaylord2755af2013-04-29 17:49:40 +0000205 .setTargetOptions(targetOptions);
Filip Pizlo6cfed362013-05-22 02:46:43 +0000206 if (options.MCJMM)
207 builder.setMCJITMemoryManager(unwrap(options.MCJMM));
Andrew Kaylord2755af2013-04-29 17:49:40 +0000208 if (ExecutionEngine *JIT = builder.create()) {
209 *OutJIT = wrap(JIT);
210 return 0;
211 }
212 *OutError = strdup(Error.c_str());
213 return 1;
214}
215
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000216LLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
217 LLVMModuleProviderRef MP,
218 char **OutError) {
219 /* The module provider is now actually a module. */
220 return LLVMCreateExecutionEngineForModule(OutEE,
221 reinterpret_cast<LLVMModuleRef>(MP),
222 OutError);
223}
224
225LLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
226 LLVMModuleProviderRef MP,
227 char **OutError) {
228 /* The module provider is now actually a module. */
229 return LLVMCreateInterpreterForModule(OutInterp,
230 reinterpret_cast<LLVMModuleRef>(MP),
231 OutError);
232}
233
234LLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
235 LLVMModuleProviderRef MP,
236 unsigned OptLevel,
237 char **OutError) {
238 /* The module provider is now actually a module. */
239 return LLVMCreateJITCompilerForModule(OutJIT,
240 reinterpret_cast<LLVMModuleRef>(MP),
241 OptLevel, OutError);
242}
243
244
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000245void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
246 delete unwrap(EE);
247}
248
249void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
250 unwrap(EE)->runStaticConstructorsDestructors(false);
251}
252
253void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
254 unwrap(EE)->runStaticConstructorsDestructors(true);
255}
256
257int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
258 unsigned ArgC, const char * const *ArgV,
259 const char * const *EnvP) {
Andrew Kaylord2755af2013-04-29 17:49:40 +0000260 unwrap(EE)->finalizeObject();
261
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000262 std::vector<std::string> ArgVec;
263 for (unsigned I = 0; I != ArgC; ++I)
264 ArgVec.push_back(ArgV[I]);
265
266 return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
267}
268
269LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
270 unsigned NumArgs,
271 LLVMGenericValueRef *Args) {
Andrew Kaylord2755af2013-04-29 17:49:40 +0000272 unwrap(EE)->finalizeObject();
273
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000274 std::vector<GenericValue> ArgVec;
275 ArgVec.reserve(NumArgs);
276 for (unsigned I = 0; I != NumArgs; ++I)
277 ArgVec.push_back(*unwrap(Args[I]));
278
279 GenericValue *Result = new GenericValue();
280 *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
281 return wrap(Result);
282}
283
284void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
285 unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
286}
287
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000288void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
289 unwrap(EE)->addModule(unwrap(M));
290}
291
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000292void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000293 /* The module provider is now actually a module. */
294 LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP));
295}
296
297LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
298 LLVMModuleRef *OutMod, char **OutError) {
299 Module *Mod = unwrap(M);
300 unwrap(EE)->removeModule(Mod);
301 *OutMod = wrap(Mod);
302 return 0;
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000303}
304
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000305LLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
306 LLVMModuleProviderRef MP,
307 LLVMModuleRef *OutMod, char **OutError) {
Erick Tryzelaardf7df072010-03-02 23:58:54 +0000308 /* The module provider is now actually a module. */
309 return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod,
310 OutError);
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000311}
312
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000313LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
314 LLVMValueRef *OutFn) {
Gordon Henriksen2e855e62007-12-23 16:59:28 +0000315 if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
316 *OutFn = wrap(F);
317 return 0;
318 }
319 return 1;
320}
Erick Tryzelaar7c1483b2008-03-27 00:27:14 +0000321
Filip Pizlo0e1327e2013-05-01 22:58:00 +0000322void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
323 LLVMValueRef Fn) {
Duncan Sandse117b632010-07-19 09:36:45 +0000324 return unwrap(EE)->recompileAndRelinkFunction(unwrap<Function>(Fn));
Duncan Sandsd90fee92010-07-19 09:33:13 +0000325}
326
Erick Tryzelaar7c1483b2008-03-27 00:27:14 +0000327LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
Micah Villmow3574eca2012-10-08 16:38:25 +0000328 return wrap(unwrap(EE)->getDataLayout());
Erick Tryzelaar7c1483b2008-03-27 00:27:14 +0000329}
Gordon Henriksen54227f62008-06-20 02:16:11 +0000330
Stephen Hines36b56882014-04-23 16:57:46 -0700331LLVMTargetMachineRef
332LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
333 return wrap(unwrap(EE)->getTargetMachine());
334}
335
Gordon Henriksen54227f62008-06-20 02:16:11 +0000336void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
337 void* Addr) {
338 unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
339}
Chris Lattner1e42c5b2009-01-21 18:11:10 +0000340
341void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
Andrew Kaylord2755af2013-04-29 17:49:40 +0000342 unwrap(EE)->finalizeObject();
343
Chris Lattner1e42c5b2009-01-21 18:11:10 +0000344 return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
345}
Filip Pizlo6cfed362013-05-22 02:46:43 +0000346
347/*===-- Operations on memory managers -------------------------------------===*/
348
349namespace {
350
351struct SimpleBindingMMFunctions {
Anders Waldenborg5be81232013-09-30 19:11:32 +0000352 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
353 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
354 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
355 LLVMMemoryManagerDestroyCallback Destroy;
Filip Pizlo6cfed362013-05-22 02:46:43 +0000356};
357
358class SimpleBindingMemoryManager : public RTDyldMemoryManager {
359public:
360 SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
361 void *Opaque);
362 virtual ~SimpleBindingMemoryManager();
Filip Pizlo6cfed362013-05-22 02:46:43 +0000363
Stephen Hines36b56882014-04-23 16:57:46 -0700364 uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
365 unsigned SectionID,
366 StringRef SectionName) override;
Filip Pizlo6cfed362013-05-22 02:46:43 +0000367
Stephen Hines36b56882014-04-23 16:57:46 -0700368 uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
369 unsigned SectionID, StringRef SectionName,
370 bool isReadOnly) override;
371
372 bool finalizeMemory(std::string *ErrMsg) override;
373
Filip Pizlo6cfed362013-05-22 02:46:43 +0000374private:
375 SimpleBindingMMFunctions Functions;
376 void *Opaque;
377};
378
379SimpleBindingMemoryManager::SimpleBindingMemoryManager(
380 const SimpleBindingMMFunctions& Functions,
381 void *Opaque)
382 : Functions(Functions), Opaque(Opaque) {
383 assert(Functions.AllocateCodeSection &&
384 "No AllocateCodeSection function provided!");
385 assert(Functions.AllocateDataSection &&
386 "No AllocateDataSection function provided!");
387 assert(Functions.FinalizeMemory &&
388 "No FinalizeMemory function provided!");
389 assert(Functions.Destroy &&
390 "No Destroy function provided!");
391}
392
393SimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
394 Functions.Destroy(Opaque);
395}
396
397uint8_t *SimpleBindingMemoryManager::allocateCodeSection(
Filip Pizlo6eb43d22013-10-02 00:59:25 +0000398 uintptr_t Size, unsigned Alignment, unsigned SectionID,
399 StringRef SectionName) {
400 return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
401 SectionName.str().c_str());
Filip Pizlo6cfed362013-05-22 02:46:43 +0000402}
403
404uint8_t *SimpleBindingMemoryManager::allocateDataSection(
Filip Pizlo6eb43d22013-10-02 00:59:25 +0000405 uintptr_t Size, unsigned Alignment, unsigned SectionID,
406 StringRef SectionName, bool isReadOnly) {
Filip Pizlo6cfed362013-05-22 02:46:43 +0000407 return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
Filip Pizlo6eb43d22013-10-02 00:59:25 +0000408 SectionName.str().c_str(),
Filip Pizlo6cfed362013-05-22 02:46:43 +0000409 isReadOnly);
410}
411
412bool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
413 char *errMsgCString = 0;
414 bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
415 assert((result || !errMsgCString) &&
416 "Did not expect an error message if FinalizeMemory succeeded");
417 if (errMsgCString) {
418 if (ErrMsg)
419 *ErrMsg = errMsgCString;
420 free(errMsgCString);
421 }
422 return result;
423}
424
425} // anonymous namespace
426
427LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
428 void *Opaque,
Anders Waldenborg5be81232013-09-30 19:11:32 +0000429 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
430 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
431 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
432 LLVMMemoryManagerDestroyCallback Destroy) {
Filip Pizlo6cfed362013-05-22 02:46:43 +0000433
434 if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
435 !Destroy)
436 return NULL;
437
438 SimpleBindingMMFunctions functions;
439 functions.AllocateCodeSection = AllocateCodeSection;
440 functions.AllocateDataSection = AllocateDataSection;
441 functions.FinalizeMemory = FinalizeMemory;
442 functions.Destroy = Destroy;
443 return wrap(new SimpleBindingMemoryManager(functions, Opaque));
444}
445
446void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
447 delete unwrap(MM);
448}
449