[問題] 關於 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