リンク時最適化
ADSのリンカ
ARM純正のツールであるADS付属のリンカを実際に使ってみたが、特に未使用関数を削除している雰囲気はなかった。マニュアルを見てみたら、C++の仮想関数の削除をするらしい。一応コールグラフを表示させると、普通の関数でもUNUSEDのキーワードがついてるんだけどなあ。何か他にオプションがあるんだろうか。ファイルをまたがったインライン展開や、コンパイラへのフィードバックは見ていない。
GCC Link time optimization
ltoは数あるGCCのプロジェクトの中の1つで、2005年頃にアナウンスされたようだ。CodeSourceryの中の人たちが主に実装を担当しているようである。
ビルドして少しだけ使ってみた。configureオプションで
--enable-languages=lto
としてビルドすると、lto1が作成される。あとは
gcc -B. -flto hoge.c -o out
みたいな感じでコンパイルすればリンク時の最適化がかかる。1回ファイルごとにコンパイルして生成した中間オブジェクトファイルを、もう一度全て入力して最適化してるみたい。現在どこまで最適化の実装が進んでいるのかわからないが、開発が止まっているような雰囲気がある。まぁソースを見りゃいいんだけど…
LLVM
LLVMのリンカは、普通に未使用関数の削除をしてくれた。
リンク時の最適化なんて、LLVMにとっては大した特徴ではないのかもしれないが、サイズが小さくなる事は良い事だ(サイズだけじゃないけど)。すばらしい。
llvm-gcc --emit-llvm -c hoge1.c -o hoge1.o llvm-gcc --emit-llvm -c hoge2.c -o hoge2.o llvm-ld hoge1.c hoge2.c -o hoge llc hoge gcc hoge.s -o hogen