web-dev-qa-db-ja.com

LLVMベースのコンパイラにリンク時最適化機能を追加するにはどうすればよいですか?

私はプログラミング言語を設計および実装しており、ネイティブコード生成にLLVMを使用しています。特に、パフォーマンスは言語の主要な機能であるため、リンク時の最適化の実装を検討しています。 公式LLVMサイト 、読んだ

LLVMは、リンク時に使用できる強力な相互モジュラー最適化を備えています。

ただし、問題のページには、ユーザーがリンク時の最適化をリクエストする方法が記載されていません。特に、LTOの理論(および実装に関する全体像の決定)のみを説明していますが、APIドキュメントやチュートリアルは参照していません。

私は Clangのコードベースでクイック検索 を実行しましたが、結果はあまり有益でも関連性でもありません。Clangで-fltoスイッチがオンになっている設定もわかりません。リンカがオブジェクトファイル間で最適化できるようにするコード生成の変更は言うまでもありません。

今、私はLTOを行うことは次の行に沿っているべきだと思います:

  1. リンカがLTOを使用できることがわかるように、オブジェクト/ビットコードファイルにある種のメタデータを生成します。たぶん、これには、モジュール、最適化される関数などに関する具体的な情報が含まれている必要があります(実際にそこに何を入れればよいのか本当にわかりません...)

  2. 次に、LTOを「サポート」するように、コード生成手順(つまり、LLVM APIの使用方法)を調整します。インターネットで調べたところ、 この関連するLLVMソースファイル が見つかりました。そのため、このタスクの少なくとも一部を自動化することは可能だと思いますが、いつものように、自動生成されたLLVMのドキュメントはせいぜい少ない。

だから、私の質問は:コンパイラーにLLVMのLTO機能を組み込むプロセスの説明は正しいですか?そうであれば、プロジェクトの基礎となるドキュメントやチュートリアルを提案できますか?

4
H2CO3

生のLLVM IRを生成する以外に何もする必要はありません。 LLVM LTOプラグインが適切にインストールされている限り、リンカーはIRモジュールをマージし、結果のモジュールをコンパイルします。 LTOプラグインはばかげています、それは単にすべてのLLVM IRモジュールを一緒にマージするだけです。

または、llvm-linkツールを使用して、生成されたIRモジュールを手動でマージできます。

2
SK-logic