免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/snsn1984/article/details/90183608
昨年、イベントHelloLLVM杭州駅、私はシェアを持っていた:LLVMバックエンドの紹介 。主にLLVMバックエンドを簡単に紹介のLLVMバックエンドのいくつかの主要な側面の拡大から。今日の火を設定し、新しいチップや命令では、LLVMのための新しいバックエンドを追加し、それは誰にでも関心のホットスポットとなっています。
LLVMの関係者は、バックエンドの2つの公式文書を提供しています:
1 2は、読む前に読むことを尋ねました。これら二つの文書は、基本的には、新しいバックエンドを作成するために必要なあらゆる種類の情報を取得することができ、一緒に読むことを指します。バックエンドのコードの組織から、バックエンドアーキテクチャを解決するための3つのレベルから、これら二つの文書、実行およびリンク構築ステップは非常に明確に述べています。我々は、これらの3つのレベルで見てみるためにここにいます。
1、多くとも6の後端
- ターゲット記述クラス:抽象ターゲット記述インターフェース(代码地址:/ LLVM /標的/を含みます)
- Marchineコード記述クラス:ターゲット用に生成されたコードをrepesentするために使用されるクラス(代码地址:含める/ LLVM /コード生成/)
- 「MC」レイヤー:表現するために使用し、生のマシンコードレベルでの処理コード
- 独立した世代アルゴリズムコードターゲット (コード住所:LIB /コード生成)
- 特定のターゲットの抽象記述のインターフェースの実装 (代码地址:LIB /ターゲット)
- JITのターゲットに依存しないコンポーネント (コードアドレス:libに/ ExecutionEngine / JIT)
2、7つの部門のバックエンド
- 命令選択
- スケジュール設定と生成
- SSAベースのマシンコードの最適化
- レジスタ割り当て
- プロローグ/エピローグコードの挿入
- 後期機械コードの最適化
- コードエミッション
新しいバックエンドを作成するために、3、7つのステップ
- ターゲットマシンの特性を記述するTargetMachineなどのクラスのサブクラスを作成します。
- 対象のレジスタセットを説明してください。
- ターゲットの命令セットを説明してください。
- ネイティブターゲット固有の命令に対する命令の有向非循環グラフ(DAG)表現からLLVM IRの選択および変換を記述する。
- ターゲット・マシン用のガスフォーマットにLLVM IRを変換し、アセンブリプリンタのコードを記述します。
- 必要に応じて、サブターゲットのサポートを追加します。
- 任意に、JITのサポートを追加し、メモリに直接バイナリコードを発するために使用されるマシンコードエミッタ(TargetJITInfoのサブクラス)を作成します。
これら三つのレベルは、LLVMバックエンドを調べるために異なる寸法であり、各寸法の自己完結型は、異なる寸法との対応関係が存在します。フォローアップにも記事がそれらの間の関係を分析する書き込みます。