我正在編寫一個LLVM通道,它需要將傳遞給聲明函數的值傳出並打印出來。請注意聲明的函數正在LLVM IR中調用。LLVM在運行時獲取聲明函數的參數值
我寫了一個模塊傳遞來遍歷程序中的所有指令。一個片段來獲得被調用函數的參數的指令如下:
for (auto &B: F){
for (auto &I: B){
if (auto *InvokeI = dyn_cast <InvokeInst>(&I)) {
if (InvokeI->getCalledFunction()->getName().str() == "function_name") {
errs() << "===\n";
errs() << *(InvokeI->getOperand(0)) <<"\n";
errs() << *(InvokeI->getOperand(1)) <<"\n";
errs() << *(InvokeI->getOperand(2)) <<"\n";
}
}
}
}
但是,如果LLVM IR爲獲取調用的函數看起來是這樣的:
invoke void @function_name(i8* %4, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #5
to label %36 unwind label %6
然後我上面的代碼片段輸出:
%4 = call i8* @__cxa_allocate_exception(i64 4) #2
i8* bitcast (i8** @_ZTIi to i8*)
i8* null
而不是輸出函數調用期間傳遞的實際值。
我的問題是我們如何獲得運行期間傳遞的值。有沒有辦法可以將函數體添加到不返回任何內容的聲明函數?
任何幫助表示讚賞,感謝
這就是產生異常的'C++ abi'調用。你能提供一個原始源代碼的最小片段,它能在pastebin或類似的地方產生IR(如果它在這裏太大)? – compor
其實函數名是'__cxa_throw',產生這個IR的代碼行基本上就是'thow 1',我試圖去捕捉那個1或者其他任何會拋出的東西 – Nik391
它有點迷失方向,因爲你已經留下了指向C++ [ABI](https://itanium-cxx-abi.github.io/cxx-abi/)的東西。 – compor