LLVM:之前未定义的“无效的功能重定义”

问题描述 投票:1回答:1

我正在使用编译器来为玩具语言(用于类)生成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认为这是re定义?

llvm forward-declaration llvm-ir function-declaration function-definition
1个回答
0
投票

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

declare %Object* @Main_main(%Main*)

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

而且,您似乎正在手动生成文本IR。做到这一点的标准方法是通过C ++ / C /任何API。这样可以通过类型安全或其他检查确保代码正确性。

© www.soinside.com 2019 - 2024. All rights reserved.