1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------- OrcCBindings.cpp - C bindings for the Orc APIs -----------===//
2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "OrcCBindingsStack.h"
11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm-c/OrcBindings.h"
12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarusing namespace llvm;
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) {
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  TargetMachine *TM2(unwrap(TM));
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Triple T(TM2->getTargetTriple());
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0);
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  auto IndirectStubsMgrBuilder =
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      orc::createLocalIndirectStubsManagerBuilder(T);
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OrcCBindingsStack *JITStack = new OrcCBindingsStack(
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder);
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return wrap(JITStack);
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarconst char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return J.getErrorMessage().c_str();
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                             const char *SymbolName) {
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::string Mangled = J.mangle(SymbolName);
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  *MangledName = new char[Mangled.size() + 1];
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  strcpy(*MangledName, Mangled.c_str());
41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcTargetAddress
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                 LLVMOrcLazyCompileCallbackFn Callback,
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                 void *CallbackCtx) {
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return J.createLazyCompileCallback(Callback, CallbackCtx);
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           const char *StubName,
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           LLVMOrcTargetAddress InitAddr) {
56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return J.createIndirectStub(StubName, InitAddr);
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                               const char *StubName,
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                               LLVMOrcTargetAddress NewAddr) {
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return J.setIndirectStubPointer(StubName, NewAddr);
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcModuleHandle
68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            LLVMOrcSymbolResolverFn SymbolResolver,
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            void *SymbolResolverCtx) {
71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Module *M(unwrap(Mod));
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcModuleHandle
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                           LLVMOrcSymbolResolverFn SymbolResolver,
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                           void *SymbolResolverCtx) {
80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Module *M(unwrap(Mod));
82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
87f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  J.removeModule(H);
88f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
89f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
91f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                             const char *SymbolName) {
92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  OrcCBindingsStack &J = *unwrap(JITStack);
93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  auto Sym = J.findSymbol(SymbolName, true);
94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Sym.getAddress();
95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  delete unwrap(JITStack);
99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
100