如何向LLVM IR中的上一个函数中定义的变量添加引用?

如何向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

我是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 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.