llvm - LLVM:以前未定义的“无效重新定义函数”
问题描述
我正在开发一个编译器来为一种玩具语言(一个类)生成 LLVM IR 代码。
但是,我不断收到一个奇怪的错误:“函数 Main_main 的重新定义无效”。此函数仅定义一次,如“Main_main”的 grepping 所示:
$ grep "Main_main" test.ll
declare %Object* @Main_main(%Main*)
%Object* (%Main*) * @Main_main
%vtpm.1 = call %Object*(%Main* ) @Main_main( %Main* %vtpm.0 )
define %Object* @Main_main(%Main* %_self_var) {
第一行是声明它的位置,第二行是指向它的指针存储在 vtable 中的位置,第三行是调用它的位置,第四行是定义它的位置。当然只有其中一个算作定义吗?
确切的错误信息:
$ llvm-as test.ll -o test.bc
llvm-as: test.ll:179:17: error: invalid redefinition of function 'Main_main'
define %Object* @Main_main(%Main* %_self_var) {
^
我在做什么错,这让 LLVM 认为这是一个重新定义?
解决方案
您显示的 IR 在语法上不正确。用声明的函数declare
不能有主体,即使有,你也缺少花括号。你应该有类似的东西
declare %Object* @Main_main(%Main*)
define %Object* @Main_main(%Main* %_self_var) {
...
}
此外,您似乎正在手动生成文本 IR。做到这一点的规范方法是通过 C++/C/whatever API。这将通过类型安全或附加检查来确保代码的正确性。
推荐阅读
- java - 可选和同时铸造
- android - '1' 与属性 textSize (attr) 维度不兼容
- flutter - 如何在背景打开/关闭颤动期间更改 AppBar 文本
- ocaml - OCamlbuild 递归构建依赖项
- javascript - localStorage onload 显示我选择的 div?
- chatbot - 从 Watson 聊天机器人全屏播放视频
- php - 在 gitlab 中集成 phpdoc 用于自动生成文档
- python-2.7 - 如何在python中定义函数的子类型?
- python - 根据时间戳和不同位置创建会话
- c# - 具有延迟执行和 SQL 端分组的 EF Core Group By