我正在为针对 LLVM-IR 的玩具语言实现前端编译器,在运行编译while
语句时遇到堆栈溢出:
例如,这段代码应该永远运行,但一段时间后我们编译的版本堆栈溢出。
def run(): Void = {
i = 0;
while(true) {
i = i + 1;
}
}
这是编译后的 LLVM-IR:
define i32 @run() nounwind ssp {
; i = 0
%i = alloca i32, align 4
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
%2 = load i32* %1, align 4
store i32 %2, i32* %i, align 4
br label %3
; <label>: %3
; while(true)
; Generated by compileExpression(condition)
%4 = alloca i1, align 4
store i1 true, i1* %4, align 4
%5 = load i1* %4, align 4
br i1 %5, label %6, label %11
; <label>: %6
; i = i + 1
; Generated by compileExpression(body)
%7 = load i32* %i, align 4
%8 = alloca i32, align 4
store i32 1, i32* %8, align 4
%9 = load i32* %8, align 4
%10 = add nsw i32 %7, %9
store i32 %10, i32* %i, align 4
br label %3
; <label>: %11
%12 = load i32* %i, align 4
ret i32 %12
}
我们认为我们的问题来自所有alloca
未发布的,因为我们仍然在同一个函数中。
当函数返回时,“分配”的内存会自动释放。
我们应该如何编译while循环?
我们能避免这个问题吗?