bfin-elf-gdb (sim)の挙動を追いかけてみる.
テスト環境はMacOS10.5.1.
6.5.50.20060805-cvs
$ /pizza/bin/bfin-elf-gdb --version
GNU gdb 6.5.50.20060805-cvs
(gdb) si 3 asm("r6=pack(r2.H, r2.L) || i1+=4 || nop; ": : :"R2", "R6", "I1"); (gdb) si Unhandled instruction "dregs = PACK (dregs_hi, dregs_lo)" ... aborting Illegal instruction $
ふむ.再現する.
とはいっても,これはPizzaFactory用に作ったuClinuxと公式CVS mainlineとのキメラ版.あまり参考にはならない.
gdb 6.6
それでは,ということで,toolchain-trunk-svn-1871をblackfin.uclinux.orgから取得,target=bfin-elfとしてビルド.
(gdb) si 3 asm("r6=pack(r2.H, r2.L) || i1+=4 || nop; ": : :"R2", "R6", "I1"); (gdb) si 4 return 0; (gdb)
おそらく期待通り.
そんなわけで
酔漢氏の観測結果と照らし合わせると,uClinuxのツールチェインは,target tripletの違いに関わらず該当のインストラクション列を解釈可能だが, sourceware.org の(公式の)CVS mainlineでは,何らかの問題を抱えている可能性が高い.
上記の問題とは別に,bfinのGDBには,下記のような問題が知られている.
CVS mainlineでは,まだbfinのシミュレータが存在しない.
また,uClinuxのGDBと公式のGDBでは,リモートプロトコルにおけるレジスタの扱いが異なる.
ざっと比較をしてみたところ,opcodes 辺りにも細かい差異があるようなので,sim 以外のところに原因がある可能性が高い.…ような気がする.
逃げ方
というわけで,bfinのGDBは頭痛のタネ満載*1.
Linux上でbfin-*-gdbを無難に使いこなすには,uClinux版のソースコードを持ってきて,自分でビルドすること.
え? 開発チームに参加する? そんなウルトラCは知りません.
*1:bfinに限らず,マイナーターゲットは多かれ少なかれ頭痛のタネがあるものですが.