首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指针和常量之间的LLVM比较

指针和常量之间的LLVM比较
EN

Stack Overflow用户
提问于 2020-04-13 07:59:13
回答 2查看 264关注 0票数 0

我正在尝试手动构建llvm IR代码(注入函数)。我在构建比较指令时遇到了一些问题:

代码语言:javascript
运行
复制
    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),因为转储表明它们具有不同的类型。具体地说,我在运行时收到以下错误:

代码语言:javascript
运行
复制
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.

我该如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-13 17:06:55

IR是一种低级汇编语言。汇编语言中没有自动类型转换(除非我想离题进入细节),所以你真的不能将32位或64位指针与8位整数进行比较。如果你想强制转换,你必须根据你的源语言的规则自己实现它。

在这种情况下,您看到的可能是pointer to int castsign extensionzero extension,因此比较的两端都是整数,并且具有相同的位宽。很可能是零扩展,但我提到这两个都是为了强调你必须考虑这些事情。

票数 1
EN

Stack Overflow用户

发布于 2020-04-14 06:46:30

我终于想好了怎么做没说过的事情,代码如下:

代码语言:javascript
运行
复制
auto *var0 = Builder->CreateLoad(StrPtr);
auto *cmp5 = Builder->CreateICmpEQ(var0, Constant::getNullValue(Type::getInt8PtrTy(Ctx, 8)));

getNullValue用0作为新常量的种子,这正是我所需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61179751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档