[英]Logging the outcome of branch instructions in LLVM during runtime
我試圖通過編寫LLVM通過來獲得分支指令的結果,以便我可以找出CFG的邊沿頻率。
我已經閱讀了多個教程文件和LLVM文檔。 我嘗試過的解決方案是識別分支指令,插入對顯示分支源和目標的日志函數的調用。
我寫了一個函數傳遞,看起來像這樣:
for (auto &BB : F) {
for (auto &I: BB) {
if (auto* op = dyn_cast<BranchInst>(&I)) {
IRBuilder<> builder(op);
builder.SetInsertPoint(&BB, builder.GetInsertPoint());
Value* condition;
Value* false_dst;
Value* true_dst;
if (op->isConditional()) {
condition = op->getOperand(0);
false_dst = op->getOperand(1);
true_dst = op->getOperand(2);
} else {
condition = builder.getInt32(1);
false_dst = op->getOperand(0);
true_dst = op->getOperand(0);
}
Value* args[] = {condition, false_dst, true_dst};
builder.CreateCall(log_func, args);
}
}
}
我一直在嘗試多種解決方案大約10個小時,但沒有一個起作用。 我一直遇到這個錯誤:
void llvm::CallInst::init(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, const llvm::Twine&): Assertion `(Args.size() == FTy->getNumParams() || (FTy->isVarArg() && Args.size() > FTy->getNumParams())) && "Calling a function with bad signature!"' failed.
因為我已經使用二進制運算符進行了測試,所以它似乎僅使用分支指令來完成此操作,並且效果很好。
在調試器下運行代碼,並評估log_func->dump()
表達式。 這將使您了解此函數需要什么類型的參數。
我懷疑,問題出在最后兩個參數上。 這些是基本的塊標簽,不能作為call
指令的參數傳遞。 您可能要使用BB名稱創建字符串常量,然后將其傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.