LLVM例外処理の実装 質問する

LLVM例外処理の実装 質問する

ちなみに、私は読んだ 質問そして読んでブログ投稿そして私はまたABI

私がまったく理解していないのは、それが LLVM の EH 組み込み関数とどのように相互作用するかということです。LLVM EH ページでは、非常に漠然とした概要が示されており、「X、Y、Z を実装する」というチェックリストそのものではありません。

LLVM えーこのページは Itanium ABI を直接参照しています。これは、LLVM が Itanium ABI 例外のみをサポートしていることを意味します。しかし、Clang が ARM をサポートしており、Microsoft ABI のサポートを開発していることはすでに知っています。では、LLVM の EH 実装は Itanium ABI に対してどの程度具体的なのでしょうか?

Itanium ABI で定義されている _Unwind のものを参照する場合、それをバックエンドで提供することが義務付けられているのでしょうか、それとも自分で実装する必要があるのでしょうか?

また、Clang によって生成された LLVM IR では、言語固有のテーブル、例外フレーム、例外テーブルなどがまったく明らかにされないことにも気付きました。その場合、LLVM はどのようにして言語固有のデータを生成する方法を知るのでしょうか?

つまり、LSDA、EH コンテキスト、およびから、および_Unwind_RaiseExceptionに移行するにはどうすればよいでしょうか。landingpadresume

編集: 参考までに、結果のコードを Windows で JIT 化します。

ベストアンサー1

現在、Itanium C++ ABIは、他の多くのプラットフォームで使用される事実上の標準C++ ABIです。Itanium C++ ABIは、ゼロコストの例外処理これは今日最も普及している技術です。

例外処理をサポートするには、関数呼び出しのセマンティクスを変更する必要があります。これで、呼び出しは実行フローを分岐します。すべてが正常な場合は 1 つの分岐が実行され、例外が発生した場合は 2 番目の分岐が実行されます。LLVM IR には、invokeスローされる可能性のある関数を呼び出す命令があります。

2 番目の分岐が実行されると、いくつかの種類のアクションが実行される場合があります。

  • デストラクタを呼び出す(掃除
  • スタックの巻き戻しを続行する(再開する
  • スロー仕様を強制する(フィルター
  • 通常のコントロールフローを復元する(キャッチ)。

これらのアクションを実行するには、追加のコードを生成する必要があることは明らかです。そのため、命令も用意しました。これは、例外が発生したlandingpad後に実行される最初の命令です。invoke

しかし、主な魔法は実行時に実行されます。例外がスローされた後、言語に依存しないランタイムはスタックを巻き戻し、フレームごとに言語固有のデータ領域(LSDA)を見つけて、言語固有の呼び出しをします。性格ルーチンパーソナリティ ルーチンは、プログラム カウンター、LSDA、および現在の例外を検査します。クリーンアップが必要かどうか、スロー仕様に違反しているかどうか、またはこのフレームで例外をキャッチできるかどうかを判断します。

ご存知のとおり、これらすべてのデータ (パーソナリティ ルーチン、キャッチされた型、スロー仕様、クリーンアップ アクション) はすでにlandingpad命令で指定されているため、オブジェクト ファイルに例外関連のセクションを生成するためにバックエンドに追加のデータを渡す必要はありません。

おすすめ記事