blob: addec6871fa1001e1e737f2f9af1062d0f2619ec [file] [log] [blame]
Gordon Henriksen2a8cd892007-12-23 16:59:28 +00001//===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Gordon Henriksen2a8cd892007-12-23 16:59:28 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the C bindings for the ExecutionEngine library.
10//
11//===----------------------------------------------------------------------===//
12
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000013#include "llvm-c/ExecutionEngine.h"
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000014#include "llvm/ExecutionEngine/ExecutionEngine.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "llvm/ExecutionEngine/GenericValue.h"
Andres Freundee10ce72018-07-25 15:04:57 +000016#include "llvm/ExecutionEngine/JITEventListener.h"
Filip Pizlo3fdbaff2013-05-22 02:46:43 +000017#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
Filip Pizlodec20e42013-05-01 20:59:00 +000018#include "llvm/IR/DerivedTypes.h"
19#include "llvm/IR/Module.h"
Torok Edwin56d06592009-07-11 20:10:48 +000020#include "llvm/Support/ErrorHandling.h"
David Blaikiebf121cf2018-03-23 23:58:21 +000021#include "llvm/Target/CodeGenCWrappers.h"
Sanjay Pateld9fb62e2015-06-01 21:56:56 +000022#include "llvm/Target/TargetOptions.h"
Anton Korobeynikov579f0712008-02-20 11:08:44 +000023#include <cstring>
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000024
25using namespace llvm;
26
Chandler Carruthf58e3762014-04-22 03:04:17 +000027#define DEBUG_TYPE "jit"
28
Eric Christopher04d4e932013-04-22 22:47:22 +000029// Wrapping the C bindings types.
Filip Pizlodec20e42013-05-01 20:59:00 +000030DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
Eric Christopher04d4e932013-04-22 22:47:22 +000031
Eric Christopher04d4e932013-04-22 22:47:22 +000032
Diego Novillocd973c42015-07-27 18:27:23 +000033static LLVMTargetMachineRef wrap(const TargetMachine *P) {
Juergen Ributzka5fe955c2014-01-23 19:23:28 +000034 return
35 reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
36}
37
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000038/*===-- Operations on generic values --------------------------------------===*/
39
40LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
41 unsigned long long N,
Chris Lattner25963c62010-01-09 22:27:07 +000042 LLVMBool IsSigned) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000043 GenericValue *GenVal = new GenericValue();
44 GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
45 return wrap(GenVal);
46}
47
48LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
49 GenericValue *GenVal = new GenericValue();
50 GenVal->PointerVal = P;
51 return wrap(GenVal);
52}
53
54LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
55 GenericValue *GenVal = new GenericValue();
56 switch (unwrap(TyRef)->getTypeID()) {
57 case Type::FloatTyID:
58 GenVal->FloatVal = N;
59 break;
60 case Type::DoubleTyID:
61 GenVal->DoubleVal = N;
62 break;
63 default:
Torok Edwinfbcc6632009-07-14 16:55:14 +000064 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000065 }
66 return wrap(GenVal);
67}
68
69unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
70 return unwrap(GenValRef)->IntVal.getBitWidth();
71}
72
73unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
Chris Lattner25963c62010-01-09 22:27:07 +000074 LLVMBool IsSigned) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000075 GenericValue *GenVal = unwrap(GenValRef);
76 if (IsSigned)
77 return GenVal->IntVal.getSExtValue();
78 else
79 return GenVal->IntVal.getZExtValue();
80}
81
82void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
83 return unwrap(GenVal)->PointerVal;
84}
85
86double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
87 switch (unwrap(TyRef)->getTypeID()) {
88 case Type::FloatTyID:
89 return unwrap(GenVal)->FloatVal;
90 case Type::DoubleTyID:
91 return unwrap(GenVal)->DoubleVal;
92 default:
Torok Edwinfbcc6632009-07-14 16:55:14 +000093 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000094 }
95}
96
97void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
98 delete unwrap(GenVal);
99}
100
101/*===-- Operations on execution engines -----------------------------------===*/
102
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +0000103LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
104 LLVMModuleRef M,
105 char **OutError) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000106 std::string Error;
Rafael Espindola2a8a2792014-08-19 04:04:25 +0000107 EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
Reid Klecknerfc8a2d52009-07-18 00:42:18 +0000108 builder.setEngineKind(EngineKind::Either)
109 .setErrorStr(&Error);
110 if (ExecutionEngine *EE = builder.create()){
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000111 *OutEE = wrap(EE);
112 return 0;
113 }
114 *OutError = strdup(Error.c_str());
115 return 1;
116}
117
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +0000118LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
119 LLVMModuleRef M,
120 char **OutError) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000121 std::string Error;
Rafael Espindola2a8a2792014-08-19 04:04:25 +0000122 EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
Reid Klecknerfc8a2d52009-07-18 00:42:18 +0000123 builder.setEngineKind(EngineKind::Interpreter)
124 .setErrorStr(&Error);
125 if (ExecutionEngine *Interp = builder.create()) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000126 *OutInterp = wrap(Interp);
127 return 0;
128 }
129 *OutError = strdup(Error.c_str());
130 return 1;
131}
132
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +0000133LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
134 LLVMModuleRef M,
135 unsigned OptLevel,
136 char **OutError) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000137 std::string Error;
Rafael Espindola2a8a2792014-08-19 04:04:25 +0000138 EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
Reid Klecknerfc8a2d52009-07-18 00:42:18 +0000139 builder.setEngineKind(EngineKind::JIT)
140 .setErrorStr(&Error)
141 .setOptLevel((CodeGenOpt::Level)OptLevel);
142 if (ExecutionEngine *JIT = builder.create()) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000143 *OutJIT = wrap(JIT);
144 return 0;
145 }
146 *OutError = strdup(Error.c_str());
147 return 1;
148}
149
Filip Pizlo85e0d272013-05-01 22:58:00 +0000150void LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
151 size_t SizeOfPassedOptions) {
152 LLVMMCJITCompilerOptions options;
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000153 memset(&options, 0, sizeof(options)); // Most fields are zero by default.
Filip Pizlo85e0d272013-05-01 22:58:00 +0000154 options.CodeModel = LLVMCodeModelJITDefault;
Fangrui Songf78650a2018-07-30 19:41:25 +0000155
Filip Pizlo85e0d272013-05-01 22:58:00 +0000156 memcpy(PassedOptions, &options,
157 std::min(sizeof(options), SizeOfPassedOptions));
158}
159
160LLVMBool LLVMCreateMCJITCompilerForModule(
161 LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
162 LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
163 char **OutError) {
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000164 LLVMMCJITCompilerOptions options;
165 // If the user passed a larger sized options struct, then they were compiled
166 // against a newer LLVM. Tell them that something is wrong.
167 if (SizeOfPassedOptions > sizeof(options)) {
168 *OutError = strdup(
Filip Pizlo85e0d272013-05-01 22:58:00 +0000169 "Refusing to use options struct that is larger than my own; assuming "
170 "LLVM library mismatch.");
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000171 return 1;
172 }
Fangrui Songf78650a2018-07-30 19:41:25 +0000173
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000174 // Defend against the user having an old version of the API by ensuring that
175 // any fields they didn't see are cleared. We must defend against fields being
176 // set to the bitwise equivalent of zero, and assume that this means "do the
177 // default" as if that option hadn't been available.
Filip Pizlo85e0d272013-05-01 22:58:00 +0000178 LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000179 memcpy(&options, PassedOptions, SizeOfPassedOptions);
Fangrui Songf78650a2018-07-30 19:41:25 +0000180
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000181 TargetOptions targetOptions;
Filip Pizlo85e0d272013-05-01 22:58:00 +0000182 targetOptions.EnableFastISel = options.EnableFastISel;
Akira Hatanakaddf76aa2015-05-23 01:14:08 +0000183 std::unique_ptr<Module> Mod(unwrap(M));
184
185 if (Mod)
Fangrui Song583ef132019-12-24 17:10:32 -0800186 // Set function attribute "frame-pointer" based on
Akira Hatanakaddf76aa2015-05-23 01:14:08 +0000187 // NoFramePointerElim.
Akira Hatanakae36505c2015-05-26 20:17:20 +0000188 for (auto &F : *Mod) {
189 auto Attrs = F.getAttributes();
Fangrui Song583ef132019-12-24 17:10:32 -0800190 StringRef Value = options.NoFramePointerElim ? "all" : "none";
Reid Klecknerb5180542017-03-21 16:57:19 +0000191 Attrs = Attrs.addAttribute(F.getContext(), AttributeList::FunctionIndex,
Fangrui Song583ef132019-12-24 17:10:32 -0800192 "frame-pointer", Value);
Akira Hatanakae36505c2015-05-26 20:17:20 +0000193 F.setAttributes(Attrs);
194 }
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000195
196 std::string Error;
Akira Hatanakaddf76aa2015-05-23 01:14:08 +0000197 EngineBuilder builder(std::move(Mod));
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000198 builder.setEngineKind(EngineKind::JIT)
199 .setErrorStr(&Error)
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000200 .setOptLevel((CodeGenOpt::Level)options.OptLevel)
201 .setTargetOptions(targetOptions);
Rafael Espindola79e238a2017-08-03 02:16:21 +0000202 bool JIT;
203 if (Optional<CodeModel::Model> CM = unwrap(options.CodeModel, JIT))
204 builder.setCodeModel(*CM);
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000205 if (options.MCJMM)
Lang Hames4a5697e2014-12-03 00:51:19 +0000206 builder.setMCJITMemoryManager(
207 std::unique_ptr<RTDyldMemoryManager>(unwrap(options.MCJMM)));
Andrew Kaylor31be5ef2013-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
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000216void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
217 delete unwrap(EE);
218}
219
220void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
Amaury Sechet74f4ce62016-01-15 00:23:34 +0000221 unwrap(EE)->finalizeObject();
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000222 unwrap(EE)->runStaticConstructorsDestructors(false);
223}
224
225void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
Amaury Sechet74f4ce62016-01-15 00:23:34 +0000226 unwrap(EE)->finalizeObject();
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000227 unwrap(EE)->runStaticConstructorsDestructors(true);
228}
229
230int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
231 unsigned ArgC, const char * const *ArgV,
232 const char * const *EnvP) {
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000233 unwrap(EE)->finalizeObject();
Benjamin Kramerf5e2fc42015-05-29 19:43:39 +0000234
235 std::vector<std::string> ArgVec(ArgV, ArgV + ArgC);
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000236 return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
237}
238
239LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
240 unsigned NumArgs,
241 LLVMGenericValueRef *Args) {
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000242 unwrap(EE)->finalizeObject();
Fangrui Songf78650a2018-07-30 19:41:25 +0000243
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000244 std::vector<GenericValue> ArgVec;
245 ArgVec.reserve(NumArgs);
246 for (unsigned I = 0; I != NumArgs; ++I)
247 ArgVec.push_back(*unwrap(Args[I]));
Fangrui Songf78650a2018-07-30 19:41:25 +0000248
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000249 GenericValue *Result = new GenericValue();
250 *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
251 return wrap(Result);
252}
253
254void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000255}
256
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +0000257void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
Rafael Espindola2a8a2792014-08-19 04:04:25 +0000258 unwrap(EE)->addModule(std::unique_ptr<Module>(unwrap(M)));
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +0000259}
260
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +0000261LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
262 LLVMModuleRef *OutMod, char **OutError) {
263 Module *Mod = unwrap(M);
264 unwrap(EE)->removeModule(Mod);
265 *OutMod = wrap(Mod);
266 return 0;
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000267}
268
Chris Lattner25963c62010-01-09 22:27:07 +0000269LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
270 LLVMValueRef *OutFn) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +0000271 if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
272 *OutFn = wrap(F);
273 return 0;
274 }
275 return 1;
276}
Erick Tryzelaar8ac07c22008-03-27 00:27:14 +0000277
Filip Pizlo85e0d272013-05-01 22:58:00 +0000278void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
279 LLVMValueRef Fn) {
Eric Christopher79cc1e32014-09-02 22:28:02 +0000280 return nullptr;
Duncan Sands330134b2010-07-19 09:33:13 +0000281}
282
Erick Tryzelaar8ac07c22008-03-27 00:27:14 +0000283LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
Mehdi Aminia3fcefb2015-07-16 16:34:23 +0000284 return wrap(&unwrap(EE)->getDataLayout());
Erick Tryzelaar8ac07c22008-03-27 00:27:14 +0000285}
Gordon Henriksen9f337542008-06-20 02:16:11 +0000286
Juergen Ributzka5fe955c2014-01-23 19:23:28 +0000287LLVMTargetMachineRef
288LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
289 return wrap(unwrap(EE)->getTargetMachine());
290}
291
Gordon Henriksen9f337542008-06-20 02:16:11 +0000292void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
293 void* Addr) {
294 unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
295}
Chris Lattner41b43da2009-01-21 18:11:10 +0000296
297void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
Andrew Kaylor31be5ef2013-04-29 17:49:40 +0000298 unwrap(EE)->finalizeObject();
Fangrui Songf78650a2018-07-30 19:41:25 +0000299
Chris Lattner41b43da2009-01-21 18:11:10 +0000300 return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
301}
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000302
Peter Zotovc433cd72014-12-22 18:53:11 +0000303uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name) {
304 return unwrap(EE)->getGlobalValueAddress(Name);
305}
306
307uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name) {
308 return unwrap(EE)->getFunctionAddress(Name);
309}
310
Lang Hames906a91a2020-03-13 09:24:09 -0700311LLVMBool LLVMExecutionEngineGetErrMsg(LLVMExecutionEngineRef EE,
312 char **OutError) {
313 assert(OutError && "OutError must be non-null");
314 auto *ExecEngine = unwrap(EE);
315 if (ExecEngine->hasError()) {
316 *OutError = strdup(ExecEngine->getErrorMessage().c_str());
317 ExecEngine->clearErrorMessage();
318 return true;
319 }
320 return false;
321}
322
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000323/*===-- Operations on memory managers -------------------------------------===*/
324
325namespace {
326
327struct SimpleBindingMMFunctions {
Anders Waldenborg9515b312013-09-30 19:11:32 +0000328 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
329 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
330 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
331 LLVMMemoryManagerDestroyCallback Destroy;
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000332};
333
334class SimpleBindingMemoryManager : public RTDyldMemoryManager {
335public:
336 SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
337 void *Opaque);
Alexander Kornienkof817c1c2015-04-11 02:11:45 +0000338 ~SimpleBindingMemoryManager() override;
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000339
Craig Topperb51ff602014-03-08 07:51:20 +0000340 uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
341 unsigned SectionID,
342 StringRef SectionName) override;
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000343
Craig Topperb51ff602014-03-08 07:51:20 +0000344 uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
345 unsigned SectionID, StringRef SectionName,
346 bool isReadOnly) override;
347
348 bool finalizeMemory(std::string *ErrMsg) override;
349
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000350private:
351 SimpleBindingMMFunctions Functions;
352 void *Opaque;
353};
354
355SimpleBindingMemoryManager::SimpleBindingMemoryManager(
356 const SimpleBindingMMFunctions& Functions,
357 void *Opaque)
358 : Functions(Functions), Opaque(Opaque) {
359 assert(Functions.AllocateCodeSection &&
360 "No AllocateCodeSection function provided!");
361 assert(Functions.AllocateDataSection &&
362 "No AllocateDataSection function provided!");
363 assert(Functions.FinalizeMemory &&
364 "No FinalizeMemory function provided!");
365 assert(Functions.Destroy &&
366 "No Destroy function provided!");
367}
368
369SimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
370 Functions.Destroy(Opaque);
371}
372
373uint8_t *SimpleBindingMemoryManager::allocateCodeSection(
Filip Pizlo7aa695e02013-10-02 00:59:25 +0000374 uintptr_t Size, unsigned Alignment, unsigned SectionID,
375 StringRef SectionName) {
376 return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
377 SectionName.str().c_str());
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000378}
379
380uint8_t *SimpleBindingMemoryManager::allocateDataSection(
Filip Pizlo7aa695e02013-10-02 00:59:25 +0000381 uintptr_t Size, unsigned Alignment, unsigned SectionID,
382 StringRef SectionName, bool isReadOnly) {
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000383 return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
Filip Pizlo7aa695e02013-10-02 00:59:25 +0000384 SectionName.str().c_str(),
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000385 isReadOnly);
386}
387
388bool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
Craig Topper2617dcc2014-04-15 06:32:26 +0000389 char *errMsgCString = nullptr;
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000390 bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
391 assert((result || !errMsgCString) &&
392 "Did not expect an error message if FinalizeMemory succeeded");
393 if (errMsgCString) {
394 if (ErrMsg)
395 *ErrMsg = errMsgCString;
396 free(errMsgCString);
397 }
398 return result;
399}
400
401} // anonymous namespace
402
403LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
404 void *Opaque,
Anders Waldenborg9515b312013-09-30 19:11:32 +0000405 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
406 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
407 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
408 LLVMMemoryManagerDestroyCallback Destroy) {
Fangrui Songf78650a2018-07-30 19:41:25 +0000409
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000410 if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
411 !Destroy)
Craig Topper2617dcc2014-04-15 06:32:26 +0000412 return nullptr;
Fangrui Songf78650a2018-07-30 19:41:25 +0000413
Filip Pizlo3fdbaff2013-05-22 02:46:43 +0000414 SimpleBindingMMFunctions functions;
415 functions.AllocateCodeSection = AllocateCodeSection;
416 functions.AllocateDataSection = AllocateDataSection;
417 functions.FinalizeMemory = FinalizeMemory;
418 functions.Destroy = Destroy;
419 return wrap(new SimpleBindingMemoryManager(functions, Opaque));
420}
421
422void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
423 delete unwrap(MM);
424}
425
Andres Freundee10ce72018-07-25 15:04:57 +0000426/*===-- JIT Event Listener functions -------------------------------------===*/
427
428
429#if !LLVM_USE_INTEL_JITEVENTS
430LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void)
431{
432 return nullptr;
433}
434#endif
435
436#if !LLVM_USE_OPROFILE
437LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void)
438{
439 return nullptr;
440}
441#endif
442
443#if !LLVM_USE_PERF
444LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void)
445{
446 return nullptr;
447}
448#endif