2015-09-05 74 views
1

我正在研究一個圖書館,我希望某些內省功能可用。假設我正在編譯clang,所以我可以訪問libtooling或其他任何東西。如何使我的程序可用的LLVM IR功能可用?

我特別希望某人能夠查看作爲程序一部分的已編譯函數的LLVM IR。我知道,在編譯時,我可以使用-emit-llvm來獲取IR。但是它將它保存到一個文件中。我想要的是將LLVM IR嵌入到程序本身中並從程序本身檢索 - 例如, my_function_object.llvm_ir()

這樣的事情可能嗎?謝謝!

+0

我不認爲這回答我的問題。問題是:如何從我自己的程序中訪問LLVM IR? – user2333829

+0

LLVM是否會以任何方式(動態或靜態)鏈接到您編譯的程序? –

+0

如果必須的話,我可以肯定地將它鏈接到(LLVM),但是如果我能做到甚至沒有更好。 – user2333829

回答

2

你基本上想要反射到你的程序。反射需要二進制文件中存在元數據。就我所知,這在LLVM中並不存在。

爲了達到這樣的效果,您可以在程序中創建一個全局鍵值字典,通過導出的函數暴露 - 例如IRInstruction* retrieve_llvm_ir_stream(char* name)

此字典會將給定函數的某種標識符(例如,導出的名稱)映射到表示該函數的IR流的內存數組(例如,每個指令都表示爲自定義IRInstruction結構,例如)。表示格式的類型和功能(如自定義IRInstruction結構)必須包含在您的源代碼中。

在IR生成步驟中,該字典將爲空。緊接着IR生成步驟之後,您需要添加一個自定義構建步驟:打開IR文件並使用數據填充字典 - 對於程序的每個導出函數,將其名稱作爲字典的註冊鍵及其IR流作爲一個值。 IR流將從您的函數定義中生成,如您的定製構建工具(可利用LLVM API讀取生成的IR並將其轉換爲您的格式)讀取的那樣。

然後,像以前一樣前往彙編器和鏈接器。

+0

我無法快速接受這個答案!很好的答案。這是我的想法 - 需要在中間構建步驟中完成,但您完全將其勾畫出來。謝謝! – user2333829