コードレイアウトおよびマルチオブジェクト IPO の理解

IPO コンパイル中に実行される最適化には、コードレイアウトがあります。複数ファイルの IPO 中にコンパイラーが行う解析により、中間表現 (IR) 情報が含まれたすべてのルーチンのレイアウト順序が特定されます。マルチオブジェクト IPO コンパイルでは、コンパイラーはリンカーに任意の順序を伝える必要があります。

リンク段階で実行ファイルを生成する場合は、コンパイラーはこれをすべて自動で行います。しかし、実行ファイルではなくオブジェクト・ファイルを生成する場合は、コンパイラーはレイアウトスクリプトを生成します。これには、実行ファイルを作成する際に、実行ファイルを最適にリンクするのに必要な正しい情報が含まれています。

このリンクツールのスクリプトは、-ipo-c または -ipo-S (Linux) のいずれか、あるいは /Qipo-c または /Qipo-S (Windows) のいずれかを使用する場合に考慮する必要があります。これらのオプションを使用した場合、IPO コンパイルと実際のリンクでは異なるコンパイラーの呼び出しが行われます。この場合、コンパイラーは明示的なリンカースクリプト ipo_layout.script を生成していることを示すメッセージを表示します。

Windows リンカー (link.exe) は、これらのセクションを任意の順序で辞書的に自動で並べ替えます。

最初に、コンパイラーは、各ルーチンを名前付きテキストセクションに格納します (名前付きテキストセクションは、プラットフォームによって異なります)。

Windows:

Linux:

ipo_layout.script が生成される際、スクリプトを使用してコードレイアウトを最適化する場合は、リンクコマンドを変更します。

--script=ipo_layout.script

アプリケーションですでにカスタム・リンカー・スクリプトを使用している場合は、ipo_layout.script の内容をそのスクリプトに追加することができます。

レイアウト順序は、ipo_layout.script.text セクションの最初に記述されています。例えば、12 個のルーチンのレイアウト順序は次のとおりです。

出力例

.text     :
{
*(.text00001) *(.text00002) *(.text00003) *(.text00004) *(.text00005)
*(.text00006) *(.text00007) *(.text00008) *(.text00009) *(.text00010)
*(.text00011) *(.text00012)
...

他のリンカースクリプトが必要なアプリケーションには、.text セクションの記述をカスタム・リンカー・スクリプトに追加することができます。これらの記述をリンカースクリプトに追加する場合は、今後の開発を考慮してエントリーを余分に追加することが望ましいでしょう。"*(...)" 構文は、余分に追加したエントリーをオプションとして処理するため、エントリーを余分に追加しても問題ありません。

アプリケーションでリンカースクリプトを使用しない場合、アプリケーションはビルドされますが、レイアウト順序はランダムになります。リンカースクリプトを使用しない場合は、特に大きなアプリケーションのパフォーマンスに悪影響を与える可能性があります。