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 是一种汇编语言——低级。汇编语言中没有自动转换(除非我想离题并深入讨论细节)所以你真的不能将 32 位或 64 位指针与 8 位整数进行比较。如果你想转换,你必须根据你的源语言的规则自己实现它。
在这种情况下,what you what 可能是一个pointer to int cast and either a sign extension or a zero extension,所以比较的两边都是整数并且具有相同的位宽。很可能是零扩展,但我同时提到这两个是为了强调您必须考虑这些事情。
终于想出了如何做没有说的事情,这是代码:
auto *var0 = Builder->CreateLoad(StrPtr);
auto *cmp5 = Builder->CreateICmpEQ(var0, Constant::getNullValue(Type::getInt8PtrTy(Ctx, 8)));
notNullValue 用 0 作为我的新常量的种子,这正是我所需要的。
我正在尝试手动构建 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 是一种汇编语言——低级。汇编语言中没有自动转换(除非我想离题并深入讨论细节)所以你真的不能将 32 位或 64 位指针与 8 位整数进行比较。如果你想转换,你必须根据你的源语言的规则自己实现它。
在这种情况下,what you what 可能是一个pointer to int cast and either a sign extension or a zero extension,所以比较的两边都是整数并且具有相同的位宽。很可能是零扩展,但我同时提到这两个是为了强调您必须考虑这些事情。
终于想出了如何做没有说的事情,这是代码:
auto *var0 = Builder->CreateLoad(StrPtr);
auto *cmp5 = Builder->CreateICmpEQ(var0, Constant::getNullValue(Type::getInt8PtrTy(Ctx, 8)));
notNullValue 用 0 作为我的新常量的种子,这正是我所需要的。