[ TOP | Recently ]

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