update
This commit is contained in:
parent
e4531a6c2a
commit
2cd669b5b0
@ -125,8 +125,8 @@ RegStateやframe index・register scavengerなどの説明が貴重。
|
|||||||
にて指摘されているように、商業的に成功しなかったバックエンドほどコードが単純で分かりやすい。]。
|
にて指摘されているように、商業的に成功しなかったバックエンドほどコードが単純で分かりやすい。]。
|
||||||
* Sparc
|
* Sparc
|
||||||
** <<llvm-writing_backend>>でも説明に使われており、コメントが豊富。
|
** <<llvm-writing_backend>>でも説明に使われており、コメントが豊富。
|
||||||
* NEC SX-Aurora VE
|
* M68k<<llvm_phabricator-d95315>>
|
||||||
** 最近(2019年)追加された<<llvm_phabricator-d69103>>バックエンド。新し目のLLVMにバックエンドを追加する例として貴重。
|
** 最近(2021年)追加された<<llvm_phabricator-d95315>>バックエンド。新し目のLLVMにバックエンドを追加する例として貴重。
|
||||||
* C-SKY<<github_csky>>
|
* C-SKY<<github_csky>>
|
||||||
** 最近(2020年)追加された<<llvm_phabricator-d86269>>バックエンド。新し目のLLVMにバックエンドを追加する例として貴重。
|
** 最近(2020年)追加された<<llvm_phabricator-d86269>>バックエンド。新し目のLLVMにバックエンドを追加する例として貴重。
|
||||||
* x86
|
* x86
|
||||||
@ -721,57 +721,62 @@ $ bin/llvm-mc -arch=cahpv4 -filetype=obj foo.s | od -tx1z -Ax -v
|
|||||||
....
|
....
|
||||||
|
|
||||||
0x34から0x3dにある `08 10 61 00 ...` が出力であり、
|
0x34から0x3dにある `08 10 61 00 ...` が出力であり、
|
||||||
正しく生成されていることが分かりますfootnote::[このアセンブリはcahpv4-simのテストと
|
正しく生成されていることが分かりますfootnote:[このアセンブリはcahpv4-simのテストと
|
||||||
同じものになっているので、cahpv4-simのテストと比較することで正しいかを(ある程度)判断できます。]。
|
同じものになっているので、cahpv4-simのテストと比較することで正しいかを(ある程度)判断できます。]。
|
||||||
|
|
||||||
== !!!ここより下はまだ書き直されていません!!!
|
=== `CAHPV4InstPrinter` を実装する
|
||||||
|
|
||||||
=== `CAHPInstPrinter` を実装する
|
https://github.com/virtualsecureplatform/llvm-cahp/commit/bc9465e32f41842ea6cc5796f166fe594635c830[bc9465e32f41842ea6cc5796f166fe594635c830]
|
||||||
|
|
||||||
https://github.com/virtualsecureplatform/llvm-cahp/commit/aa66568c3dfe1d80a83a96bd0437a26fdb96872a[aa66568c3dfe1d80a83a96bd0437a26fdb96872a]
|
|
||||||
|
|
||||||
次の節では、上記までで作成したアセンブラのテストを記述します。
|
次の節では、上記までで作成したアセンブラのテストを記述します。
|
||||||
その際、アセンブリを `MCInst` に変換した上でそれをアセンブリに逆変換したものが、
|
その際、アセンブリを `MCInst` に変換した上でそれをアセンブリに逆変換したものが、
|
||||||
もとのアセンブリと同じであるか否かをチェックします。
|
もとのアセンブリと同じであるか否かをチェックします。
|
||||||
このテストを行うためには `MCInst` からアセンブリを得るための仕組みが必要です。
|
このテストを行うためには `MCInst` からアセンブリを得るための仕組みが必要です。
|
||||||
この節ではこれを行う `CAHPInstPrinter` クラスを実装します。
|
この節ではこれを行う `CAHPV4InstPrinter` クラスを実装します。
|
||||||
<<github_riscv-llvm_patch_08>>を参考にします。
|
<<github_riscv-llvm_patch_08>>を参考にします。
|
||||||
|
|
||||||
`InstPrinter` ディレクトリを作成し `InstPrinter/CAHPInstPrinter.{cpp,h}` を作成します。
|
`InstPrinter` ディレクトリを作成し `MCTargetDesc/CAHPV4InstPrinter.{cpp,h}` を作成します。
|
||||||
命令印字処理の本体は `CAHPInstPrinter::printInst` ですが、
|
命令印字処理の本体は `CAHPV4InstPrinter::printInst` ですが、
|
||||||
そのほとんどの処理は `CAHPInstPrinter::printInstruction` というTableGenが生成する
|
そのほとんどの処理は `CAHPV4InstPrinter::printInstruction` というTableGenが生成する
|
||||||
メンバ関数により実行されます。 `CAHPInstPrinter::printRegName` はレジスタ名を
|
メンバ関数により実行されます。 `CAHPV4InstPrinter::printRegName` はレジスタ名を
|
||||||
出力する関数で `CAHPInstPrinter::printOperand` から呼ばれますが、
|
出力する関数で `CAHPV4InstPrinter::printOperand` から呼ばれますが、
|
||||||
これも `CAHPInstPrinter::getRegisterName` という自動生成された
|
これも `CAHPV4InstPrinter::getRegisterName` という自動生成された
|
||||||
メンバ関数に処理を移譲します。この `CAHPInstPrinter::getRegisterName` の第二引数に
|
メンバ関数に処理を移譲します。この `CAHPV4InstPrinter::getRegisterName` の第二引数に
|
||||||
何も渡さなければ(デフォルト引数 `CAHP::ABIRegAltName` を利用すれば)
|
`CAHPV4::ABIRegAltName` を渡すと、TableGenで定義したAltNameが出力に使用されますfootnote:[この場合
|
||||||
TableGenで定義したAltNameが出力に使用されますfootnote:[この場合
|
|
||||||
`AltNames` が指定されていないレジスタ(条件分岐のためのフラグなど)があるとエラーとなります。
|
`AltNames` が指定されていないレジスタ(条件分岐のためのフラグなど)があるとエラーとなります。
|
||||||
アセンブリ中に表示され得ないレジスタにもダミーの名前をつける必要があります。]。
|
アセンブリ中に表示され得ないレジスタにもダミーの名前をつける必要があります。]。
|
||||||
// FIXME: 要調査:x86のEFLAGSの名前取っ払ったらエラーになるのか?
|
// FIXME: 要調査:x86のEFLAGSの名前取っ払ったらエラーになるのか?
|
||||||
`CAHP::NoRegAltName` を渡すと本来の名前(CAHPでは `x0` 〜 `x15` )が使用されます。
|
`CAHPV4::NoRegAltName` を渡すと本来の名前(CAHPV4では `x0` 〜 `x32` )が使用されます。
|
||||||
|
|
||||||
`CAHPInstPrinter` クラスは `MCTargetDesc/CAHPMCTargetDesc.cpp` にて作成・登録されます。
|
`CAHPV4InstPrinter` クラスは `MCTargetDesc/CAHPV4MCTargetDesc.cpp` にて作成・登録されます。
|
||||||
|
|
||||||
節の冒頭で説明した「アセンブリを `MCInst` に変換した上でそれをアセンブリに逆変換」は
|
節の冒頭で説明した「アセンブリを `MCInst` に変換した上でそれをアセンブリに逆変換」は
|
||||||
`llvm-mc` の `-show-encoding` オプションを用いて行うことができます。
|
`llvm-mc` の `-show-encoding` オプションを用いて行うことができます。
|
||||||
`-show-encoding` を指定することよって当該アセンブリがどのような機械語に
|
`-show-encoding` を指定することよって当該アセンブリがどのような機械語に
|
||||||
翻訳されるか確認することができます。
|
翻訳されるか確認することができます。
|
||||||
// FIXME: 要修正:RV32KのものなのでCAHPではない。
|
// FIXME: 要修正:RV32KのものなのでCAHPV4ではない。
|
||||||
|
|
||||||
....
|
....
|
||||||
$ cat foo.s
|
# 前の節と同じfoo.sを使用
|
||||||
// FIXME
|
$ bin/llvm-mc -arch=cahpv4 -show-encoding foo.s
|
||||||
|
.text
|
||||||
$ bin/llvm-mc -arch=rv32k -show-encoding foo.s
|
add x1, x2, x3 # encoding: [0x08,0x10,0x61,0x00]
|
||||||
.text
|
add x16, x17, x18 # encoding: [0x08,0x88,0x50,0x02]
|
||||||
li x9, 3 # encoding: [0x8d,0x44]
|
sub x1, x2, x3 # encoding: [0x18,0x10,0x61,0x00]
|
||||||
mv x11, x1 # encoding: [0x86,0x85]
|
xor x1, x2, x3 # encoding: [0x28,0x10,0x61,0x00]
|
||||||
sub x9, x10 # encoding: [0x89,0x8c]
|
or x1, x2, x3 # encoding: [0x38,0x10,0x61,0x00]
|
||||||
add x8, x1 # encoding: [0x06,0x94]
|
|
||||||
nop # encoding: [0x01,0x00]
|
|
||||||
....
|
....
|
||||||
|
|
||||||
|
[NOTE]
|
||||||
|
====
|
||||||
|
`InstPrinter` は、以前はそれ専用のディレクトリを作成してコードを記述していましたが、
|
||||||
|
バックエンドによっては不都合があるということで `MCTargetDesc` ディレクトリに配置する形に
|
||||||
|
変更されました<<github_llvm_00ecf67045231743ef58950f3d3f4fbe450b8e0a>>。
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
== !!!ここより下はまだ書き直されていません!!!
|
||||||
|
|
||||||
=== テストを書く
|
=== テストを書く
|
||||||
|
|
||||||
https://github.com/virtualsecureplatform/llvm-cahp/commit/c8bbf894c7ba046ddd3f55677f2d4512dd944aa0[c8bbf894c7ba046ddd3f55677f2d4512dd944aa0]
|
https://github.com/virtualsecureplatform/llvm-cahp/commit/c8bbf894c7ba046ddd3f55677f2d4512dd944aa0[c8bbf894c7ba046ddd3f55677f2d4512dd944aa0]
|
||||||
|
2
ref.adoc
2
ref.adoc
@ -170,3 +170,5 @@
|
|||||||
- [[[github_csky,167]]] https://github.com/c-sky
|
- [[[github_csky,167]]] https://github.com/c-sky
|
||||||
- [[[llvm_phabricator-d69103,168]]] https://reviews.llvm.org/D69103
|
- [[[llvm_phabricator-d69103,168]]] https://reviews.llvm.org/D69103
|
||||||
- [[[llvm_phabricator-rG9218ff50f93085d0a16a974db28ca8f14bc66f64,169]]] https://reviews.llvm.org/rG9218ff50f93085d0a16a974db28ca8f14bc66f64
|
- [[[llvm_phabricator-rG9218ff50f93085d0a16a974db28ca8f14bc66f64,169]]] https://reviews.llvm.org/rG9218ff50f93085d0a16a974db28ca8f14bc66f64
|
||||||
|
- [[[llvm_phabricator-d95315,170]]] https://reviews.llvm.org/D95315
|
||||||
|
- [[[github_llvm_00ecf67045231743ef58950f3d3f4fbe450b8e0a,171]]] https://github.com/llvm/llvm-project/commit/00ecf67045231743ef58950f3d3f4fbe450b8e0a
|
||||||
|
Loading…
Reference in New Issue
Block a user