私は、PowerPC コードを分析して LLVM コードを生成するプログラムに取り組んでいます。分岐点/サブルーチン アドレスの分析では、コードが不完全である可能性があります (たとえば、コードが関数ポインターで非常に奇妙なことを行う場合)。フォールバック メカニズムを次のように設定する予定です。
- 生成されたサブルーチンは、元のプログラムからのアドレスに分岐しようとします。これは、マップされていない/実行できないページになります (ホスト アーキテクチャの機能によって異なります)。
- セグメンテーション違反が発生します。
- セグメンテーション フォールト ハンドラーは、何が起こったのかを識別し、次にプログラムが開始されたときに完全な分析を行うためにアドレスを保存します。次に、迅速かつダーティな分析を実行し、LLVM の JIT 機能を使用して、新しい分岐ターゲットの実行可能コードを生成します。
- 新しく生成されたコードに向けられている場合を除いて、分岐時のプロセッサ状態が復元されます。
問題は、セグメンテーション違反でプロセッサの状態を取得する方法がわからないことです。GDBは常にこれを行っているため、方法があると確信しています。
コードはクロスプラットフォームですが、現在 x86 OSX/Posix での実装に注力しています。