[英]LLVM comparing between a pointer and a constant
我正在嘗試手動構建 llvm IR 代碼(注入函數)。 我在構建比較指令時遇到問題:
auto *var0 = Builder->CreateLoad(StrPtr);
var0->getType()->dump(); // i8 addrspace(8)*
Builder->getInt8(0)->getType()->dump(); // i8
auto *cmp5 = Builder->CreateICmpEQ(var0, Builder->getInt8(0));
我無法在 var0 和 Builder->getInt8(0) 之間進行比較,因為轉儲表明它們具有不同的類型。 具體來說,我在運行時收到此錯誤:
opt: /llvm/include/llvm/IR/Instructions.h:1174: void
llvm::ICmpInst::AssertOK(): Assertion `getOperand(0)->getType() ==
getOperand(1)->getType() && "Both operands to ICmp instruction are not of
the same type!"' failed.
我該如何解決這個問題?
IR 是一種匯編語言——低級。 匯編語言中沒有自動轉換(除非我想離題並詳細介紹 go),因此您確實無法將 32 位或 64 位指針與 8 位 integer 進行比較。 如果你想轉換,你必須自己實現它,根據你的源語言的規則。
在這種情況下,您可能是指向 int cast的指針以及符號擴展或零擴展,因此比較的兩邊都是整數並且具有相同的位寬。 很可能是零擴展,但我提到兩者都是為了強調你必須考慮這些事情。
終於想出了如何做arnt所說的,這是代碼:
auto *var0 = Builder->CreateLoad(StrPtr);
auto *cmp5 = Builder->CreateICmpEQ(var0, Constant::getNullValue(Type::getInt8PtrTy(Ctx, 8)));
getNullValue 用 0 為我的新常量播種,這正是我所需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.