1999-06-26 printf と egcs。egcs の mips-sony-netbsd patch
昨日の
real mem = 008 avail mem = 004
とかの、printf の %d の表示が腐ってるのを調べることにする。
ためしに mach_init() の最初のほう (consinit() はし終わってる) で、
printf("%d\n",12345678);
とかやっても、
008
と表示される。豪謎。
printf の varargs がらみかな、とか思って、kern/subr_prf.c の %d で拾ってるところで
自前 itoa して puts。ちゃんと拾えてる...違うのか。
さらに追う。
case DEC: /* many numbers are 1 digit */ while (_uquad >= 10) { *--cp = to_char(_uquad % 10); _uquad /= 10; } *--cp = to_char(_uquad); break;
ここか? 10進変換部分。前後に自前 puts を仕込むと....
なんか 0x01f00000 を 10 で割った結果が 0 になってるんですけど...
gcc のバグですか? それとも僕の make ミスですか?
quad_t だし、なんかそんなかんじだよなぁ...
「七度デバッグして人を疑え」ってのは祝一平の言葉だっけか...。
しかし二回デバッグしただけで gcc を疑うことにする :P
だって最近の gcc/egcs って信頼でき(以下略)
って、気づいたら今使ってた mips-sony-netbsd-gcc は 2.7.2.2 だった(古すぎ)。
一年前に作ったまんまだったのか...。せっかくなので egcs にしよう。
#さくさく binutils と egcs を make する。時間かかりまくり。う〜。
* * *
できあがった egcs で試す。今度はコンパイルエラーが...なぜぇ?
/usr/local/mips-sony-netbsd/include を 1.4 に合わせてなかったみたいだ。
うぐぅ
rsync -av /usr/src/include /usr/local/mips-sony-netbsd/ rsync -av /usr/src/sys/sys /usr/local/mips-sony-netbsd/include/ rsync -av /usr/src/sys/arch/mips/include/ /usr/local/mips-sony-netbsd/include/mips rsync -av /usr/src/sys/arch/newsmips/include/ /usr/local/mips-sony-netbsd/include/machine
う、まだ LEAF() のマクロがラベルに "_" を付けやがる...
なぜか __NO_LEADING_UNDERSCORES__ が pre-define されてないぞ。なぜだ...うぅぅ。
gcc/config/mips/netbsd.h にはあるのに...
再度 make。
* * *
それでも undefined symbol bzero ... って、なぜ?
gcc -E で見ても systm.h で define bzero memset してるのに...と思ったら、
gcc が bzero なコードを吐いてる...。うがー。
gcc/config/mips.h に #define TARGET_MEM_FUNCTIONS を付け加える。
再度 make。
* * *
はぅ。やっと link できた...平和が戻る。
* * *
って案の定 printf も修った...。
が、こんどは他の個所の動作が変だ...
どうやら gcc が endian little らしい?
もー gcc を make するの嫌だよ、っつっても -EB だけじゃ変わらず。
うー。また make しなおしか...
* * *
やっと修った。printf も動く。その他もちゃんと動く。
はぁ〜。
丸24時間つぶれたよ。くそー。他にもやんなきゃいけないことたくさんあるんだけどなぁ...
七度デバッグしてコンパイラを疑おう。
おまけ。egcs-19990623のmips-sony-netbsd化patch
EOF