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

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 28 08:23:00 PDT 2017


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/2920b5bc/attachment.html>


More information about the llvm-commits mailing list