我是 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
提前致谢。