Llvm 10 error: Invalid record with void function
Llvm 10 error: Invalid record with void function
我正在为使用 llvm 和 OCaml 绑定编写的微型编译器的问题而烦恼。
在我的程序的代码生成功能期间,当我试图编译一个具有 void 类型的函数的程序时,我从 llc
中得到错误 error: Invalid record
。但是,它适用于所有 int 类型的函数(我的语言只支持 int)。
这是一个程序,我有 LLC error: Invalid record
; ModuleID = 'MicrocC-module'
source_filename = "MicrocC-module"
declare i32 @print(i32)
declare i32 @getint()
define void @printem(i32 %0, i32 %1, i32 %2, i32 %3) {
entry:
%a = alloca i32
store i32 %0, i32* %a
%b = alloca i32
store i32 %1, i32* %b
%c = alloca i32
store i32 %2, i32* %c
%d = alloca i32
store i32 %3, i32* %d
%acc_var = load i32, i32* %a
%print = call i32 @print(i32 %acc_var)
%acc_var1 = load i32, i32* %b
%print2 = call i32 @print(i32 %acc_var1)
%acc_var3 = load i32, i32* %c
%print4 = call i32 @print(i32 %acc_var3)
%acc_var5 = load i32, i32* %d
%print6 = call i32 @print(i32 %acc_var5)
ret void
}
define i32 @main() {
entry:
%printem = call void @printem(i32 42, i32 17, i32 192, i32 8)
ret i32 0
}
这是一个包含所有 int 函数的程序,并且运行没有错误
; ModuleID = 'MicrocC-module'
source_filename = "MicrocC-module"
declare i32 @print(i32)
declare i32 @getint()
define i32 @add(i32 %0, i32 %1) {
entry:
%a = alloca i32
store i32 %0, i32* %a
%b = alloca i32
store i32 %1, i32* %b
%acc_var = load i32, i32* %a
%acc_var1 = load i32, i32* %b
%tmp = add i32 %acc_var, %acc_var1
ret i32 %tmp
}
define i32 @main() {
entry:
%a = alloca i32
%add = call i32 @add(i32 39, i32 3)
store i32 %add, i32* %a
%acc_var = load i32, i32* %a
%print = call i32 @print(i32 %acc_var)
ret i32 0
}
我的LLVM版本是10
我找到了一个答案,这个解决方案真的很愚蠢,但我想添加一个答案,因为 LLVM 上的一些新人可能会遇到同样的问题。
因为在所有语言中将结果存储在 void 函数中是没有意义的,事实上,在我的函数的主体中有以下代码
%add = call i32 @add(i32 39, i32 3)
当一个函数是 Void 时,OCaml 中的系统调用,我认为在 C++ 中也需要一个空字符串作为名称函数(在 C++ 中我认为它是 null)。
所以正确的调用是没有名称 %add.
此外,我不知道为什么在Ocaml构建过程中收到error: Invalid record
错误,但我直接下载LLVM from github和运行的最新版本的llvm编译器(llc),它给了我一个很好的错误描述,比如
./llc: error: ./llc: /media/vincent/VincentHDD/SandBoxDev/test_llvm.ll:35:3: error: instructions returning void cannot have a name
%printem = call void @printem.1(i32 42, i32 17, i32 192, i32 8)
^
我正在为使用 llvm 和 OCaml 绑定编写的微型编译器的问题而烦恼。
在我的程序的代码生成功能期间,当我试图编译一个具有 void 类型的函数的程序时,我从 llc
中得到错误 error: Invalid record
。但是,它适用于所有 int 类型的函数(我的语言只支持 int)。
这是一个程序,我有 LLC error: Invalid record
; ModuleID = 'MicrocC-module'
source_filename = "MicrocC-module"
declare i32 @print(i32)
declare i32 @getint()
define void @printem(i32 %0, i32 %1, i32 %2, i32 %3) {
entry:
%a = alloca i32
store i32 %0, i32* %a
%b = alloca i32
store i32 %1, i32* %b
%c = alloca i32
store i32 %2, i32* %c
%d = alloca i32
store i32 %3, i32* %d
%acc_var = load i32, i32* %a
%print = call i32 @print(i32 %acc_var)
%acc_var1 = load i32, i32* %b
%print2 = call i32 @print(i32 %acc_var1)
%acc_var3 = load i32, i32* %c
%print4 = call i32 @print(i32 %acc_var3)
%acc_var5 = load i32, i32* %d
%print6 = call i32 @print(i32 %acc_var5)
ret void
}
define i32 @main() {
entry:
%printem = call void @printem(i32 42, i32 17, i32 192, i32 8)
ret i32 0
}
这是一个包含所有 int 函数的程序,并且运行没有错误
; ModuleID = 'MicrocC-module'
source_filename = "MicrocC-module"
declare i32 @print(i32)
declare i32 @getint()
define i32 @add(i32 %0, i32 %1) {
entry:
%a = alloca i32
store i32 %0, i32* %a
%b = alloca i32
store i32 %1, i32* %b
%acc_var = load i32, i32* %a
%acc_var1 = load i32, i32* %b
%tmp = add i32 %acc_var, %acc_var1
ret i32 %tmp
}
define i32 @main() {
entry:
%a = alloca i32
%add = call i32 @add(i32 39, i32 3)
store i32 %add, i32* %a
%acc_var = load i32, i32* %a
%print = call i32 @print(i32 %acc_var)
ret i32 0
}
我的LLVM版本是10
我找到了一个答案,这个解决方案真的很愚蠢,但我想添加一个答案,因为 LLVM 上的一些新人可能会遇到同样的问题。
因为在所有语言中将结果存储在 void 函数中是没有意义的,事实上,在我的函数的主体中有以下代码
%add = call i32 @add(i32 39, i32 3)
当一个函数是 Void 时,OCaml 中的系统调用,我认为在 C++ 中也需要一个空字符串作为名称函数(在 C++ 中我认为它是 null)。 所以正确的调用是没有名称 %add.
此外,我不知道为什么在Ocaml构建过程中收到error: Invalid record
错误,但我直接下载LLVM from github和运行的最新版本的llvm编译器(llc),它给了我一个很好的错误描述,比如
./llc: error: ./llc: /media/vincent/VincentHDD/SandBoxDev/test_llvm.ll:35:3: error: instructions returning void cannot have a name
%printem = call void @printem.1(i32 42, i32 17, i32 192, i32 8)
^