というわけで、 やりました。 一日仕事だと推測したのは大体当たり。 実装は土曜日にほとんど済ませて、 日曜日はドキュメントの整備やメーリングリストへのアナウンスなど。 後はテストですね。
どう使うかは結構頑張ってマニュアル書いたので、 マニュアル見て下さい。
GCC 3.4だと、 GRUBがでかくなり過ぎる とJeroenが言っていたので、 GCC 3.3.2から生成されたオブジェクト・ファイルをしこしこ読んだり、 こういうええ加減なRubyスクリプト
name = nil count = 0 while l = gets if /^[0-9a-f]+\s+<(.+)>:/ =~ l name = $1 count = 0 elsif name and /^\s+[0-9a-f]+:\s*((\s[a-f0-9]{2})+)/ =~ l code = $1 count += code.split(/\s/).size() elsif /^\s*$/ =~ l print name, "\t", count, "\n" if name name = nil end end print name, "\t", count, "\n" if name
で、objdumpの出力から関数毎のコードサイズを一覧にしたりして、 比較しました。 要するに、どこがどう大きくなっているのか調べたわけです。
結局本当に一部の関数(特にnext_partition
)だけが
やたら大きいことに気づいて、
GCCのバグだと確信できました。
レポート用に再現可能な小さいソースを作ったりして、
報告しました。
でも、一応これ、もう本家では直っていて、3.5.0で対応するのだと。 何で単なるバグ潰しなのに、次のメジャーリリース待ちなの? かなり大きな変更を必要とするのかなあ? いまいちGCCのポリシーが私にはよう分かりません。 私の場合、相当量の変更が必要でも、 バグ潰しならどんどん適用しちゃうんで。
これでGCC 3.4.xは捨てだな。悪いけど。 サイズが増大すると致命的なプロジェクトもあるって、 認識してないのかねえ。