2010-08-09 3 views
8

저는 언어 생성과 컴파일러 생성에 관심이 있으며 여기 예제를 통해 작업 해 왔습니다 : 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에 있습니다.

감사합니다.

답변

15

같은 문제가 있습니다. 나는 Loren의 컴파일러를 제거했고 실행을 제외하고는 모든 것이 잘 작동했다.

분할 오류는 사실에 기인 한 것 :

ExecutionEngine EE * = EngineBuilder (모듈) .create();

은 NULL을 반환합니다. 실제 오류를 보려면 오류 문자열을 가져와야합니다.

std :: string error; ExecutionEngine * ee = EngineBuilder (모듈) .setErrorStr (& 오류) .create(); 귀하의 경우에는

당신은 아마 표시되어야합니다

"(어떤 대상이 등록되지 않은)

것은 당신이

를 호출 할 필요가 있음을 해결하기 위해이 배에 대한 대상을 찾을 수 없습니다

InitializeNativeTarget();

하지만 얻을 경우 :

JIT에 연결되지 않았습니다.

당신은 다음을 포함한다 : JIT 엔진을 연결됩니다

LLVM/ExecutionEngine/MCJIT.h

합니다.

0

게시 한 LLVM ASM이 제시 한 C 코드의 올바른 번역이 아닙니다. 스택 변수로 %a을 할당 한 다음 초기화되지 않은 데이터를로드하여 사용합니다. 당신이 을 원한다면은 당신의 인수를 %a으로 명명하고 그 값을 사용하는 것입니다. 대신에이 코드를 사용해보십시오 :

define internal i64 @do_math(i64 %a) { 
entry: 
    %x = alloca i64         ; <i64*> [#uses=1] 
    %1 = add i64 5, 3        ; <i64> [#uses=1] 
    %2 = mul i64 %a, %1        ; <i64> [#uses=1] 
    store i64 %2, i64* %x 
    ret void 
} 

은 또한 당신의 main() 프로토 타입이 C 런타임 라이브러리가 기대하는 것과 일치하지 않을 수 있습니다. 그리고 그 이상으로 do_math()의 결과를 반환하지 않는다는 것을 알고 있습니까?

+0

코드는 정확히 'C 코드'가 아니며 링크 된 자습서에서 작성된 C와 유사한 언어입니다. 'do_math'함수는 int가 반환해야한다고 말한 것처럼 이해합니다. ASM은 AST 및 일부 코드 생성 코드에서 생성되므로 초기화되지 않은 데이터를 사용하려는 이유를 알 수 있습니다. –

관련 문제