簡體   English   中英

LLVM 比較指針和常量

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

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