내가 LLVM-IR을 대상으로 장난감 언어에 대한 프론트 엔드 컴파일러를 구현하고 반면에 스택 오버 플로우가 발생하고 while
문 컴파일 실행 때 내가 스택 오버 플로우가 발생 : 예를 들어LLVM의 alloca를 문
을,이 코드는 영원히 실행해야하지만, 컴파일 된 버전 스택 오버플로가 발생합니다.
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
에서 오는 생각 : 여기
def run(): Void = {
i = 0;
while(true) {
i = i + 1;
}
}
그리고
는 comipled LLVM-IR이다. :'alloca'd 메모리가 자동으로 할 때 함수가 반환을 발표한다.
while 루프를 어떻게 컴파일해야합니까?
이 문제를 방지 할 수 있습니까?
윌 문이 더 큰 상태/신체 표현이있을 때 동안이 작품? – anotherCode245
예, ir 수준에서 작동하므로 더 많은 지침이 길어질뿐입니다. – user1937198
우리는'opt -S -mem2reg test.ll -o test.ll'을 시도했습니다. 우리는 여전히 몸에'alloca'를 가지고 있기 때문에 여전히 스택 오버플로가 있습니다. –