LLVM API Documentation
00001 //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file defines the C bindings for the ExecutionEngine library. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #define DEBUG_TYPE "jit" 00015 #include "llvm-c/ExecutionEngine.h" 00016 #include "llvm/ExecutionEngine/GenericValue.h" 00017 #include "llvm/ExecutionEngine/ExecutionEngine.h" 00018 #include <cstring> 00019 00020 using namespace llvm; 00021 00022 /*===-- Operations on generic values --------------------------------------===*/ 00023 00024 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 00025 unsigned long long N, 00026 int IsSigned) { 00027 GenericValue *GenVal = new GenericValue(); 00028 GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned); 00029 return wrap(GenVal); 00030 } 00031 00032 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) { 00033 GenericValue *GenVal = new GenericValue(); 00034 GenVal->PointerVal = P; 00035 return wrap(GenVal); 00036 } 00037 00038 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) { 00039 GenericValue *GenVal = new GenericValue(); 00040 switch (unwrap(TyRef)->getTypeID()) { 00041 case Type::FloatTyID: 00042 GenVal->FloatVal = N; 00043 break; 00044 case Type::DoubleTyID: 00045 GenVal->DoubleVal = N; 00046 break; 00047 default: 00048 assert(0 && "LLVMGenericValueToFloat supports only float and double."); 00049 break; 00050 } 00051 return wrap(GenVal); 00052 } 00053 00054 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) { 00055 return unwrap(GenValRef)->IntVal.getBitWidth(); 00056 } 00057 00058 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef, 00059 int IsSigned) { 00060 GenericValue *GenVal = unwrap(GenValRef); 00061 if (IsSigned) 00062 return GenVal->IntVal.getSExtValue(); 00063 else 00064 return GenVal->IntVal.getZExtValue(); 00065 } 00066 00067 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) { 00068 return unwrap(GenVal)->PointerVal; 00069 } 00070 00071 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) { 00072 switch (unwrap(TyRef)->getTypeID()) { 00073 case Type::FloatTyID: 00074 return unwrap(GenVal)->FloatVal; 00075 case Type::DoubleTyID: 00076 return unwrap(GenVal)->DoubleVal; 00077 default: 00078 assert(0 && "LLVMGenericValueToFloat supports only float and double."); 00079 break; 00080 } 00081 return 0; // Not reached 00082 } 00083 00084 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) { 00085 delete unwrap(GenVal); 00086 } 00087 00088 /*===-- Operations on execution engines -----------------------------------===*/ 00089 00090 int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE, 00091 LLVMModuleProviderRef MP, 00092 char **OutError) { 00093 std::string Error; 00094 if (ExecutionEngine *EE = ExecutionEngine::create(unwrap(MP), false, &Error)){ 00095 *OutEE = wrap(EE); 00096 return 0; 00097 } 00098 *OutError = strdup(Error.c_str()); 00099 return 1; 00100 } 00101 00102 int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, 00103 LLVMModuleProviderRef MP, 00104 char **OutError) { 00105 std::string Error; 00106 if (ExecutionEngine *Interp = 00107 ExecutionEngine::create(unwrap(MP), true, &Error)) { 00108 *OutInterp = wrap(Interp); 00109 return 0; 00110 } 00111 *OutError = strdup(Error.c_str()); 00112 return 1; 00113 } 00114 00115 int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, 00116 LLVMModuleProviderRef MP, 00117 int Fast, 00118 char **OutError) { 00119 std::string Error; 00120 if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error, 0, 00121 Fast != 0)) { 00122 *OutJIT = wrap(JIT); 00123 return 0; 00124 } 00125 *OutError = strdup(Error.c_str()); 00126 return 1; 00127 } 00128 00129 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) { 00130 delete unwrap(EE); 00131 } 00132 00133 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) { 00134 unwrap(EE)->runStaticConstructorsDestructors(false); 00135 } 00136 00137 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) { 00138 unwrap(EE)->runStaticConstructorsDestructors(true); 00139 } 00140 00141 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 00142 unsigned ArgC, const char * const *ArgV, 00143 const char * const *EnvP) { 00144 std::vector<std::string> ArgVec; 00145 for (unsigned I = 0; I != ArgC; ++I) 00146 ArgVec.push_back(ArgV[I]); 00147 00148 return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP); 00149 } 00150 00151 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 00152 unsigned NumArgs, 00153 LLVMGenericValueRef *Args) { 00154 std::vector<GenericValue> ArgVec; 00155 ArgVec.reserve(NumArgs); 00156 for (unsigned I = 0; I != NumArgs; ++I) 00157 ArgVec.push_back(*unwrap(Args[I])); 00158 00159 GenericValue *Result = new GenericValue(); 00160 *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec); 00161 return wrap(Result); 00162 } 00163 00164 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) { 00165 unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F)); 00166 } 00167 00168 void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){ 00169 unwrap(EE)->addModuleProvider(unwrap(MP)); 00170 } 00171 00172 int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, 00173 LLVMModuleProviderRef MP, 00174 LLVMModuleRef *OutMod, char **OutError) { 00175 std::string Error; 00176 if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) { 00177 *OutMod = wrap(Gone); 00178 return 0; 00179 } 00180 if (OutError) 00181 *OutError = strdup(Error.c_str()); 00182 return 1; 00183 } 00184 00185 int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 00186 LLVMValueRef *OutFn) { 00187 if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) { 00188 *OutFn = wrap(F); 00189 return 0; 00190 } 00191 return 1; 00192 } 00193 00194 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { 00195 return wrap(unwrap(EE)->getTargetData()); 00196 } 00197 00198 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, 00199 void* Addr) { 00200 unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr); 00201 } 00202 00203 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) { 00204 return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global)); 00205 }