TODO
MIR 初始化跟結束分別為 MIR_init()
/ MIR_finish (MIR_context_t ctx)
當建立好 mir 的物件,可以將要實作的功能包裝成模組(module),mir 會用內建的雙向 linked list 將模組連接在一起,而模組包含了下面這些項目(item)
模組的初始化跟結束分別為 MIR_new_module
/ MIR_finish_module
將 C 程式碼當作輸入的話要透過 c2mir 的 API 來達成,其中 c2mir_compile
的 get_func
會用來讀取程式碼,而 jit_ptr
會當作參數傳入 get_func
,讀取完畢會回傳 EOF。
當 c2mir_compile
成功之後,會當作模組給 ctx 接上,所以如果今天是做直譯器的話,要呼叫編譯好的函數就要從 ctx 的模組的尾把取得編譯好的模組,再從模組裡面找編譯好的函數,透過 MIR-generator 產生機器碼就可以當作函式來呼叫了。
執行 mir 之前需要將模組載入跟連結
MIR_link
的 set_interface 有3種
MIR_set_interp_interface
: 呼叫函數的時候將 MIR 的直譯MIR_set_gen_interface
: MIR-generator 會將所有載入的函式產生機器碼,當呼叫函數就會執行機器碼MIR_set_lazy_gen_interface
: MIR-generator 只會當函式第一次被呼叫的時候產生機器碼import_solver 則是當 mir 的 context 裡面有未使用 MIR 定義的函式(e.g. printf) 就會傳入函式名稱當作 key 來查詢,如果有找到函式就會回傳函式的地址。
未使用 MIR 定義的函式只會被呼叫不會被 MIR-generator 優化
當模組都載入跟連結後就可以透過 MIR-generator 來產生機器碼了。
gens_num 表示要使用幾個 generator 來產生機器碼,每個 generator 都是不同的執行緒
MIR_gen 產生函式的機器碼,並回傳函式的地址,可以當作 C 函式來呼叫,呼叫後會執行產生的機器碼。
MIR_gen_set_optimize_level 設定優化的等級,一共有4級(0 ~ 3)可以選,等級愈高優化的愈激進,編譯時間也愈長,可以參考下圖的流程。