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のシミュレータが存在しない.
また,uClinuxGDBと公式のGDBでは,リモートプロトコルにおけるレジスタの扱いが異なる.


ざっと比較をしてみたところ,opcodes 辺りにも細かい差異があるようなので,sim 以外のところに原因がある可能性が高い.…ような気がする.

逃げ方

というわけで,bfinのGDBは頭痛のタネ満載*1
Linux上でbfin-*-gdbを無難に使いこなすには,uClinux版のソースコードを持ってきて,自分でビルドすること.


え? 開発チームに参加する? そんなウルトラCは知りません.

*1:bfinに限らず,マイナーターゲットは多かれ少なかれ頭痛のタネがあるものですが.