llvm JIT add library to module

后端 未结 1 1680
死守一世寂寞
死守一世寂寞 2021-01-12 10:03

I am working on a JIT that uses LLVM. The language has a small run-time written in C++ which I compile down to LLVM IR using clang

clang++ runtime.cu --cuda-         


        
相关标签:
1条回答
  • 2021-01-12 10:34

    You need to teach your JIT engine about other symbols explicitly.

    If they are in a dynamic library (dylib, so, dll) then you can just call

    sys::DynamicLibrary::LoadLibraryPermanently("path_to_some.dylib")
    

    with a path to the dynamic library.

    If the symbols are in an object file or an archive, then it requires a bit more work: you would need to load them into memory and add to the ExecutionEngine using its APIs.

    Here is an example for an object file:

    std::string objectFileName("some_object_file.o");
    
    ErrorOr<std::unique_ptr<MemoryBuffer>> buffer =
      MemoryBuffer::getFile(objectFileName.c_str());
    
    if (!buffer) {
      // handle error
    }
    
    Expected<std::unique_ptr<ObjectFile>> objectOrError =
      ObjectFile::createObjectFile(buffer.get()->getMemBufferRef());
    
    if (!objectOrError) {
      // handle error
    }
    
    std::unique_ptr<ObjectFile> objectFile(std::move(objectOrError.get()));
    
    auto owningObject = OwningBinary<ObjectFile>(std::move(objectFile),
                                                 std::move(buffer.get()));
    
    executionEngine.addObjectFile(std::move(owningObject));
    

    For archives replace template types ObjectFile with Archive, and call

    executionEngine.addArchive(std::move(owningArchive));
    

    at the end.

    0 讨论(0)
提交回复
热议问题