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

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

マルチオブジェクト IPO コンパイルでは、コンパイラはリンカに任意の順序を渡す必要があります。最初に、コンパイラは各ルーチンを、名前が付けられたテキストのセクションに格納します (例えば、1 番目のルーチンは .text00001、2 番目のルーチンを .text00002)。次に、コンパイラはリンカ・スクリプトを生成します。このスクリプトは、リンカが .text00001.text00002 という順序でリンクを行うように指示します。リンク時のコンパイルと最後のリンクで同じ呼び出しが使用される場合、リンクは透過的に行われます。

ただし、-ipo_c または -ipo_S が使用される場合、リンカ・スクリプトを考慮する必要があります。これらのスイッチを使用した場合、IPO コンパイルと実際のリンクは異なる呼び出しで行われます。この場合、コンパイラは明示的なリンカ・スクリプト ipo_layout.script を生成していることを示すメッセージを表示します。

通常、生成されたスクリプト 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 セクションの記述をカスタム・リンカ・スクリプトに追加することができます。これらの記述をリンカ・スクリプトに追加する場合は、今後の開発を考慮してエントリを余分に追加することが望ましいでしょう。"*(...)" 構文は、余分に追加したエントリをオプションとして処理するため、問題ありません。

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