12

我想在一个模块中执行函数,这个模块将在其他模块中解决依赖关系。模块可能会改变(动态编译环境),所以我不希望在单个整体模块中链接所有依赖项,也就是说,如果可以避免的话

我希望使用Linker::linkModules,但这总是对源模块具有破坏性。这对于一个依赖于一个模块的模块来说是可以的,因为如果那个模块发生了变化,那没什么大不了的,但是重建和重新链接 N-1 个模块不是因为一个模块发生了变化而没有变化的过度吗?

我想知道是否有可以用于 JIT 执行的非破坏性版本的 linkModules。

4

3 回答 3

3

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.

于 2014-01-16T17:56:01.257 回答
1

我们在 Fabric Engine 产品 ( http://fabricengine.com/ ) 内的动态编译环境中做了类似的事情。LLVM 目前还不能很好地适应这种复杂的“JIT”环境,但我们设法通过额外的间接级别(即双指针)链接使其工作,然后将 llvm::MemoryManager 子类化以重载 llvm: :MemoryManager::getPointerToNamedFunction 在模块之间全局解析符号。通过使用双指针,您可以更改一个模块而不更改任何其他模块。你必须稍微小心一点,但这还不错。

于 2014-02-17T20:45:55.487 回答
0

我认为这不可能是您描述他问题的方式。

在您理想的解决方案中,如果模块AB被链接,更改B将立即在A?

如果是这种情况,我不相信这是可能的。(尝试查看A链接后的内容B。的符号B已复制到A

如果您只是想保存信息B,您可以先复制Bwith llvm::CloneModule,然后将结果传递给Linker::linkModules.

于 2012-06-12T18:25:20.970 回答