PIC (位置独立コード) としてコンパイルすると 70 ~ 80% 遅くなるコードを扱っており、問題を軽減する方法を探しています。問題の大部分は、gcc がすべての単一関数に以下を挿入することを主張していることです。
call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
それが関数の内容の 20% になったとしても。現在、ebx
は呼び出し保存レジスタであり、関連する変換単位 (ソース ファイル) 内のすべてstatic
の関数が GOT のアドレスをロードしており、変換単位の外部から関数を呼び出すことができないことを簡単に検出できます (それらのアドレスは取ったことはない)。では、なぜ gcc は大きな外部リンケージ関数の最初に 1 回だけロードして、GOT のアドレスが既にロードされているebx
と想定するように静的リンケージ関数を生成できないのでしょうか? ebx
すべてが外部関数にインライン化されるようにインライン制限を非常に高くする以外に、gcc にこの明白で大規模な最適化を強制するために使用できる最適化フラグはありますか?