如何解决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 举报,一经查实,本站将立刻删除。