4.6 リンカフィードバックの使用例

これは、リンカフィードバックの動作例です。

手順

  1. この例に示すコードを含む fb.c という名前のファイルを作成します。
    #include <stdio.h>
    void legacy()
    {
        printf("This is a legacy function that is no longer used.\n");
    }
    int cubed(int i)
    {
        return i*i*i;
    }
    void main(void)
    {
        int n = 3;
        printf("%d cubed = %d\n",n,cubed(n));
    }
  2. 以下のコマンドラインを実行して、プログラムをコンパイルし、フィードバックファイルが存在しないことを示す警告メッセージは無視します。
    armcc --asm -c --feedback fb.txt fb.c
    これにより、デフォルトでは cubed() 関数がインライン展開され、アセンブラファイル fb.s とオブジェクトファイル fb.o が作成されます。アセンブラファイルには、legacy()cubed() のコードが残っていますが、インライン展開により、main から cubed() を呼び出すことはありません。
    cubed() のアウトオブラインコピーは、 static として宣言されていないため、保持されています。
  3. 以下のコマンドラインを実行して、オブジェクトファイルをリンクし、リンカフィードバックファイルを作成します。
    armlink --info sizes --list fbout1.txt --feedback fb.txt fb.o -o fb.axf
    リンカによる診断結果がファイル fbout1.txt に出力されます。
    リンカのフィードバックファイルは、(コンパイラで使用されない)コメントとして未使用の関数を含み、legacy() 関数と cubed() 関数のエントリを含んでいるソースファイルを特定します。以下に例を示します。
    ;#<FEEDBACK># ARM Linker, 5.01 [Build num]: Last Updated: Date
    ;VERSION 0.2
    ;FILE fb.o
    cubed <= USED 0
    legacy <= USED 0
    このフィードバックファイルは、2 つの関数が使用されていないことを示します。
  4. 以下のコマンドラインを実行し、別の診断ファイルを使用してコンパイルとリンクのステージを実行します。
    armcc --asm -c --feedback fb.txt fb.c
    armlink --info sizes --list fbout2.txt fb.o -o fb.axf
  5. 2 つの診断ファイル fbout1.txtfbout2.txt を比較し、イメージのコンポーネント(例えば、Code、RO Data、RW Data、ZI Data)のサイズを確認します。Code コンポーネントが小さくなります。
    アセンブラファイル fb.s 内では、legacy() 関数と cubed() 関数は、main() 関数と同じ領域に存在しなくなりました。これらの関数は関数独自の ELF セクションにコンパイルされます。したがって、 armlink は最終イメージから legacy() 関数と cubed() 関数を削除できます。

後発条件

リンカフィードバックを最大限に活用するには、完全なコンパイルとリンクを 2 回以上実行する必要があります。ただし、通常は、前回のビルドのフィードバックを使用して 1 回コンパイルしてリンクすれば十分です。
関連する概念
4.5 リンカフィードバックについて
関連する参考文書
12.57 --feedback=filename
12.58 --feedback_image=option
12.59 --feedback_type=type
12.71 --info=topic[,topic,…]
12.89 --list=filename
12.125 --scatter=filename
関連情報
--asm コンパイラオプション
-c コンパイラオプション
--feedback=filename コンパイラオプション
--inline、--no_inline コンパイラオプション
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.