IPO コンパイル中に実行される最適化には、コードレイアウトがあります。
IPO 解析は、IR が含まれたすべてのルーチンのレイアウト順序を確認します。1 つのオブジェクトが生成される場合、コンパイラーはルーチンを任意の順序でコンパイルすることでレイアウトを生成します。
マルチオブジェクト IPO コンパイルでは、コンパイラーはリンカーに任意の順序を伝える必要があります。最初に、コンパイラーは、各ルーチンを名前付きテキストセクションに格納します (名前付きテキストセクションは、プラットフォームによって異なります)。
1 番目のルーチンを .text00001、2 番目のルーチンを .text00002 に格納します。次に、コンパイラーはリンカースクリプトを生成します。このスクリプトは、リンカーが .text00001、.text00002 という順序でリンクを行うように指示します。
1 番目のルーチンを .text$00001、2 番目のルーチンを .text$00002 に格納します。Windows リンカー (link) は、これらのセクションを任意の順序で自動的に並べ替えます。
ただし、-ipo-c または -ipo-S (Linux) あるいは /Qipo-c または /Qipo-S (Windows) が使用される場合、リンカースクリプトを考慮する必要があります。
これらのオプションを使用した場合、IPO コンパイルと実際のリンクでは異なるコンパイラーの呼び出しが行われます。この場合、コンパイラーは明示的なリンカースクリプト ipo_layout.script を生成していることを示すメッセージを表示します。
通常、生成されたスクリプト ipo_layout.script を使用するには link コマンドを変更します。
例 |
---|
--script=ipo_layout.script |
アプリケーションで既にカスタム・リンカー・スクリプトを使用している場合は、ipo_layout.script の内容をそのスクリプトに追加することができます。
レイアウト順序は、ipo_layout.script の .text セクションの最初に記述されています。例えば、12 個のルーチンのレイアウト順序は次のとおりです。
出力例 |
---|
.text : |
他のリンカースクリプトが必要なアプリケーションには、.text セクションの記述をカスタム・リンカー・スクリプトに追加することができます。これらの記述をリンカースクリプトに追加する場合は、今後の開発を考慮してエントリーを余分に追加することが望ましいでしょう。"*(...)" 構文は、余分に追加したエントリーをオプションとして処理するため、エントリーを余分に追加しても問題ありません。
アプリケーションでリンカースクリプトを使用しない場合、アプリケーションはビルドされますが、レイアウト順序はランダムになります。リンカースクリプトを使用しない場合は、特に大きなアプリケーションのパフォーマンスに悪影響を与える可能性があります。