2017-12-01 21 views
2

OCamlにLLVM IRにコンパイルするコンパイラを書きます。現在のプログラムは非常に簡単です:私は私のコンパイラでそれを実行するとLLVM main()の無効な戻り値タイプ

num main() { 
    return 0; 
} 

は、私は次のLLVM IRコードを取得する:

; 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 
} 

私はlliにそれを渡す場合は、私は聞いています戻り値の型が無効であることを示します。そのコードを見ると、maindoubleと定義されています。doubleが返されます。なぜ返り値の型が崩れているのですか?lli

答えて

2

問題は、エントリポイント関数(デフォルトでmainが、名前が-entry-functionフラグによって制御することができる)ことであるが、mainがCまたはC++のように見えるものと同様特定の署名を有すると予想されます。特に、voidまたは整数型を返す必要があります。 the implementation of the checkを読んで、あなたが生成するIRがそれを満たすことを確認することができます。

関連する問題