저는 언어 생성과 컴파일러 생성에 관심이 있으며 여기 예제를 통해 작업 해 왔습니다 : http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/. 저자는 LLVM 2.6을 사용하고 있었고 LLVM 2.7에 몇 가지 변경을 가한 후 모든 코드 생성 코드를 컴파일했습니다. 컴파일러에 테스트 코드를 입력하면 코드를 실행하려고 시도 할 때까지 프로그램이 제대로 작동합니다 (코드가 실행될 때까지). 나는 내 시스템에서 LLDB를 작성하는 중입니다.하지만 그 동안 LLVM asm에서 분명한 오류가 발생 했습니까? LLVM 코드 생성으로 인해 seg fault가 발생합니까?
; ModuleID = 'main'
define internal void @main() {
entry:
%0 = call i64 @do_math(i64 10) ; <i64> [#uses=0]
ret void
}
define internal i64 @do_math(i64) {
entry:
%a = alloca i64 ; <i64*> [#uses=1]
%x = alloca i64 ; <i64*> [#uses=1]
%1 = add i64 5, 3 ; <i64> [#uses=1]
%2 = load i64* %a ; <i64> [#uses=1]
%3 = mul i64 %2, %1 ; <i64> [#uses=1]
store i64 %3, i64* %x
ret void
}
출력
은 다음과 같습니다Segmentation fault
내 아치 OS X의 x86_64에 있습니다.
감사합니다.
코드는 정확히 'C 코드'가 아니며 링크 된 자습서에서 작성된 C와 유사한 언어입니다. 'do_math'함수는 int가 반환해야한다고 말한 것처럼 이해합니다. ASM은 AST 및 일부 코드 생성 코드에서 생성되므로 초기화되지 않은 데이터를 사용하려는 이유를 알 수 있습니다. –