LLVM:“;无效的函数重新定义“;这是以前没有定义过的

LLVM:“;无效的函数重新定义“;这是以前没有定义过的,llvm,forward-declaration,llvm-ir,function-declaration,function-definition,Llvm,Forward Declaration,Llvm Ir,Function Declaration,Function Definition,我正在开发一个编译器,为一个玩具语言(类)生成LLVM IR代码 然而,我不断地遇到一个奇怪的错误:“函数Main\u Main的重新定义无效”。此函数只定义一次,因为“Main_Main”的灰色显示: 第一行是声明它的地方,第二行是指向它的指针存储在vtable中的地方,第三行是调用它的地方,第四行是定义它的地方。当然只有其中一个可以作为定义 确切的错误消息: $ llvm-as test.ll -o test.bc llvm-as: test.ll:179:17: error: invali

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

然而,我不断地遇到一个奇怪的错误:“函数Main\u Main的重新定义无效”。此函数只定义一次,因为“Main_Main”的灰色显示:

第一行是声明它的地方,第二行是指向它的指针存储在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认为这是一个re定义?

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

declare %Object* @Main_main(%Main*)

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

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

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

declare %Object* @Main_main(%Main*)

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

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

同意不直接生成文本IR;不幸的是,这正是我们需要做的。(部分作业是手工记账。)但现在,我的
declare
没有主体。我显示的是grep的输出,找到程序中出现
Main\u Main
的所有位置。同意不直接生成文本IR;不幸的是,这正是我们需要做的。(部分作业是手工记账。)但是现在,我的
declare
没有主体。我显示的是grep的输出,找到程序中出现
Main\u Main
的所有位置。请分享整个测试。ll,或者至少是调用和定义了
Main\u Main
的函数。请共享整个test.ll,或者至少是调用和定义了
Main\u Main
的函数。