想在程序runtime的時候動態編譯其他code為.bc file,有什麼辦法?
01-14
一個課餘自己練手的作業,想要在我的程序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。而這個流程是這樣的:
然後剩下的路你就可以自己走了,我不直接告訴你API是什麼了。
當然,Clang還提供了另外一種方式CompilerInstance and CompilerInvocation:
clang: clang::CompilerInstance Class Referenceclang: clang::CompilerInvocation Class Reference這兩個也能達到目的,但是Driver類可以調用到其它工具,如-ld,後兩個則不行。不過你似乎也不需要這麼做,你只需要.bc文件。使用libgccjit很容易達到效果。
沒特別看明白,是要這個?-emit-llvm
推薦閱讀:
※Clang parser是完全手寫的嗎?
※在編譯C語言代碼時,Clang跟gcc編譯器哪一個編譯出來的程序運行更快?特別是在浮點運算方面。
※在Mac上編C/C++不用Xcode而藉助terminal調用gcc真的好嗎?
※LLVM/Clang 在工程領域應用如何?