Wrap.h: Define wrap / unwrap function for ExecutionEngine
[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 #define DEBUG_TYPE "jit"
15 #include "llvm-c/ExecutionEngine.h"
16 #include "llvm/ExecutionEngine/ExecutionEngine.h"
17 #include "llvm/ExecutionEngine/GenericValue.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Wrap.h"
20 #include <cstring>
21
22 using namespace llvm;
23
24 // Wrapping the C bindings types.
25 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue,       LLVMGenericValueRef  )
26
27 inline DataLayout *unwrap(LLVMTargetDataRef P) {
28   return reinterpret_cast<DataLayout*>(P);
29 }
30   
31 inline LLVMTargetDataRef wrap(const DataLayout *P) {
32   return reinterpret_cast<LLVMTargetDataRef>(const_cast<DataLayout*>(P));
33 }
34
35 inline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) {
36   return reinterpret_cast<TargetLibraryInfo*>(P);
37 }
38
39 inline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) {
40   TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P);
41   return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
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 LLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
157                                    LLVMModuleProviderRef MP,
158                                    char **OutError) {
159   /* The module provider is now actually a module. */
160   return LLVMCreateExecutionEngineForModule(OutEE,
161                                             reinterpret_cast<LLVMModuleRef>(MP),
162                                             OutError);
163 }
164
165 LLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
166                                LLVMModuleProviderRef MP,
167                                char **OutError) {
168   /* The module provider is now actually a module. */
169   return LLVMCreateInterpreterForModule(OutInterp,
170                                         reinterpret_cast<LLVMModuleRef>(MP),
171                                         OutError);
172 }
173
174 LLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
175                                LLVMModuleProviderRef MP,
176                                unsigned OptLevel,
177                                char **OutError) {
178   /* The module provider is now actually a module. */
179   return LLVMCreateJITCompilerForModule(OutJIT,
180                                         reinterpret_cast<LLVMModuleRef>(MP),
181                                         OptLevel, OutError);
182 }
183
184
185 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
186   delete unwrap(EE);
187 }
188
189 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
190   unwrap(EE)->runStaticConstructorsDestructors(false);
191 }
192
193 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
194   unwrap(EE)->runStaticConstructorsDestructors(true);
195 }
196
197 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
198                           unsigned ArgC, const char * const *ArgV,
199                           const char * const *EnvP) {
200   std::vector<std::string> ArgVec;
201   for (unsigned I = 0; I != ArgC; ++I)
202     ArgVec.push_back(ArgV[I]);
203   
204   return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
205 }
206
207 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
208                                     unsigned NumArgs,
209                                     LLVMGenericValueRef *Args) {
210   std::vector<GenericValue> ArgVec;
211   ArgVec.reserve(NumArgs);
212   for (unsigned I = 0; I != NumArgs; ++I)
213     ArgVec.push_back(*unwrap(Args[I]));
214   
215   GenericValue *Result = new GenericValue();
216   *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
217   return wrap(Result);
218 }
219
220 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
221   unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
222 }
223
224 void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
225   unwrap(EE)->addModule(unwrap(M));
226 }
227
228 void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
229   /* The module provider is now actually a module. */
230   LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP));
231 }
232
233 LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
234                           LLVMModuleRef *OutMod, char **OutError) {
235   Module *Mod = unwrap(M);
236   unwrap(EE)->removeModule(Mod);
237   *OutMod = wrap(Mod);
238   return 0;
239 }
240
241 LLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
242                                   LLVMModuleProviderRef MP,
243                                   LLVMModuleRef *OutMod, char **OutError) {
244   /* The module provider is now actually a module. */
245   return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod,
246                           OutError);
247 }
248
249 LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
250                           LLVMValueRef *OutFn) {
251   if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
252     *OutFn = wrap(F);
253     return 0;
254   }
255   return 1;
256 }
257
258 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn) {
259   return unwrap(EE)->recompileAndRelinkFunction(unwrap<Function>(Fn));
260 }
261
262 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
263   return wrap(unwrap(EE)->getDataLayout());
264 }
265
266 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
267                           void* Addr) {
268   unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
269 }
270
271 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
272   return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
273 }