[问题] 关于 llvm 的 ThreadSafeModule 的疑惑

楼主: Lipraxde (Lipraxde)   2019-04-13 16:16:30
最近在用 llvm 的 OrcJIT,要将 Module 丢进去跑之前要转成一个叫
ThreadSafeModule 的东东,再用 llvm::orc::IRLayer add 进去
ThreadSafeModule 大概长这样:
class ThreadSafeModule {
public:
ThreadSafeModule() = default;
ThreadSafeModule(ThreadSafeModule &&Other) = default;
ThreadSafeModule &operator=(ThreadSafeModule &&Other);
ThreadSafeModule(std::unique_ptr<Module> M, std::unique_ptr<LLVMContext> Ctx)
: M(std::move(M)), TSCtx(std::move(Ctx)) {}
ThreadSafeModule(std::unique_ptr<Module> M, ThreadSafeContext TSCtx)
: M(std::move(M)), TSCtx(std::move(TSCtx)) {}
Module *getModule() { return M.get(); }
const Module *getModule() const { return M.get(); }
ThreadSafeContext::Lock getContextLock() { return TSCtx.getLock(); }
explicit operator bool();
private:
std::unique_ptr<Module> M;
ThreadSafeContext TSCtx;
};
OrcJIT 跑完后如果中间有设 setNotifyCompiled 就会把 ThreadSafeModule 丢回来
然后 Module 就变成 ThreadSafeModule
把 ThreadSafeModule 释放掉连带着 Module 也释放掉了
问题(Question):
1. 这个 ThreadSafeModule 为什么要弄得像黑洞一样?不把 Module release 出来
2. 它的 member function 'getModule',为什么要写一个有 const 一个没有两个版本?
作者: loveme00835 (发箍)   2019-04-14 00:46:00
你就要看呼叫 getContextLock() 的地方了, 他比较像"Module with a mutex" 的概念, 不过他都 move 给你注册的 NotifyCompiledFunction, 等于生杀大权都交给你, 其实就等于已经 release. 第 2 个是语言的问题, 为了传递和 this 相同的 const 语意, 简单说如果透过 const ThreadSafeModule& 拿到的 Module 物件也必须是 const 的理由是: const T& 在你 statement 结束前保证的语意是 "物件一直都存在", 所以当 this 给你保证但回传的 Module 不保证是很奇怪的 (因为 owning语意), 另一方面 this 不保证但 Module 保证也很奇怪这表示即使它给你 Module, 它还是可以偷偷把 Module给 delete 掉
楼主: Lipraxde (Lipraxde)   2019-04-15 03:40:00
接收 const Foo&,呼叫 foo.getXXX()多次,预期拿到相同的物件,由于这个物件属于 foo,所以也要是 const 物件,不然 foo 就失去 const 的性质了这样说得算是完整了吗?
作者: loveme00835 (发箍)   2019-04-15 03:58:00
对喔, 这是因为 owning 语意的关系, 如果这个物件不属于 foo, 那就没必要维持 const 语意
楼主: Lipraxde (Lipraxde)   2019-04-15 04:04:00
既然 callee 要求对应的保证,那 Compiler 可以优化它?可是加了优化后得到的输出还是有看到 i 被改成 1。Compiler 聪明的判断出这个 caller 没做出相应的保证,抑或是这个保证只是给 programmer 看的?
作者: loveme00835 (发箍)   2019-04-15 04:14:00
因为是参考(指标也是)所以能做的优化有限, 但这个也是 programmer 需要遵守, 属于语意层面的规范

Links booklink

Contact Us: admin [ a t ] ucptt.com