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