1 //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the C bindings for the ExecutionEngine library.
12 //===----------------------------------------------------------------------===//
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"
28 #define DEBUG_TYPE "jit"
30 // Wrapping the C bindings types.
31 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue
, LLVMGenericValueRef
)
34 static LLVMTargetMachineRef
wrap(const TargetMachine
*P
) {
36 reinterpret_cast<LLVMTargetMachineRef
>(const_cast<TargetMachine
*>(P
));
39 /*===-- Operations on generic values --------------------------------------===*/
41 LLVMGenericValueRef
LLVMCreateGenericValueOfInt(LLVMTypeRef Ty
,
44 GenericValue
*GenVal
= new GenericValue();
45 GenVal
->IntVal
= APInt(unwrap
<IntegerType
>(Ty
)->getBitWidth(), N
, IsSigned
);
49 LLVMGenericValueRef
LLVMCreateGenericValueOfPointer(void *P
) {
50 GenericValue
*GenVal
= new GenericValue();
51 GenVal
->PointerVal
= P
;
55 LLVMGenericValueRef
LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef
, double N
) {
56 GenericValue
*GenVal
= new GenericValue();
57 switch (unwrap(TyRef
)->getTypeID()) {
61 case Type::DoubleTyID
:
62 GenVal
->DoubleVal
= N
;
65 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
70 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef
) {
71 return unwrap(GenValRef
)->IntVal
.getBitWidth();
74 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef
,
76 GenericValue
*GenVal
= unwrap(GenValRef
);
78 return GenVal
->IntVal
.getSExtValue();
80 return GenVal
->IntVal
.getZExtValue();
83 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal
) {
84 return unwrap(GenVal
)->PointerVal
;
87 double LLVMGenericValueToFloat(LLVMTypeRef TyRef
, LLVMGenericValueRef GenVal
) {
88 switch (unwrap(TyRef
)->getTypeID()) {
90 return unwrap(GenVal
)->FloatVal
;
91 case Type::DoubleTyID
:
92 return unwrap(GenVal
)->DoubleVal
;
94 llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
98 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal
) {
99 delete unwrap(GenVal
);
102 /*===-- Operations on execution engines -----------------------------------===*/
104 LLVMBool
LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef
*OutEE
,
108 EngineBuilder
builder(std::unique_ptr
<Module
>(unwrap(M
)));
109 builder
.setEngineKind(EngineKind::Either
)
110 .setErrorStr(&Error
);
111 if (ExecutionEngine
*EE
= builder
.create()){
115 *OutError
= strdup(Error
.c_str());
119 LLVMBool
LLVMCreateInterpreterForModule(LLVMExecutionEngineRef
*OutInterp
,
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
);
130 *OutError
= strdup(Error
.c_str());
134 LLVMBool
LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef
*OutJIT
,
139 EngineBuilder
builder(std::unique_ptr
<Module
>(unwrap(M
)));
140 builder
.setEngineKind(EngineKind::JIT
)
142 .setOptLevel((CodeGenOpt::Level
)OptLevel
);
143 if (ExecutionEngine
*JIT
= builder
.create()) {
147 *OutError
= strdup(Error
.c_str());
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
;
157 memcpy(PassedOptions
, &options
,
158 std::min(sizeof(options
), SizeOfPassedOptions
));
161 LLVMBool
LLVMCreateMCJITCompilerForModule(
162 LLVMExecutionEngineRef
*OutJIT
, LLVMModuleRef M
,
163 LLVMMCJITCompilerOptions
*PassedOptions
, size_t SizeOfPassedOptions
,
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
)) {
170 "Refusing to use options struct that is larger than my own; assuming "
171 "LLVM library mismatch.");
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
);
182 TargetOptions targetOptions
;
183 targetOptions
.EnableFastISel
= options
.EnableFastISel
;
184 std::unique_ptr
<Module
> Mod(unwrap(M
));
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
);
198 EngineBuilder
builder(std::move(Mod
));
199 builder
.setEngineKind(EngineKind::JIT
)
201 .setOptLevel((CodeGenOpt::Level
)options
.OptLevel
)
202 .setTargetOptions(targetOptions
);
204 if (Optional
<CodeModel::Model
> CM
= unwrap(options
.CodeModel
, JIT
))
205 builder
.setCodeModel(*CM
);
207 builder
.setMCJITMemoryManager(
208 std::unique_ptr
<RTDyldMemoryManager
>(unwrap(options
.MCJMM
)));
209 if (ExecutionEngine
*JIT
= builder
.create()) {
213 *OutError
= strdup(Error
.c_str());
217 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE
) {
221 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE
) {
222 unwrap(EE
)->finalizeObject();
223 unwrap(EE
)->runStaticConstructorsDestructors(false);
226 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE
) {
227 unwrap(EE
)->finalizeObject();
228 unwrap(EE
)->runStaticConstructorsDestructors(true);
231 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE
, LLVMValueRef F
,
232 unsigned ArgC
, const char * const *ArgV
,
233 const char * const *EnvP
) {
234 unwrap(EE
)->finalizeObject();
236 std::vector
<std::string
> ArgVec(ArgV
, ArgV
+ ArgC
);
237 return unwrap(EE
)->runFunctionAsMain(unwrap
<Function
>(F
), ArgVec
, EnvP
);
240 LLVMGenericValueRef
LLVMRunFunction(LLVMExecutionEngineRef EE
, LLVMValueRef F
,
242 LLVMGenericValueRef
*Args
) {
243 unwrap(EE
)->finalizeObject();
245 std::vector
<GenericValue
> ArgVec
;
246 ArgVec
.reserve(NumArgs
);
247 for (unsigned I
= 0; I
!= NumArgs
; ++I
)
248 ArgVec
.push_back(*unwrap(Args
[I
]));
250 GenericValue
*Result
= new GenericValue();
251 *Result
= unwrap(EE
)->runFunction(unwrap
<Function
>(F
), ArgVec
);
255 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE
, LLVMValueRef F
) {
258 void LLVMAddModule(LLVMExecutionEngineRef EE
, LLVMModuleRef M
){
259 unwrap(EE
)->addModule(std::unique_ptr
<Module
>(unwrap(M
)));
262 LLVMBool
LLVMRemoveModule(LLVMExecutionEngineRef EE
, LLVMModuleRef M
,
263 LLVMModuleRef
*OutMod
, char **OutError
) {
264 Module
*Mod
= unwrap(M
);
265 unwrap(EE
)->removeModule(Mod
);
270 LLVMBool
LLVMFindFunction(LLVMExecutionEngineRef EE
, const char *Name
,
271 LLVMValueRef
*OutFn
) {
272 if (Function
*F
= unwrap(EE
)->FindFunctionNamed(Name
)) {
279 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE
,
284 LLVMTargetDataRef
LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE
) {
285 return wrap(&unwrap(EE
)->getDataLayout());
289 LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE
) {
290 return wrap(unwrap(EE
)->getTargetMachine());
293 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE
, LLVMValueRef Global
,
295 unwrap(EE
)->addGlobalMapping(unwrap
<GlobalValue
>(Global
), Addr
);
298 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE
, LLVMValueRef Global
) {
299 unwrap(EE
)->finalizeObject();
301 return unwrap(EE
)->getPointerToGlobal(unwrap
<GlobalValue
>(Global
));
304 uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE
, const char *Name
) {
305 return unwrap(EE
)->getGlobalValueAddress(Name
);
308 uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE
, const char *Name
) {
309 return unwrap(EE
)->getFunctionAddress(Name
);
312 /*===-- Operations on memory managers -------------------------------------===*/
316 struct SimpleBindingMMFunctions
{
317 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection
;
318 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection
;
319 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory
;
320 LLVMMemoryManagerDestroyCallback Destroy
;
323 class SimpleBindingMemoryManager
: public RTDyldMemoryManager
{
325 SimpleBindingMemoryManager(const SimpleBindingMMFunctions
& Functions
,
327 ~SimpleBindingMemoryManager() override
;
329 uint8_t *allocateCodeSection(uintptr_t Size
, unsigned Alignment
,
331 StringRef SectionName
) override
;
333 uint8_t *allocateDataSection(uintptr_t Size
, unsigned Alignment
,
334 unsigned SectionID
, StringRef SectionName
,
335 bool isReadOnly
) override
;
337 bool finalizeMemory(std::string
*ErrMsg
) override
;
340 SimpleBindingMMFunctions Functions
;
344 SimpleBindingMemoryManager::SimpleBindingMemoryManager(
345 const SimpleBindingMMFunctions
& Functions
,
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!");
358 SimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
359 Functions
.Destroy(Opaque
);
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());
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(),
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");
384 *ErrMsg
= errMsgCString
;
390 } // anonymous namespace
392 LLVMMCJITMemoryManagerRef
LLVMCreateSimpleMCJITMemoryManager(
394 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection
,
395 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection
,
396 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory
,
397 LLVMMemoryManagerDestroyCallback Destroy
) {
399 if (!AllocateCodeSection
|| !AllocateDataSection
|| !FinalizeMemory
||
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
));
411 void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM
) {
415 /*===-- JIT Event Listener functions -------------------------------------===*/
418 #if !LLVM_USE_INTEL_JITEVENTS
419 LLVMJITEventListenerRef
LLVMCreateIntelJITEventListener(void)
425 #if !LLVM_USE_OPROFILE
426 LLVMJITEventListenerRef
LLVMCreateOProfileJITEventListener(void)
433 LLVMJITEventListenerRef
LLVMCreatePerfJITEventListener(void)