FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LLVM

LLVMのバックエンドを作るための第一歩 (6. ELFとリロケーションレコード)

LLVM Compiler Infrastructure LLVMのバックエンドにオリジナルターゲットアーキテクチャを追加していくプロジェクト、MYRISCVXターゲットアーキテクチャを追加したら、今度はELFの情報を追加する必要がある。 MYRISCVXはRISC-Vのオリジナル実装なんで、ELF…

LLVMのバックエンドを作るための第一歩 (5. 命令の定義)

LLVM Compiler Infrastructure LLVMバックエンドを追加するにあたり、MYRISCVXアーキテクチャを定義するためのtdファイルを作成する必要がある。 tdファイルはLLVMのバックエンドを定義するためのDSLで、バックエンドを理解するためには避けては通れないもの…

LLVMのバックエンドを作るための第一歩 (4. 命令フォーマットを定義する)

LLVM Compiler Infrastructure LLVMバックエンドを追加するにあたり、MYRISCVXアーキテクチャを定義するためのtdファイルを作成する必要がある。 tdファイルはLLVMのバックエンドを定義するためのDSLで、バックエンドを理解するためには避けては通れないもの…

LLVMのバックエンドを作るための第一歩 (3. Target Descriptionの記述してレジスタを定義する)

LLVM Compiler Infrastructure LLVMバックエンドを追加するにあたり、MYRISCVXアーキテクチャを定義するためのtdファイルを作成する必要がある。 tdファイルはLLVMのバックエンドを定義するためのDSLで、バックエンドを理解するためには避けては通れないもの…

LLVMのバックエンドを作るための第一歩 (2. LLVMバックエンドにターゲットアーキテクチャを登録する)

LLVM Compiler Infrastructure LLVMバックエンドを追加するにあたり、まずはLLVMに新しいバックエンドを登録する必要がある。 とりあえず、LLVMバックエンドがMYRISCVXアーキテクチャを認識できるようになりたい。そのために最低限追加すべきファイルについ…

LLVMのバックエンドを作るための第一歩 (1. LLVMバックエンドの仕組みとRISC-V基本情報)

LLVM Compiler Infrastructure LLVMのバックエンドに焦点を当て、オリジナルのアーキテクチャターゲットをLLVMに追加する。 オリジナルのアーキテクチャといっても、一から作ると仕様の部分まで作る必要があるし、またそういう部分で本書の説明を策必要が生…

オリジナルLLVM Backendを追加しよう (29. LLVMリグレッションテストの書き方)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io LLVMでのテスト記述とリグレッション LLVMのオリジナルのバックエンドを実装してきたが、いろんなソース…

オリジナルLLVM Backendを追加しよう (28. C++のサポート)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io C++のサポート LLVMでC++特殊な文法をサポートするためには、ポリフォーフィズムをサポートする必要があ…

オリジナルLLVM Backendを追加しよう (28. Intrinsicのサポート2)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第11章では、アセンブラやIntrinsicをサポートする。今度はC言語の中にIntrinsicを埋め込んだアセンブラ…

オリジナルLLVM Backendを追加しよう (27. Intrinsicのサポート)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第11章では、アセンブラやIntrinsicをサポートする。 具体的には、Intrinsic関数などのC言語の内部にア…

オリジナルLLVM Backendを追加しよう (26. ELFのサポートとobjdump)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第10章は、ELF形式のサポートと、objdumpコマンドを動かす。 まずは、ELFの形式をサポートする。ELFの形…

オリジナルLLVM Backendを追加しよう (25. 可変引数・動的スタック割り当て)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第9章の後半では、様々なイントリンジックを挿入する。 9.6.5 Function related Intrinsics support LLV…

オリジナルLLVM Backendを追加しよう (25. 可変引数・動的スタック割り当て)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第9章の後半では、可変長引数と、動的スタックの割り当てを実装する。 可変長引数のサポート 可変長引数…

オリジナルLLVM Backendを追加しよう (24. Tail call optimizationの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 関数コールの最適化の一つとして、Tail call optimization(末尾再帰呼び出し)を実装してみる。 ja.wikip…

オリジナルLLVM Backendを追加しよう (23. llvm-projectを使ってテスト環境を構築する)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 関数コールもかなり動くようになってきて、これまでに多くのテストパタンを確認してきたのだが、リグレ…

オリジナルLLVM Backendを追加しよう (23. 命令の定義からAsmPrinterへの変換プロセスまとめ)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io LLVMには独自のIRを定義できる仕組みがあり、それを使って命令を変換したりして最終的に命令を生成する…

オリジナルLLVM Backendを追加しよう (22. テスト環境の調査)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 関数コールもかなり動くようになってきて、これまでに多くのテストパタンを確認してきたのだが、リグレ…

オリジナルLLVM Backendを追加しよう (21. Function Callの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第9章は、関数コールの実装だ。関数コールの実装は量が多すぎてまだ理解が及んでいないが、とりあえずJu…

LLVM 8.0がリリースされたのでビルド試行とオリジナル実装の8.0への移行

releases.llvm.org LLVM 8.0がリリースされたので、さっそくダウンロードしてビルドしてみた。 これまで通り、GitHub経由でダウンロードしていたので、タグをrelease_80にアップデートするだけである。 $ cmake -G Ninja -DCMAKE_CXX_COMPILER=${HOME}/other…

オリジナルLLVM Backendを追加しよう (20. Conditional Moveの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第8章の後半は、Conditional Moveの実装を行っていく。 Cpu0のConditional Moveはどのように指定実装し…

オリジナルLLVM Backendを追加しよう (20. 制御構文の実装と最適化Passの追加)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 8.2 章 Long Branchのサポート 第8章の前半はLongBranchのサポート。これは読んでみたがあまりよく分か…

オリジナルLLVM Backendを追加しよう (19. 分岐命令の実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第8章は制御構文の追加。手始めにまずは分岐命令を実装していく。 分岐命令を生成させるためには、分岐…

オリジナルLLVM Backendを追加しよう (18. 様々なデータタイプの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第7章の残りに取り組む。 浮動小数点の実装はとりあえず省略。RISC-Vではclzもclo命令も存在しないので…

オリジナルLLVM Backendを追加しよう (17. 32-bitコアでの64bit整数演算の命令出力実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 32bit環境でのlong longの乗算についての実装を行っている。ISDで言うと所の、SMUL_LOHIとUMUL_LOHIの実…

オリジナルLLVM Backendを追加しよう (16. 32-bitコアでの64bit整数演算の命令出力調査)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第7章では、long long(64-bit)の対応も含まれている。解説の中では、MIPSのようなHIレジスタとLOレジス…

オリジナルLLVM Backendを追加しよう (15. int型以外の変数への対応)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第7章は、int型以外の各種変数型に対応させる。 github.com diff --git a/lib/Target/MYRISCVX/MYRISCVX…

オリジナルLLVM Backendを追加しよう (24. グローバル変数の対応)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第6章はグローバル変数をサポート。 グローバル変数のサポートには4種類があって、それぞれどのような処…

オリジナルLLVM Backendを追加しよう (23. オブジェクトファイル形式の対応)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io Chapter-5を進めていこう。これまではアセンブラ形式のみを対応させていたが、今度はオブジェクトファイ…

オリジナルLLVM Backendを追加しよう (22. 論理・比較バリエーションの拡充)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 Chapter-4.2のあたりを進めている。論理演算命令と比較命令だ。 比較命令をテストしようとすると、MYRISCVXの実装では命令の生成…

オリジナルLLVM Backendを追加しよう (21. 剰余演算の最適化と論理・比較命令の追加)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 資料としては Tutorial: Creating an LLVM Backend for the Cpu0 Architecture を使用している。やっとChapter-4だ。 DIV命令は…