1 /*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- C++ -*-===*\
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 header declares the C interface to libLLVMExecutionEngine.o, which    *|
11 |* implements various analyses of the LLVM IR.                                *|
12 |*                                                                            *|
13 |* Many exotic languages can interoperate with C code but have a harder time  *|
14 |* with C++ due to name mangling. So in addition to C, this interface enables *|
15 |* tools written in such languages.                                           *|
16 |*                                                                            *|
17 \*===----------------------------------------------------------------------===*/
18 
19 #ifndef LLVM_C_EXECUTIONENGINE_H
20 #define LLVM_C_EXECUTIONENGINE_H
21 
22 #include "llvm-c/Core.h"
23 #include "llvm-c/Target.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 void LLVMLinkInJIT(void);
30 void LLVMLinkInInterpreter(void);
31 
32 typedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef;
33 typedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef;
34 
35 /*===-- Operations on generic values --------------------------------------===*/
36 
37 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
38                                                 unsigned long long N,
39                                                 int IsSigned);
40 
41 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P);
42 
43 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N);
44 
45 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef);
46 
47 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal,
48                                          int IsSigned);
49 
50 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal);
51 
52 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal);
53 
54 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal);
55 
56 /*===-- Operations on execution engines -----------------------------------===*/
57 
58 int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
59                               LLVMModuleProviderRef MP,
60                               char **OutError);
61 
62 int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
63                           LLVMModuleProviderRef MP,
64                           char **OutError);
65 
66 int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
67                           LLVMModuleProviderRef MP,
68                           unsigned OptLevel,
69                           char **OutError);
70 
71 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE);
72 
73 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE);
74 
75 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE);
76 
77 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
78                           unsigned ArgC, const char * const *ArgV,
79                           const char * const *EnvP);
80 
81 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
82                                     unsigned NumArgs,
83                                     LLVMGenericValueRef *Args);
84 
85 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F);
86 
87 void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP);
88 
89 int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
90                              LLVMModuleProviderRef MP,
91                              LLVMModuleRef *OutMod, char **OutError);
92 
93 int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
94                      LLVMValueRef *OutFn);
95 
96 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE);
97 
98 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
99                           void* Addr);
100 
101 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global);
102 
103 #ifdef __cplusplus
104 }
105 
106 namespace llvm {
107   struct GenericValue;
108   class ExecutionEngine;
109 
110   #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)   \
111     inline ty *unwrap(ref P) {                          \
112       return reinterpret_cast<ty*>(P);                  \
113     }                                                   \
114                                                         \
115     inline ref wrap(const ty *P) {                      \
116       return reinterpret_cast<ref>(const_cast<ty*>(P)); \
117     }
118 
119   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue,    LLVMGenericValueRef   )
120   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionEngine, LLVMExecutionEngineRef)
121 
122   #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
123 }
124 
125 #endif /* defined(__cplusplus) */
126 
127 #endif
128