如何向LLVM IR中的上一个函数中定义的变量添加引用?
我是LLVM IR的新手,正在实现PL0语言 我正在生成测试文件,如下所示:如何向LLVM IR中的上一个函数中定义的变量添加引用?,llvm,llvm-ir,Llvm,Llvm Ir,我是LLVM IR的新手,正在实现PL0语言 我正在生成测试文件,如下所示: 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 Modul
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
}
我在这里(毁灭时)犯了一个痛苦的错误:
我猜在过程check2
中使用变量c
(定义在\uuuuuuuu全局主条目\uuuuuuu
中)会在llvm::Value中添加一个ref,当销毁\uuuu全局主条目\uuuuu
时,check2
处的ref会导致错误
我不知道如何解决这个问题,如果你有时间具体说明,请~
(此外,除了llvm的官方文档外,还有关于llvm的更多资源吗?我发现大多数教程都过时了。)
我的完整代码列表如下:
提前感谢。您的IR格式不正确-您无法引用来自函数体的指令,该指令与出现该指令的函数体不同,因此在
@check2
中引用%c
是非法的。该故障恰好发生在模块销毁期间,但也可能发生在其他情况下
一般来说,我建议在你的IR上运行opt-verify
,如果你不确定它是否合法,它会给你很好的错误消息。如果你想尝试IR,看看它什么时候合法,什么时候不合法,这也可能会有所帮助
至于解决方案,看起来应该创建一个表示
c
,而不是一条指令。然后您可以将
存储到其中,并在模块中的每个函数中从中加载
。如何检查2
参考检查1
的变量?全局变量无法解决问题。它看起来像一个闭包吗?“也许我错了。”亚当不太明白你的问题。LLVM IR中没有嵌套函数或闭包的概念。如果你想在多个函数之间共享一些东西,你必须找到一种在IR中建模的方法——使用globals是我能想到的最简单的解决方案。另一个选项是参数。也许我会试试参数~
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.