[llvm] r313474 - [ORC] Hook up the LLVMOrcAddObjectFile function in the Orc C Bindings.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 28 09:49:27 PDT 2017


Fair enough - I'd probably err to giving up on the scoping benefits & pull
out the ErrorOr<T> declaration/initialization in all but a single-line case
myself. In the interests of consistent error handling idioms.

On Thu, Sep 28, 2017 at 8:23 AM Lang Hames <lhames at gmail.com> wrote:

> The else is needed given the scope of ObjOrErr, but it could be inverted
> as you suggested. I don't think I've been consistent with my style there --
> it would be interesting to see if we can come up with a reasonable style
> rule. "If your if body is more than ~10 lines, consider an early return"?
>
> - Lang.
>
> On Mon, Sep 18, 2017 at 11:01 AM, David Blaikie <dblaikie at gmail.com>
> wrote:
>
>>
>>
>> On Sat, Sep 16, 2017 at 8:26 PM Lang Hames via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: lhames
>>> Date: Sat Sep 16 20:25:03 2017
>>> New Revision: 313474
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=313474&view=rev
>>> Log:
>>> [ORC] Hook up the LLVMOrcAddObjectFile function in the Orc C Bindings.
>>>
>>> This can be used to add a relocatable object to the JIT session.
>>>
>>> Modified:
>>>     llvm/trunk/include/llvm-c/OrcBindings.h
>>>     llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindings.cpp
>>>     llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
>>>     llvm/trunk/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
>>>
>>> Modified: llvm/trunk/include/llvm-c/OrcBindings.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/OrcBindings.h?rev=313474&r1=313473&r2=313474&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm-c/OrcBindings.h (original)
>>> +++ llvm/trunk/include/llvm-c/OrcBindings.h Sat Sep 16 20:25:03 2017
>>> @@ -30,7 +30,6 @@ extern "C" {
>>>  #endif
>>>
>>>  typedef struct LLVMOpaqueSharedModule *LLVMSharedModuleRef;
>>> -typedef struct LLVMOpaqueSharedObjectBuffer *LLVMSharedObjectBufferRef;
>>>  typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef;
>>>  typedef uint32_t LLVMOrcModuleHandle;
>>>  typedef uint64_t LLVMOrcTargetAddress;
>>> @@ -68,18 +67,6 @@ LLVMSharedModuleRef LLVMOrcMakeSharedMod
>>>  void LLVMOrcDisposeSharedModuleRef(LLVMSharedModuleRef SharedMod);
>>>
>>>  /**
>>> - * Get an LLVMSharedObjectBufferRef from an LLVMMemoryBufferRef.
>>> - */
>>> -LLVMSharedObjectBufferRef
>>> -LLVMOrcMakeSharedObjectBuffer(LLVMMemoryBufferRef ObjBuffer);
>>> -
>>> -/**
>>> - * Dispose of a shared object buffer.
>>> - */
>>> -void
>>> -LLVMOrcDisposeSharedObjectBufferRef(LLVMSharedObjectBufferRef
>>> SharedObjBuffer);
>>> -
>>> -/**
>>>   * Create an ORC JIT stack.
>>>   *
>>>   * The client owns the resulting stack, and must call
>>> OrcDisposeInstance(...)
>>> @@ -155,10 +142,15 @@ LLVMOrcAddLazilyCompiledIR(LLVMOrcJITSta
>>>
>>>  /**
>>>   * Add an object file.
>>> + *
>>> + * This method takes ownership of the given memory buffer and attempts
>>> to add
>>> + * it to the JIT as an object file.
>>> + * Clients should *not* dispose of the 'Obj' argument: the JIT will
>>> manage it
>>> + * from this call onwards.
>>>   */
>>>  LLVMOrcErrorCode LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack,
>>>                                        LLVMOrcModuleHandle *RetHandle,
>>> -                                      LLVMSharedObjectBufferRef Obj,
>>> +                                      LLVMMemoryBufferRef Obj,
>>>                                        LLVMOrcSymbolResolverFn
>>> SymbolResolver,
>>>                                        void *SymbolResolverCtx);
>>>
>>>
>>> Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindings.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindings.cpp?rev=313474&r1=313473&r2=313474&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindings.cpp (original)
>>> +++ llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindings.cpp Sat Sep 16
>>> 20:25:03 2017
>>> @@ -20,16 +20,6 @@ void LLVMOrcDisposeSharedModuleRef(LLVMS
>>>    delete unwrap(SharedMod);
>>>  }
>>>
>>> -LLVMSharedObjectBufferRef
>>> -LLVMOrcMakeSharedObjectBuffer(LLVMMemoryBufferRef ObjBuffer) {
>>> -  return wrap(new std::shared_ptr<MemoryBuffer>(unwrap(ObjBuffer)));
>>> -}
>>> -
>>> -void
>>> -LLVMOrcDisposeSharedObjectBufferRef(LLVMSharedObjectBufferRef
>>> SharedObjBuffer) {
>>> -  delete unwrap(SharedObjBuffer);
>>> -}
>>> -
>>>  LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) {
>>>    TargetMachine *TM2(unwrap(TM));
>>>
>>> @@ -105,6 +95,18 @@ LLVMOrcAddLazilyCompiledIR(LLVMOrcJITSta
>>>    return J.addIRModuleLazy(*RetHandle, *M, SymbolResolver,
>>> SymbolResolverCtx);
>>>  }
>>>
>>> +LLVMOrcErrorCode
>>> +LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack,
>>> +                     LLVMOrcModuleHandle *RetHandle,
>>> +                     LLVMMemoryBufferRef Obj,
>>> +                     LLVMOrcSymbolResolverFn SymbolResolver,
>>> +                     void *SymbolResolverCtx) {
>>> +  OrcCBindingsStack &J = *unwrap(JITStack);
>>> +  std::unique_ptr<MemoryBuffer> O(unwrap(Obj));
>>> +  return J.addObject(*RetHandle, std::move(O), SymbolResolver,
>>> +                     SymbolResolverCtx);
>>> +}
>>> +
>>>  LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack,
>>>                                       LLVMOrcModuleHandle H) {
>>>    OrcCBindingsStack &J = *unwrap(JITStack);
>>>
>>> Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.h?rev=313474&r1=313473&r2=313474&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.h (original)
>>> +++ llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.h Sat Sep 16
>>> 20:25:03 2017
>>> @@ -44,26 +44,12 @@ class OrcCBindingsStack;
>>>
>>>  DEFINE_SIMPLE_CONVERSION_FUNCTIONS(std::shared_ptr<Module>,
>>>                                     LLVMSharedModuleRef)
>>> -DEFINE_SIMPLE_CONVERSION_FUNCTIONS(std::shared_ptr<MemoryBuffer>,
>>> -                                   LLVMSharedObjectBufferRef)
>>>  DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack,
>>> LLVMOrcJITStackRef)
>>>  DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
>>>
>>> -class OrcCBindingsStack {
>>> -public:
>>> -
>>> -  using CompileCallbackMgr = orc::JITCompileCallbackManager;
>>> -  using ObjLayerT = orc::RTDyldObjectLinkingLayer;
>>> -  using CompileLayerT = orc::IRCompileLayer<ObjLayerT,
>>> orc::SimpleCompiler>;
>>> -  using CODLayerT =
>>> -        orc::CompileOnDemandLayer<CompileLayerT, CompileCallbackMgr>;
>>> +namespace detail {
>>>
>>> -  using CallbackManagerBuilder =
>>> -      std::function<std::unique_ptr<CompileCallbackMgr>()>;
>>>
>>> -  using IndirectStubsManagerBuilder =
>>> CODLayerT::IndirectStubsManagerBuilderT;
>>> -
>>> -private:
>>>    class GenericHandle {
>>>    public:
>>>      virtual ~GenericHandle() = default;
>>> @@ -90,13 +76,56 @@ private:
>>>      typename LayerT::ModuleHandleT Handle;
>>>    };
>>>
>>> -  template <typename LayerT>
>>> +  template <>
>>> +  class GenericHandleImpl<orc::RTDyldObjectLinkingLayer>
>>> +    : public GenericHandle {
>>> +  private:
>>> +    using LayerT = orc::RTDyldObjectLinkingLayer;
>>> +  public:
>>> +
>>> +    GenericHandleImpl(LayerT &Layer, typename LayerT::ObjHandleT Handle)
>>> +        : Layer(Layer), Handle(std::move(Handle)) {}
>>> +
>>> +    JITSymbol findSymbolIn(const std::string &Name,
>>> +                           bool ExportedSymbolsOnly) override {
>>> +      return Layer.findSymbolIn(Handle, Name, ExportedSymbolsOnly);
>>> +    }
>>> +
>>> +    Error removeModule() override { return Layer.removeObject(Handle); }
>>> +
>>> +  private:
>>> +    LayerT &Layer;
>>> +    typename LayerT::ObjHandleT Handle;
>>> +  };
>>> +
>>> +
>>> +  template <typename LayerT, typename HandleT>
>>>    std::unique_ptr<GenericHandleImpl<LayerT>>
>>> -  createGenericHandle(LayerT &Layer, typename LayerT::ModuleHandleT
>>> Handle) {
>>> +  createGenericHandle(LayerT &Layer, HandleT Handle) {
>>>      return llvm::make_unique<GenericHandleImpl<LayerT>>(Layer,
>>>
>>>  std::move(Handle));
>>>    }
>>>
>>> +} // end namespace detail
>>> +
>>> +class OrcCBindingsStack {
>>> +public:
>>> +
>>> +  using CompileCallbackMgr = orc::JITCompileCallbackManager;
>>> +  using ObjLayerT = orc::RTDyldObjectLinkingLayer;
>>> +  using CompileLayerT = orc::IRCompileLayer<ObjLayerT,
>>> orc::SimpleCompiler>;
>>> +  using CODLayerT =
>>> +        orc::CompileOnDemandLayer<CompileLayerT, CompileCallbackMgr>;
>>> +
>>> +  using CallbackManagerBuilder =
>>> +      std::function<std::unique_ptr<CompileCallbackMgr>()>;
>>> +
>>> +  using IndirectStubsManagerBuilder =
>>> CODLayerT::IndirectStubsManagerBuilderT;
>>> +
>>> +private:
>>> +
>>> +  using OwningObject = object::OwningBinary<object::ObjectFile>;
>>> +
>>>  public:
>>>    using ModuleHandleT = unsigned;
>>>
>>> @@ -266,6 +295,33 @@ public:
>>>      return LLVMOrcErrSuccess;
>>>    }
>>>
>>> +  LLVMOrcErrorCode addObject(ModuleHandleT &RetHandle,
>>> +                             std::unique_ptr<MemoryBuffer> ObjBuffer,
>>> +                             LLVMOrcSymbolResolverFn ExternalResolver,
>>> +                             void *ExternalResolverCtx) {
>>> +    if (auto ObjOrErr =
>>> +
>>> object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef())) {
>>> +      auto &Obj = *ObjOrErr;
>>> +      auto OwningObj =
>>> +        std::make_shared<OwningObject>(std::move(Obj),
>>> std::move(ObjBuffer));
>>> +
>>> +      // Create the resolver.
>>> +      auto Resolver = createResolver(ExternalResolver,
>>> ExternalResolverCtx);
>>> +
>>> +      ModuleHandleT H;
>>> +      if (auto HOrErr = ObjectLayer.addObject(std::move(OwningObj),
>>> +                                              std::move(Resolver)))
>>> +        H = createHandle(ObjectLayer, *HOrErr);
>>> +      else
>>> +        return mapError(HOrErr.takeError());
>>> +
>>> +      RetHandle = H;
>>> +
>>> +      return LLVMOrcErrSuccess;
>>> +    } else
>>>
>>
>> Remove else after return?
>>
>> Also consider inverting to reduce indentation ( !ObjOrErr, return
>> mapError, <good stuff>)
>>
>>
>>> +      return mapError(ObjOrErr.takeError());
>>> +  }
>>> +
>>>    JITSymbol findSymbol(const std::string &Name,
>>>                                   bool ExportedSymbolsOnly) {
>>>      if (auto Sym = IndirectStubsMgr->findStub(Name,
>>> ExportedSymbolsOnly))
>>> @@ -301,17 +357,19 @@ public:
>>>    const std::string &getErrorMessage() const { return ErrMsg; }
>>>
>>>  private:
>>> -  template <typename LayerT>
>>> -  unsigned createHandle(LayerT &Layer, typename LayerT::ModuleHandleT
>>> Handle) {
>>> +  template <typename LayerT, typename HandleT>
>>> +  unsigned createHandle(LayerT &Layer, HandleT Handle) {
>>>      unsigned NewHandle;
>>>      if (!FreeHandleIndexes.empty()) {
>>>        NewHandle = FreeHandleIndexes.back();
>>>        FreeHandleIndexes.pop_back();
>>> -      GenericHandles[NewHandle] = createGenericHandle(Layer,
>>> std::move(Handle));
>>> +      GenericHandles[NewHandle] =
>>> +        detail::createGenericHandle(Layer, std::move(Handle));
>>>        return NewHandle;
>>>      } else {
>>>        NewHandle = GenericHandles.size();
>>> -      GenericHandles.push_back(createGenericHandle(Layer,
>>> std::move(Handle)));
>>> +      GenericHandles.push_back(
>>> +        detail::createGenericHandle(Layer, std::move(Handle)));
>>>      }
>>>      return NewHandle;
>>>    }
>>> @@ -338,7 +396,7 @@ private:
>>>    CompileLayerT CompileLayer;
>>>    CODLayerT CODLayer;
>>>
>>> -  std::vector<std::unique_ptr<GenericHandle>> GenericHandles;
>>> +  std::vector<std::unique_ptr<detail::GenericHandle>> GenericHandles;
>>>    std::vector<unsigned> FreeHandleIndexes;
>>>
>>>    orc::LocalCXXRuntimeOverrides CXXRuntimeOverrides;
>>>
>>> Modified: llvm/trunk/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp?rev=313474&r1=313473&r2=313474&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp (original)
>>> +++ llvm/trunk/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp Sat Sep 16
>>> 20:25:03 2017
>>> @@ -8,6 +8,7 @@
>>>
>>>  //===----------------------------------------------------------------------===//
>>>
>>>  #include "OrcTestCommon.h"
>>> +#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
>>>  #include "llvm-c/Core.h"
>>>  #include "llvm-c/OrcBindings.h"
>>>  #include "llvm-c/Target.h"
>>> @@ -37,6 +38,15 @@ protected:
>>>      return MB.takeModule();
>>>    }
>>>
>>> +  std::shared_ptr<object::OwningBinary<object::ObjectFile>>
>>> +  createTestObject() {
>>> +    orc::SimpleCompiler IRCompiler(*TM);
>>> +    auto M = createTestModule(TM->getTargetTriple());
>>> +    M->setDataLayout(TM->createDataLayout());
>>> +    return std::make_shared<object::OwningBinary<object::ObjectFile>>(
>>> +      IRCompiler(*M));
>>> +  }
>>> +
>>>    typedef int (*MainFnTy)();
>>>
>>>    static int myTestFuncImpl() {
>>> @@ -124,6 +134,36 @@ TEST_F(OrcCAPIExecutionTest, TestLazyIRC
>>>    LLVMOrcTargetAddress MainAddr;
>>>    LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
>>>    MainFnTy MainFn = (MainFnTy)MainAddr;
>>> +  int Result = MainFn();
>>> +  EXPECT_EQ(Result, 42)
>>> +    << "Lazily JIT'd code did not return expected result";
>>> +
>>> +  LLVMOrcRemoveModule(JIT, H);
>>> +
>>> +  LLVMOrcDisposeMangledSymbol(testFuncName);
>>> +  LLVMOrcDisposeInstance(JIT);
>>> +}
>>> +
>>> +TEST_F(OrcCAPIExecutionTest, TestAddObjectFile) {
>>> +  if (!TM)
>>> +    return;
>>> +
>>> +  std::unique_ptr<MemoryBuffer> ObjBuffer;
>>> +  {
>>> +    auto OwningObj = createTestObject();
>>> +    auto ObjAndBuffer = OwningObj->takeBinary();
>>> +    ObjBuffer = std::move(ObjAndBuffer.second);
>>> +  }
>>> +
>>> +  LLVMOrcJITStackRef JIT =
>>> +    LLVMOrcCreateInstance(wrap(TM.get()));
>>> +  LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
>>> +
>>> +  LLVMOrcModuleHandle H;
>>> +  LLVMOrcAddObjectFile(JIT, &H, wrap(ObjBuffer.release()), myResolver,
>>> nullptr);
>>> +  LLVMOrcTargetAddress MainAddr;
>>> +  LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
>>> +  MainFnTy MainFn = (MainFnTy)MainAddr;
>>>    int Result = MainFn();
>>>    EXPECT_EQ(Result, 42)
>>>      << "Lazily JIT'd code did not return expected result";
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170928/1bdee763/attachment.html>


More information about the llvm-commits mailing list