【问题标题】:Llvm 10 error: Invalid record with void functionLlvm 10 错误:具有 void 函数的无效记录
【发布时间】:2021-01-16 18:26:13
【问题描述】:

我对使用 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 llvm-ir


    【解决方案1】:

    我找到了一个答案,这个解决方案真的很愚蠢,但我想添加一个答案,因为 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)
      ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-05
      • 2015-01-12
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多