【问题标题】:LLVM: "invalid redefinition of function" that has not previously been definedLLVM:以前未定义的“无效重新定义函数”
【发布时间】:2020-03-20 04:35:39
【问题描述】:

我正在开发一个编译器来为一种玩具语言(一个类)生成 LLVM IR 代码。

但是,我不断收到一个奇怪的错误:“函数 Main_main 的重新定义无效”。这个函数只定义了一次,如 grepping for "Main_main" 所示:

$ 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 认为这是一个重新定义?

【问题讨论】:

  • 请分享整个 test.ll,或者至少是调用和定义 Main_main 的函数。

标签: llvm forward-declaration llvm-ir function-declaration function-definition


【解决方案1】:

您显示的 IR 在语法上不正确。用declare 声明的函数不能有主体,即使有,你也缺少花括号。你应该有类似的东西

declare %Object* @Main_main(%Main*)

define %Object* @Main_main(%Main* %_self_var) {
...
}

此外,您似乎正在手动生成文本 IR。做到这一点的规范方法是通过 C++/C/whatever API。这将通过类型安全或额外检查来确保代码的正确性。

【讨论】:

  • 同意不直接生成文本IR;不幸的是,这就是我们需要做的。 (部分任务是手工记账。)但是现在,我的declare 没有正文——我显示的位是 grep 的输出,查找所有出现 Main_main 的地方在程序中。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2016-06-16
  • 2018-05-21
相关资源
最近更新 更多