簡體   English   中英

在運行期間在LLVM中記錄分支指令的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM