1 //===----------- OrcCBindings.cpp - C bindings for the Orc APIs -----------===//
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 #include "OrcCBindingsStack.h"
11 #include "llvm-c/OrcBindings.h"
15 LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM,
16 LLVMContextRef Context) {
17 TargetMachine *TM2(unwrap(TM));
18 LLVMContext &Ctx = *unwrap(Context);
20 Triple T(TM2->getTargetTriple());
22 auto CallbackMgrBuilder = OrcCBindingsStack::createCallbackManagerBuilder(T);
23 auto IndirectStubsMgrBuilder =
24 OrcCBindingsStack::createIndirectStubsMgrBuilder(T);
26 OrcCBindingsStack *JITStack =
27 new OrcCBindingsStack(*TM2, Ctx, CallbackMgrBuilder,
28 IndirectStubsMgrBuilder);
30 return wrap(JITStack);
33 void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
34 const char *SymbolName) {
35 OrcCBindingsStack &J = *unwrap(JITStack);
36 std::string Mangled = J.mangle(SymbolName);
37 *MangledName = new char[Mangled.size() + 1];
38 strcpy(*MangledName, Mangled.c_str());
41 void LLVMOrcDisposeMangledSymbol(char *MangledName) {
46 LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
47 LLVMOrcLazyCompileCallbackFn Callback,
49 OrcCBindingsStack &J = *unwrap(JITStack);
50 return J.createLazyCompileCallback(Callback, CallbackCtx);
53 void LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
55 LLVMOrcTargetAddress InitAddr) {
56 OrcCBindingsStack &J = *unwrap(JITStack);
57 J.createIndirectStub(StubName, InitAddr);
60 void LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
62 LLVMOrcTargetAddress NewAddr) {
63 OrcCBindingsStack &J = *unwrap(JITStack);
64 J.setIndirectStubPointer(StubName, NewAddr);
68 LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
69 LLVMOrcSymbolResolverFn SymbolResolver,
70 void *SymbolResolverCtx) {
71 OrcCBindingsStack &J = *unwrap(JITStack);
72 Module *M(unwrap(Mod));
73 return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
77 LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
78 LLVMOrcSymbolResolverFn SymbolResolver,
79 void *SymbolResolverCtx) {
80 OrcCBindingsStack &J = *unwrap(JITStack);
81 Module *M(unwrap(Mod));
82 return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
85 void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
86 OrcCBindingsStack &J = *unwrap(JITStack);
90 LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
91 const char *SymbolName) {
92 OrcCBindingsStack &J = *unwrap(JITStack);
93 auto Sym = J.findSymbol(SymbolName, true);
94 return Sym.getAddress();
97 void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
98 delete unwrap(JITStack);