1 //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the C bindings for the ExecutionEngine library.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm-c/ExecutionEngine.h"
15 #include "llvm/ExecutionEngine/ExecutionEngine.h"
16 #include "llvm/ExecutionEngine/GenericValue.h"
17 #include "llvm/ExecutionEngine/JITEventListener.h"
18 #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
19 #include "llvm/IR/DerivedTypes.h"
20 #include "llvm/IR/Module.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include "llvm/Target/CodeGenCWrappers.h"
23 #include "llvm/Target/TargetOptions.h"
24 #include <cstring>
25
26 using namespace llvm;
27
28 #define DEBUG_TYPE "jit"
29
30 // Wrapping the C bindings types.
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue,LLVMGenericValueRef)31 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
32
33
34 static LLVMTargetMachineRef wrap(const TargetMachine *P) {
35 return
36 reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
37 }
38
39 /*===-- Operations on generic values --------------------------------------===*/
40
LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,unsigned long long N,LLVMBool IsSigned)41 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
42 unsigned long long N,
43 LLVMBool IsSigned) {
44 GenericValue *GenVal = new GenericValue();
45 GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
46 return wrap(GenVal);
47 }
48
LLVMCreateGenericValueOfPointer(void * P)49 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
50 GenericValue *GenVal = new GenericValue();
51 GenVal->PointerVal = P;
52 return wrap(GenVal);
53 }
54
LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef,double N)55 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
56 GenericValue *GenVal = new GenericValue();
57 switch (unwrap(TyRef)->getTypeID()) {
58 case Type::FloatTyID:
59 GenVal->FloatVal = N;
60 break;
61 case Type::DoubleTyID:
62 GenVal->DoubleVal = N;
63 break;
64 default:
65 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
66 }
67 return wrap(GenVal);
68 }
69
LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef)70 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
71 return unwrap(GenValRef)->IntVal.getBitWidth();
72 }
73
LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,LLVMBool IsSigned)74 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
75 LLVMBool IsSigned) {
76 GenericValue *GenVal = unwrap(GenValRef);
77 if (IsSigned)
78 return GenVal->IntVal.getSExtValue();
79 else
80 return GenVal->IntVal.getZExtValue();
81 }
82
LLVMGenericValueToPointer(LLVMGenericValueRef GenVal)83 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
84 return unwrap(GenVal)->PointerVal;
85 }
86
LLVMGenericValueToFloat(LLVMTypeRef TyRef,LLVMGenericValueRef GenVal)87 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
88 switch (unwrap(TyRef)->getTypeID()) {
89 case Type::FloatTyID:
90 return unwrap(GenVal)->FloatVal;
91 case Type::DoubleTyID:
92 return unwrap(GenVal)->DoubleVal;
93 default:
94 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
95 }
96 }
97
LLVMDisposeGenericValue(LLVMGenericValueRef GenVal)98 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
99 delete unwrap(GenVal);
100 }
101
102 /*===-- Operations on execution engines -----------------------------------===*/
103
LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef * OutEE,LLVMModuleRef M,char ** OutError)104 LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
105 LLVMModuleRef M,
106 char **OutError) {
107 std::string Error;
108 EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
109 builder.setEngineKind(EngineKind::Either)
110 .setErrorStr(&Error);
111 if (ExecutionEngine *EE = builder.create()){
112 *OutEE = wrap(EE);
113 return 0;
114 }
115 *OutError = strdup(Error.c_str());
116 return 1;
117 }
118
LLVMCreateInterpreterForModule(LLVMExecutionEngineRef * OutInterp,LLVMModuleRef M,char ** OutError)119 LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
120 LLVMModuleRef M,
121 char **OutError) {
122 std::string Error;
123 EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
124 builder.setEngineKind(EngineKind::Interpreter)
125 .setErrorStr(&Error);
126 if (ExecutionEngine *Interp = builder.create()) {
127 *OutInterp = wrap(Interp);
128 return 0;
129 }
130 *OutError = strdup(Error.c_str());
131 return 1;
132 }
133
LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef * OutJIT,LLVMModuleRef M,unsigned OptLevel,char ** OutError)134 LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
135 LLVMModuleRef M,
136 unsigned OptLevel,
137 char **OutError) {
138 std::string Error;
139 EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
140 builder.setEngineKind(EngineKind::JIT)
141 .setErrorStr(&Error)
142 .setOptLevel((CodeGenOpt::Level)OptLevel);
143 if (ExecutionEngine *JIT = builder.create()) {
144 *OutJIT = wrap(JIT);
145 return 0;
146 }
147 *OutError = strdup(Error.c_str());
148 return 1;
149 }
150
LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions * PassedOptions,size_t SizeOfPassedOptions)151 void LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
152 size_t SizeOfPassedOptions) {
153 LLVMMCJITCompilerOptions options;
154 memset(&options, 0, sizeof(options)); // Most fields are zero by default.
155 options.CodeModel = LLVMCodeModelJITDefault;
156
157 memcpy(PassedOptions, &options,
158 std::min(sizeof(options), SizeOfPassedOptions));
159 }
160
LLVMCreateMCJITCompilerForModule(LLVMExecutionEngineRef * OutJIT,LLVMModuleRef M,LLVMMCJITCompilerOptions * PassedOptions,size_t SizeOfPassedOptions,char ** OutError)161 LLVMBool LLVMCreateMCJITCompilerForModule(
162 LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
163 LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
164 char **OutError) {
165 LLVMMCJITCompilerOptions options;
166 // If the user passed a larger sized options struct, then they were compiled
167 // against a newer LLVM. Tell them that something is wrong.
168 if (SizeOfPassedOptions > sizeof(options)) {
169 *OutError = strdup(
170 "Refusing to use options struct that is larger than my own; assuming "
171 "LLVM library mismatch.");
172 return 1;
173 }
174
175 // Defend against the user having an old version of the API by ensuring that
176 // any fields they didn't see are cleared. We must defend against fields being
177 // set to the bitwise equivalent of zero, and assume that this means "do the
178 // default" as if that option hadn't been available.
179 LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
180 memcpy(&options, PassedOptions, SizeOfPassedOptions);
181
182 TargetOptions targetOptions;
183 targetOptions.EnableFastISel = options.EnableFastISel;
184 std::unique_ptr<Module> Mod(unwrap(M));
185
186 if (Mod)
187 // Set function attribute "no-frame-pointer-elim" based on
188 // NoFramePointerElim.
189 for (auto &F : *Mod) {
190 auto Attrs = F.getAttributes();
191 StringRef Value(options.NoFramePointerElim ? "true" : "false");
192 Attrs = Attrs.addAttribute(F.getContext(), AttributeList::FunctionIndex,
193 "no-frame-pointer-elim", Value);
194 F.setAttributes(Attrs);
195 }
196
197 std::string Error;
198 EngineBuilder builder(std::move(Mod));
199 builder.setEngineKind(EngineKind::JIT)
200 .setErrorStr(&Error)
201 .setOptLevel((CodeGenOpt::Level)options.OptLevel)
202 .setTargetOptions(targetOptions);
203 bool JIT;
204 if (Optional<CodeModel::Model> CM = unwrap(options.CodeModel, JIT))
205 builder.setCodeModel(*CM);
206 if (options.MCJMM)
207 builder.setMCJITMemoryManager(
208 std::unique_ptr<RTDyldMemoryManager>(unwrap(options.MCJMM)));
209 if (ExecutionEngine *JIT = builder.create()) {
210 *OutJIT = wrap(JIT);
211 return 0;
212 }
213 *OutError = strdup(Error.c_str());
214 return 1;
215 }
216
LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE)217 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
218 delete unwrap(EE);
219 }
220
LLVMRunStaticConstructors(LLVMExecutionEngineRef EE)221 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
222 unwrap(EE)->finalizeObject();
223 unwrap(EE)->runStaticConstructorsDestructors(false);
224 }
225
LLVMRunStaticDestructors(LLVMExecutionEngineRef EE)226 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
227 unwrap(EE)->finalizeObject();
228 unwrap(EE)->runStaticConstructorsDestructors(true);
229 }
230
LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE,LLVMValueRef F,unsigned ArgC,const char * const * ArgV,const char * const * EnvP)231 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
232 unsigned ArgC, const char * const *ArgV,
233 const char * const *EnvP) {
234 unwrap(EE)->finalizeObject();
235
236 std::vector<std::string> ArgVec(ArgV, ArgV + ArgC);
237 return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
238 }
239
LLVMRunFunction(LLVMExecutionEngineRef EE,LLVMValueRef F,unsigned NumArgs,LLVMGenericValueRef * Args)240 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
241 unsigned NumArgs,
242 LLVMGenericValueRef *Args) {
243 unwrap(EE)->finalizeObject();
244
245 std::vector<GenericValue> ArgVec;
246 ArgVec.reserve(NumArgs);
247 for (unsigned I = 0; I != NumArgs; ++I)
248 ArgVec.push_back(*unwrap(Args[I]));
249
250 GenericValue *Result = new GenericValue();
251 *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
252 return wrap(Result);
253 }
254
LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE,LLVMValueRef F)255 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
256 }
257
LLVMAddModule(LLVMExecutionEngineRef EE,LLVMModuleRef M)258 void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
259 unwrap(EE)->addModule(std::unique_ptr<Module>(unwrap(M)));
260 }
261
LLVMRemoveModule(LLVMExecutionEngineRef EE,LLVMModuleRef M,LLVMModuleRef * OutMod,char ** OutError)262 LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
263 LLVMModuleRef *OutMod, char **OutError) {
264 Module *Mod = unwrap(M);
265 unwrap(EE)->removeModule(Mod);
266 *OutMod = wrap(Mod);
267 return 0;
268 }
269
LLVMFindFunction(LLVMExecutionEngineRef EE,const char * Name,LLVMValueRef * OutFn)270 LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
271 LLVMValueRef *OutFn) {
272 if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
273 *OutFn = wrap(F);
274 return 0;
275 }
276 return 1;
277 }
278
LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,LLVMValueRef Fn)279 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
280 LLVMValueRef Fn) {
281 return nullptr;
282 }
283
LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE)284 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
285 return wrap(&unwrap(EE)->getDataLayout());
286 }
287
288 LLVMTargetMachineRef
LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE)289 LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
290 return wrap(unwrap(EE)->getTargetMachine());
291 }
292
LLVMAddGlobalMapping(LLVMExecutionEngineRef EE,LLVMValueRef Global,void * Addr)293 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
294 void* Addr) {
295 unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
296 }
297
LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE,LLVMValueRef Global)298 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
299 unwrap(EE)->finalizeObject();
300
301 return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
302 }
303
LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE,const char * Name)304 uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name) {
305 return unwrap(EE)->getGlobalValueAddress(Name);
306 }
307
LLVMGetFunctionAddress(LLVMExecutionEngineRef EE,const char * Name)308 uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name) {
309 return unwrap(EE)->getFunctionAddress(Name);
310 }
311
312 /*===-- Operations on memory managers -------------------------------------===*/
313
314 namespace {
315
316 struct SimpleBindingMMFunctions {
317 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
318 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
319 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
320 LLVMMemoryManagerDestroyCallback Destroy;
321 };
322
323 class SimpleBindingMemoryManager : public RTDyldMemoryManager {
324 public:
325 SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
326 void *Opaque);
327 ~SimpleBindingMemoryManager() override;
328
329 uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
330 unsigned SectionID,
331 StringRef SectionName) override;
332
333 uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
334 unsigned SectionID, StringRef SectionName,
335 bool isReadOnly) override;
336
337 bool finalizeMemory(std::string *ErrMsg) override;
338
339 private:
340 SimpleBindingMMFunctions Functions;
341 void *Opaque;
342 };
343
SimpleBindingMemoryManager(const SimpleBindingMMFunctions & Functions,void * Opaque)344 SimpleBindingMemoryManager::SimpleBindingMemoryManager(
345 const SimpleBindingMMFunctions& Functions,
346 void *Opaque)
347 : Functions(Functions), Opaque(Opaque) {
348 assert(Functions.AllocateCodeSection &&
349 "No AllocateCodeSection function provided!");
350 assert(Functions.AllocateDataSection &&
351 "No AllocateDataSection function provided!");
352 assert(Functions.FinalizeMemory &&
353 "No FinalizeMemory function provided!");
354 assert(Functions.Destroy &&
355 "No Destroy function provided!");
356 }
357
~SimpleBindingMemoryManager()358 SimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
359 Functions.Destroy(Opaque);
360 }
361
allocateCodeSection(uintptr_t Size,unsigned Alignment,unsigned SectionID,StringRef SectionName)362 uint8_t *SimpleBindingMemoryManager::allocateCodeSection(
363 uintptr_t Size, unsigned Alignment, unsigned SectionID,
364 StringRef SectionName) {
365 return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
366 SectionName.str().c_str());
367 }
368
allocateDataSection(uintptr_t Size,unsigned Alignment,unsigned SectionID,StringRef SectionName,bool isReadOnly)369 uint8_t *SimpleBindingMemoryManager::allocateDataSection(
370 uintptr_t Size, unsigned Alignment, unsigned SectionID,
371 StringRef SectionName, bool isReadOnly) {
372 return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
373 SectionName.str().c_str(),
374 isReadOnly);
375 }
376
finalizeMemory(std::string * ErrMsg)377 bool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
378 char *errMsgCString = nullptr;
379 bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
380 assert((result || !errMsgCString) &&
381 "Did not expect an error message if FinalizeMemory succeeded");
382 if (errMsgCString) {
383 if (ErrMsg)
384 *ErrMsg = errMsgCString;
385 free(errMsgCString);
386 }
387 return result;
388 }
389
390 } // anonymous namespace
391
LLVMCreateSimpleMCJITMemoryManager(void * Opaque,LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,LLVMMemoryManagerDestroyCallback Destroy)392 LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
393 void *Opaque,
394 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
395 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
396 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
397 LLVMMemoryManagerDestroyCallback Destroy) {
398
399 if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
400 !Destroy)
401 return nullptr;
402
403 SimpleBindingMMFunctions functions;
404 functions.AllocateCodeSection = AllocateCodeSection;
405 functions.AllocateDataSection = AllocateDataSection;
406 functions.FinalizeMemory = FinalizeMemory;
407 functions.Destroy = Destroy;
408 return wrap(new SimpleBindingMemoryManager(functions, Opaque));
409 }
410
LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM)411 void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
412 delete unwrap(MM);
413 }
414
415 /*===-- JIT Event Listener functions -------------------------------------===*/
416
417
418 #if !LLVM_USE_INTEL_JITEVENTS
LLVMCreateIntelJITEventListener(void)419 LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void)
420 {
421 return nullptr;
422 }
423 #endif
424
425 #if !LLVM_USE_OPROFILE
LLVMCreateOProfileJITEventListener(void)426 LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void)
427 {
428 return nullptr;
429 }
430 #endif
431
432 #if !LLVM_USE_PERF
LLVMCreatePerfJITEventListener(void)433 LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void)
434 {
435 return nullptr;
436 }
437 #endif
438