我想在一个模块中执行函数,这个模块将在其他模块中解决依赖关系。模块可能会改变(动态编译环境),所以我不希望在单个整体模块中链接所有依赖项,也就是说,如果可以避免的话
我希望使用Linker::linkModules,但这总是对源模块具有破坏性。这对于一个依赖于一个模块的模块来说是可以的,因为如果那个模块发生了变化,那没什么大不了的,但是重建和重新链接 N-1 个模块不是因为一个模块发生了变化而没有变化的过度吗?
我想知道是否有可以用于 JIT 执行的非破坏性版本的 linkModules。
我想在一个模块中执行函数,这个模块将在其他模块中解决依赖关系。模块可能会改变(动态编译环境),所以我不希望在单个整体模块中链接所有依赖项,也就是说,如果可以避免的话
我希望使用Linker::linkModules,但这总是对源模块具有破坏性。这对于一个依赖于一个模块的模块来说是可以的,因为如果那个模块发生了变化,那没什么大不了的,但是重建和重新链接 N-1 个模块不是因为一个模块发生了变化而没有变化的过度吗?
我想知道是否有可以用于 JIT 执行的非破坏性版本的 linkModules。
Try this:
Linker::LinkModules(destinationModule, sourceModule, Linker::PreserveSource, &error);
If you pass Linker::PreserveSource instead of Linker::DestroySource, you can continue to use sourceModule after the call.
我们在 Fabric Engine 产品 ( http://fabricengine.com/ ) 内的动态编译环境中做了类似的事情。LLVM 目前还不能很好地适应这种复杂的“JIT”环境,但我们设法通过额外的间接级别(即双指针)链接使其工作,然后将 llvm::MemoryManager 子类化以重载 llvm: :MemoryManager::getPointerToNamedFunction 在模块之间全局解析符号。通过使用双指针,您可以更改一个模块而不更改任何其他模块。你必须稍微小心一点,但这还不错。
我认为这不可能是您描述他问题的方式。
在您理想的解决方案中,如果模块A和B被链接,更改B将立即在A?
如果是这种情况,我不相信这是可能的。(尝试查看A链接后的内容B。的符号B已复制到A)
如果您只是想保存信息B,您可以先复制Bwith llvm::CloneModule,然后将结果传递给Linker::linkModules.