9

私は言語の作成とコンパイラの構築に興味があり、http: //gnuu.org/2009/09/18/writing-your-own-toy-compiler/の例に取り組んできました。著者は LLVM 2.6 を使用していましたが、LLVM 2.7 用にいくつか変更を加えた後、すべてのコード生成コードをコンパイルすることができました。コンパイラにテストコードをフィードするとき、

int do_math( int a ) {
  int x = a * 5 + 3
}

do_math( 10 )

プログラムは、コードを実行しようとするまでは正しく動作しますが、その時点でセグメンテーション違反が発生します。私は自分のシステムで LLDB を構築している最中ですが、それまでの間、誰かがこの LLVM asm に明らかなセグ フォールトを見ていますか?

; 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 です。

ありがとう。

4

2 に答える 2

17

同じ問題が発生しました。ローレンのコンパイラを削除しましたが、実行以外はすべて正常に機能していました。

セグメンテーション違反は、次の事実によって引き起こされました。

ExecutionEngine * ee = EngineBuilder(module).create();

NULLを返します。実際のエラーを確認するには、エラー文字列を取得する必要があります。

std::stringエラー; ExecutionEngine * ee = EngineBuilder(module).setErrorStr(&error).create();

あなたの場合、おそらく次のように表示されます。

「このトリプルのターゲットが見つかりません(ターゲットが登録されていません)

それを修正するには、電話する必要があります

InitializeNativeTarget();

しかし、あなたが得るならば:

JITはにリンクされていません。

以下を含める必要があります。

llvm / ExecutionEngine / MCJIT.h

JITエンジンをリンクします。

于 2011-04-29T10:10:29.313 に答える
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()?

于 2010-08-10T09:36:38.117 に答える