というわけで、 やりました。 一日仕事だと推測したのは大体当たり。 実装は土曜日にほとんど済ませて、 日曜日はドキュメントの整備やメーリングリストへのアナウンスなど。 後はテストですね。
どう使うかは結構頑張ってマニュアル書いたので、 マニュアル見て下さい。
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は捨てだな。悪いけど。 サイズが増大すると致命的なプロジェクトもあるって、 認識してないのかねえ。