[Orc] Re-add C bindings for the Orc APIs, with a fix to remove the union that
[oota-llvm.git] / lib / ExecutionEngine / Orc / OrcCBindings.cpp
1 //===----------- OrcCBindings.cpp - C bindings for the Orc APIs -----------===//
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 #include "OrcCBindingsStack.h"
11 #include "llvm-c/OrcBindings.h"
12
13 using namespace llvm;
14
15 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef);
16 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef);
17
18 LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM,
19                                          LLVMContextRef Context) {
20   TargetMachine *TM2(unwrap(TM));
21   LLVMContext &Ctx = *unwrap(Context);
22
23   Triple T(TM2->getTargetTriple());
24
25   auto CallbackMgrBuilder = OrcCBindingsStack::createCallbackManagerBuilder(T);
26   auto IndirectStubsMgrBuilder =
27     OrcCBindingsStack::createIndirectStubsMgrBuilder(T);
28
29   OrcCBindingsStack *JITStack =
30     new OrcCBindingsStack(*TM2, Ctx, CallbackMgrBuilder,
31                           IndirectStubsMgrBuilder);
32
33   return wrap(JITStack);
34 }
35
36 void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
37                              const char *SymbolName) {
38   OrcCBindingsStack &J = *unwrap(JITStack);
39   std::string Mangled = J.mangle(SymbolName);
40   *MangledName = new char[Mangled.size() + 1];
41   strcpy(*MangledName, Mangled.c_str());
42 }
43
44 void LLVMOrcDisposeMangledSymbol(char *MangledName) {
45   delete[] MangledName;
46 }
47
48 LLVMOrcModuleHandle
49 LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
50                             LLVMOrcSymbolResolverFn SymbolResolver,
51                             void *SymbolResolverCtx) {
52   OrcCBindingsStack &J = *unwrap(JITStack);
53   Module *M(unwrap(Mod));
54   return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
55 }
56
57 LLVMOrcModuleHandle
58 LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
59                            LLVMOrcSymbolResolverFn SymbolResolver,
60                            void *SymbolResolverCtx) {
61   OrcCBindingsStack &J = *unwrap(JITStack);
62   Module *M(unwrap(Mod));
63   return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
64 }
65
66 void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
67   OrcCBindingsStack &J = *unwrap(JITStack);
68   J.removeModule(H);
69 }
70
71 LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
72                                              const char *SymbolName) {
73   OrcCBindingsStack &J = *unwrap(JITStack);
74   auto Sym = J.findSymbol(SymbolName, true);
75   return Sym.getAddress();
76 }
77
78 void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
79   delete unwrap(JITStack);
80 }