Home | History | Annotate | Download | only in Orc
      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 LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) {
     16   TargetMachine *TM2(unwrap(TM));
     17 
     18   Triple T(TM2->getTargetTriple());
     19 
     20   auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0);
     21   auto IndirectStubsMgrBuilder =
     22       orc::createLocalIndirectStubsManagerBuilder(T);
     23 
     24   OrcCBindingsStack *JITStack = new OrcCBindingsStack(
     25       *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder);
     26 
     27   return wrap(JITStack);
     28 }
     29 
     30 const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
     31   OrcCBindingsStack &J = *unwrap(JITStack);
     32   return J.getErrorMessage().c_str();
     33 }
     34 
     35 void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
     36                              const char *SymbolName) {
     37   OrcCBindingsStack &J = *unwrap(JITStack);
     38   std::string Mangled = J.mangle(SymbolName);
     39   *MangledName = new char[Mangled.size() + 1];
     40   strcpy(*MangledName, Mangled.c_str());
     41 }
     42 
     43 void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
     44 
     45 LLVMOrcTargetAddress
     46 LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
     47                                  LLVMOrcLazyCompileCallbackFn Callback,
     48                                  void *CallbackCtx) {
     49   OrcCBindingsStack &J = *unwrap(JITStack);
     50   return J.createLazyCompileCallback(Callback, CallbackCtx);
     51 }
     52 
     53 LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
     54                                            const char *StubName,
     55                                            LLVMOrcTargetAddress InitAddr) {
     56   OrcCBindingsStack &J = *unwrap(JITStack);
     57   return J.createIndirectStub(StubName, InitAddr);
     58 }
     59 
     60 LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
     61                                                const char *StubName,
     62                                                LLVMOrcTargetAddress NewAddr) {
     63   OrcCBindingsStack &J = *unwrap(JITStack);
     64   return J.setIndirectStubPointer(StubName, NewAddr);
     65 }
     66 
     67 LLVMOrcModuleHandle
     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);
     74 }
     75 
     76 LLVMOrcModuleHandle
     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);
     83 }
     84 
     85 void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
     86   OrcCBindingsStack &J = *unwrap(JITStack);
     87   J.removeModule(H);
     88 }
     89 
     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();
     95 }
     96 
     97 void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
     98   delete unwrap(JITStack);
     99 }
    100