首页 > 解决方案 > 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 认为这是一个重新定义?

标签: llvmforward-declarationllvm-irfunction-declarationfunction-definition

解决方案


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

declare %Object* @Main_main(%Main*)

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

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


推荐阅读