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

IPO コンパイル中に実行される最適化には、コードレイアウトがあります。

IPO 解析は、IR が含まれたすべてのルーチンのレイアウト順序を確認します。1 つのオブジェクトが生成される場合、コンパイラーはルーチンを任意の順序でコンパイルすることでレイアウトを生成します。

マルチオブジェクト IPO コンパイルでは、コンパイラーはリンカーに任意の順序を伝える必要があります。最初に、コンパイラーは、各ルーチンを名前付きテキストセクションに格納します (名前付きテキストセクションは、プラットフォームによって異なります)。

Linux*:

Windows:

ただし、-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     :
{
*(.text00001) *(.text00002) *(.text00003) *(.text00004) *(.text00005)
*(.text00006) *(.text00007) *(.text00008) *(.text00009) *(.text00010)
*(.text00011) *(.text00012)
...

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

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