1

我是 LLVM IR 的新手,我正在实现 PL0 语言。http://en.wikipedia.org/wiki/PL/0

我正在生成测试文件,如下所示:

const a = 10;
var b, c;

procedure check1;
var dd;
   procedure check2;
       c := 2;
begin
   dd := 1
end;

begin
    b := -1024+53*(-514-766)/93+100;
    c := b
end.

而我生成的 LLVM IR 是这样的:

; ModuleID = 'LLVM Module'

define void @__global_main_entry__() {
BlockUnitEntry:
  %b = alloca i32
  %c = alloca i32
  store i32 -1653, i32* %b
  %b1 = load i32* %b
  store i32 %b1, i32* %c
  ret void
}

define void @check1() {
ProcedureEntry:
  %dd = alloca i32
  store i32 1, i32* %dd
  ret void
}

define void @check2() {
ProcedureEntry:
  store i32 2, i32* %c
  ret void
}

我在这里遇到了一个痛苦的错误(破坏时):

While deleting: i32* %c
Use still stuck around after Def is destroyed:  store i32 2, i32* %c
test004_llvm_generate: /files/Install/LLVM_Framework/llvm/lib/IR/Value.cpp:79: virtual llvm::Value::~Value(): Assertion `use_empty() && "Uses remain when a value is destroyed!"' failed.

我猜想在过程中使用变量c(在 中定义__global_main_entry__check2会在 llvm::Value 中添加一个 ref,当破坏__global_main_entry__ref 时check2会导致错误。

不知道怎么解决,有时间请具体说一下~

(另外,除了llvm的官方文档。LLVM上还有资源吗?我发现大部分教程都过时了。)

我的完整代码列表在这里:https ://github.com/adamcavendish/PL0Compiler

提前致谢。

4

1 回答 1

2

您的 IR 格式错误 - 您不能从与指令出现的指令不同的函数体中引用指令,因此引用%cin@check2是非法的。故障只是发生在模块销毁期间,但也可能发生在其他情况下。

一般来说,opt -verify如果你不确定它是否合法,我建议在你的 IR 上运行,它会给你很好的错误消息。如果您想尝试使用 IR 来查看它何时合法和不合法,我的 Eclipse 插件也可能会有所帮助。

至于解决方案,看起来您应该创建一个全局变量来表示c,而不是指令。然后你可以在模块中的每个函数中store进入它并load从中取出它。

于 2014-01-31T17:38:50.950 回答