2013-04-25 84 views
3

我一直在想如何基本上拿一部分LLVM紅外代碼,並在C中執行內嵌我想要能夠內聯紅外代碼,以便不需要虛函數調用(與使用_asm{}可以內聯彙編代碼的方式相同)。請看下面的例子:在C執行LLVM紅外代碼

LLVM IR代碼來執行:

define i64 @square(i64 %x){ 
    %y = mul i64 %x, %x 
    ret i64 %y 
} 

C程序:

for(i = 0; i < length; i++){ 
    //run LLVM IR Code here 
} 

我知道我可以使用parseIRFile()閱讀紅外代碼,並創建一個函數指針但這不是我所需要的虛擬函數調用。

+0

你在說什麼「虛擬電話」?在'for(i = 0; i 2013-04-26 09:21:37

回答

2

首先,沒有涉及虛擬功能 - C沒有這樣的概念。我認爲你的意思是一個間接函數調用,也就是獲取一個函數指針並調用它指向的函數。

簡短的回答是,沒有,沒有直接的方法來嵌入LLVM在C中,並得到它與您的代碼編譯:see this related question and my answer。正如我在那裏提到的那樣,如果您想讓程序員編寫LLVM IR並仍然堅持直接函數調用,則應該將IR封裝在函數中並將其放入單獨的文件中。

如果嵌入IR比性能更重要,則必須使用ParseIR()路由(不需要ParseIRFile()--您可以直接從內存中解析)。

我想你可以在你的構建過程中引入一些腳本,它需要一個混合的C/IR輸入文件,將它分解成兩個文件,然後將它們編譯在一起,並適當修改IR中的調試信息,它真正嵌入在C文件中。但這是一種非常冒險的方法,無論哪種方式,輸入文件都不會是合法的C文件。