devisebuild议:llvm多个运行时环境
我的应用程序需要在同一个(单线程)进程中运行许多单独的上下文。 他们都有一个LLVMContext
。
该进程将运行许多上下文(线程意义上); 也就是说,每一个在基于boost::context
的继续对象中运行一个函数(仍然在vault上,预先认可的lib),这意味着每个上下文都可以产生,但是它们基本上运行在同一个单线程进程中。 每个应该基本上独立于另一个,更重要的是,每个编译错误不应该影响其他的执行。
这些上下文中的每一个都将dynamic地调用跨越多个翻译单元(TU)的代码。 一些翻译单位可以在许多这些情况下共享。 新的或修改的翻译单元中的编译错误不应影响其他上下文。
说明性编辑:例如,TU A可以在两个上下文X和Y之间共享,只是为了有一个完整的画面,可以说X也将运行来自其他翻译单元的代码,即B和D,而Y也将有C.在某个时刻,X决定修改A,所以它创build一个新的TU A.1,它是A的一个副本,并在那里应用修改,所以这些不会影响上下文Y.希望这个例子明确要求。
我最初的冲动是为每个上下文关联一个llvm::Module
,但是由于它在LLVM中未定义在处于中间编译状态的模块时发生了什么,我决定为每个翻译单元添加一个llvm::Module
(请参阅此问题原因 ),加上我之前解释的写时复制策略,当翻译单元的修改发生在上下文本地时,为了避免修改影响其他上下文。
我有两个主要的问题是:
-
如何将上下文中的不同模块链接在一起,以便将它们作为统一的库调用? 我正在使用C ++ API。 我特别警惕这个令人讨厌的老bug影响这个function。 如果我将所有模块的所有权转让给了JIT和
ExecutionEngine::addModule()
这个bug还会影响我吗? -
一旦翻译单元的修改强制更新其中一个模块,什么是必需的步骤? 我需要删除/删除旧的模块对象,并创build一个新的? 有没有我没有读到的回收政策?
我有一个关于这个问题的第二个问题是:
- 我需要多less个
ExecutionEngine
? 一个用于整个应用程序? 每个上下文一个? 每个模块一个?
希望问题的范围不是太大。
我认为你需要一个概念框架来“挂”你的想法。 把各种执行位作为命令来思考(甚至可能使用命令模式来实现)会给你一个更明显的交互点集合。 话虽如此; 你将需要一个你想要返回的离散执行的上下文。 超过两个将需要您创build适当的簿记。 我相信,两个是基本上免费提升。
执行位之间的通信类似于你。 创build一个在执行上下文中共享的状态(备忘录)是想到的一个解决scheme。 您可能已经在运行时已经build立了合适的状态,那么不需要额外的层。 正如你所指出的,全局并不是你在这些交互中的朋友。 版本控制和名称parsing也是一个问题。 保持执行位是分开的,对于解决这个问题有很长的路要走。 一旦你解决了协调问题,这更多的是跟踪你已经创build的位。 这也意味着没有必要进行回收,每次只创造新的,没有重新加载。 完成执行后,您还必须pipe理这些位的生命周期。 我build议每执行一个ExecutionEngine
位。 不这样做意味着要做更多的工作来试图“保护”工作代码,使其不受代码的影响。 我相信可以用一个引擎来做到这一点,但是风险更大。