想在程序runtime的時候動態編譯其他code為.bc file,有什麼辦法?

一個課餘自己練手的作業,想要在我的程序runtime的時候將其他code動態載入進來。

目前已經解決在手動將程序編譯成.bc 文件後,通過llvm::ParseBitcodeFile, Linker::LinkModules將bitcode從string load進在跑的程序的module裡面去。

目前要解決的就是怎麼樣將code通過名字和絕對路徑自動編譯了。當然這個可以通過system call調用clang來達到……不過總覺得這麼著不太優雅,而且有環境依賴。因為自己對編譯器前端不太熟悉,所以想請問下clang有沒有哪個api可以讓我調用,直接編譯code成.bc 文件的?萬分感謝~


如果我理解的沒錯的話,你是想要通過程序的路徑和名字,如 ~/Documents/a.c,然後clang ~/Documents/a.c就可以編譯,是吧?只是你這裡只想要產生.bc,而非.out文件。

那麼,其實編譯器並非一個黑匣子整體,也就說雖然你調用的是clang,最開始走的其實是driver,當你進入到 clang -cc1模式的時候,你才是真正走到clang編譯器內部編譯流程了。那你這裡的問題首先要處理的driver,而非clang。而這個流程是這樣的:

明確了問題後,你就可以往找Driver類了:

clang: clang::driver::Driver Class Reference

而Driver是不知道編譯,鏈接等東西的,那麼這個時候你就要找什麼呢?就是有關編譯的東西,那麼也就是Driver與Compilation連接的東西:

clang: clang::driver::Compilation Class Reference

然後剩下的路你就可以自己走了,我不直接告訴你API是什麼了。

當然,Clang還提供了另外一種方式CompilerInstance and CompilerInvocation:

clang: clang::CompilerInstance Class Reference

clang: clang::CompilerInvocation Class Reference

這兩個也能達到目的,但是Driver類可以調用到其它工具,如-ld,後兩個則不行。不過你似乎也不需要這麼做,你只需要.bc文件。


使用libgccjit很容易達到效果。


沒特別看明白,是要這個?

-emit-llvm


推薦閱讀:

Clang parser是完全手寫的嗎?
在編譯C語言代碼時,Clang跟gcc編譯器哪一個編譯出來的程序運行更快?特別是在浮點運算方面。
在Mac上編C/C++不用Xcode而藉助terminal調用gcc真的好嗎?
LLVM/Clang 在工程領域應用如何?

TAG:編譯器 | Clang | LLVM |