微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LLVM 使用指令不是指令

如何解决LLVM 使用指令不是指令

在这里看到了一篇关于“使用指令不是指令”错误的帖子,我遇到了类似的问题,但没有充分的理由。

我正在使用 moe (https://llvm.moe/ocaml/Llvm.html) 编写 LLVM 来构建编译器,我的问题基本上归结为 3 行:

Name,Surname

在这里所做的基本上是使用 alloc 在内存中获取一些空间,然后将 32.3 的值存储到该空间,并尝试将其加载回我在内存中分配的位置 .

在 LLVM 方面,它看起来不错,因为在 dump_module 输出之后,我得到如下内容

let pointer = L.build_alloca float_t ("reg") builder in      L.dump_value(pointer);
  let test = L.build_store (L.const_float float_t 32.3) pointer builder      in L.dump_value(test);
   let loaded = L.build_load pointer ("reg") builder  in L.     dump_value(loaded);

这应该正是我想要的——我什至通过编写一个类似的 C 程序对此进行了测试,它在 LLVM 中做了一些与此非常相似的事情。

但是,当我运行我的程序时,出现以下错误

align 8  %reg = alloca double,align 8 
store double 3.230000e+01,double* %reg,align 8
%x13 = load double,align 8

这似乎真的没有意义。我检查了更多错误,它似乎是由 LLVM 源代码中的几行引起的:

Use of instruction is not an instruction!
 %x13 = load double,align 8

这似乎意味着如果指令没有父级就会发生这种情况,但我不确定为什么会这样。

非常感谢这里的任何帮助!

解决方法

LLVM 有常量和指令。常量是诸如 12 之类的东西,但也是函数和全局变量(具有常量地址)。说明是涉及某种操作的事物。

常量可以使用常量(例如,一个常量的初始化器可以引用其他常量)。指令可以使用常量(例如,可以存储到全局变量)。指令可以使用指令(例如,您可以从作为指令结果的地址加载)。

但是常量不能使用指令。

当断言代码查看 %x13 = load double,double* %reg 时,User 变量指向操作数 (%reg),并且操作数的父级是加载指令。我不知道它在断言时指向什么,但是无论 ->getParent() 返回什么都不是指令,而使用的是一个指令。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。