2017-12-01 9 views
2

OCaml에 LLVM IR로 컴파일되는 컴파일러를 작성하고 있습니다. 내 컴파일러로 실행LLVM main()의 잘못된 반환 유형이 제공되었습니다.

num main() { 
    return 0; 
} 

이, 나는 다음과 LLVM IR 코드를 얻을 :, 내가 말한거야 내가 lli에 전달하면, 그러나

; ModuleID = 'PixMix' 
source_filename = "PixMix" 

@fmt = private unnamed_addr constant [4 x i8] c"%d\0A\00" 
@fmt.1 = private unnamed_addr constant [4 x i8] c"%s\0A\00" 

declare i32 @printf(i8*, ...) 

define double @main() { 
entry: 
    ret double 0.000000e+00 
} 

을 현재의 프로그램은 매우 간단합니다 반환 유형이 유효하지 않습니다. 해당 코드를 보면 maindouble으로 정의되어 있으며 double을 반환합니다. 따라서 lli이 반환 유형이 엉망이라고 말하는 이유는 무엇입니까?

답변

2

문제는 진입 점 함수 (기본적으로 main하지만 이름이 -entry-function 플래그에 의해 제어 할 수 있습니다가) main C 또는 C++에서 보이는 것과 유사한 특정 서명을 가질 것으로 예상된다는 점이다. 특히 void 또는 정수 유형을 반환해야합니다. the implementation of the check을 읽으면 생성하는 IR이이를 만족시키는 지 확인할 수 있습니다.