我正在尝试手动构建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.
我该如何解决这个问题?
发布于 2020-04-13 17:06:55
IR是一种低级汇编语言。汇编语言中没有自动类型转换(除非我想离题进入细节),所以你真的不能将32位或64位指针与8位整数进行比较。如果你想强制转换,你必须根据你的源语言的规则自己实现它。
在这种情况下,您看到的可能是pointer to int cast和sign extension或zero extension,因此比较的两端都是整数,并且具有相同的位宽。很可能是零扩展,但我提到这两个都是为了强调你必须考虑这些事情。
发布于 2020-04-14 06:46:30
我终于想好了怎么做没说过的事情,代码如下:
auto *var0 = Builder->CreateLoad(StrPtr);
auto *cmp5 = Builder->CreateICmpEQ(var0, Constant::getNullValue(Type::getInt8PtrTy(Ctx, 8)));
getNullValue用0作为新常量的种子,这正是我所需要的。
https://stackoverflow.com/questions/61179751
复制相似问题