8.6 --apcs=qualifier...qualifier

コードの生成時にインターワークおよび位置非依存を制御します。

--apcs コマンドラインオプションに修飾子を指定することにより、コンパイラによって使用される ARM アーキテクチャ向けプロシージャコール標準(AAPCS)のバリアントを定義できます。

構文

--apcs= qualifier ... qualifier
qualifier...qualifier によって修飾子のリストが表される場合、以下の規則が適用されます。
qualifier の各インスタンスは以下のいずれかにする必要があります。
/interwork
/nointerwork
このオプションを使用すると、ARM と Thumb のインターワークがサポートされたコードか、またはサポートされないコードが生成されます。デフォルトは /nointerwork です。ただし、ARMv5T 以降は例外で、この場合のデフォルトは /interwork です。
/ropi
/noropi
このオプションを使用すると、読み出し専用の位置非依存(ROPI)コードを生成するかどうかを指定できます。デフォルトは /noropi です。
/[no]pic/[no]ropi のエイリアスです。
/rwpi
/norwpi
このオプションを使用すると、読み出し/書き込みの位置非依存(RWPI)コードを生成するかどうかを指定できます。デフォルトは /norwpi です。
/[no]pid/[no]rwpi のエイリアスです。
/fpic
/nofpic
このオプションを使用すると、相対アドレス参照がプログラムをロードした場所に依存しない、読み出し専用の位置非依存コードを生成するかどうかを指定できます。
/hardfp
/softfp
ハードウェアまたはソフトウェアの浮動小数点リンケージを要求します。これによって、--fpu オプションを介して利用できる浮動小数点ハードウェアのバージョンとは別に、プロシージャコール標準を指定することができます。プロシージャコール標準は --fpu オプションを使用して指定することもできますが、--apcs の使用を推奨します。

最初の修飾子では、/ 接頭文字は省略できますが、同じ --apcs オプションでのそれ以降の修飾子を区切るには、必ず使用しなければなりません。例えば、--apcs=/nointerwork/noropi/norwpi は、--apcs=nointerwork/noropi/norwpi と同じ意味です。
単一の --apcs オプションまたは複数の --apcs オプションを使用して、複数の修飾子を指定できます。例えば、--apcs=/nointerwork/noropi/norwpi は、--apcs=/nointerwork --apcs=noropi/norwpi と同じ意味です。

デフォルト

--apcs オプションを指定しなかった場合、コンパイラは --apcs=/nointerwork/noropi/norwpi/nofpic が指定されたときと同じ処理を実行します。

使用法

/interwork
/nointerwork
デフォルトでは、以下のようにコードが生成されます。
  • インターワークがサポートされないコードがサポートされます。ARMv5T 以降のアーキテクチャに対応する --cpu オプションが指定されていない限りは、/nointerwork がデフォルトになります。
  • インターワークがサポートされたコードが生成されます。ARMv5T 以降では /interwork がデフォルトです。ARMv5T 以降のアーキテクチャでは、BLX などの命令やプログラムカウンタへのロード命令を使用したインターワークが直接サポートされます。
/ropi
/noropi
ROPI コードを生成するために /ropi 修飾子を選択すると、コンパイラは以下の処理を行います。
  • 読み出し専用コードおよびデータのアドレスを、PC 相対で生成します。
  • 読み出し専用の出力セクションに位置非依存(PI)属性を設定します。

C++ をコンパイルするときは、--apcs=/ropi はサポートされません。
/rwpi
/norwpi
RWPI コードを生成するために /rwpi 修飾子を選択すると、コンパイラは以下の処理を行います。
  • スタティックベースレジスタ sb からのオフセットを使用して、書き込み可能データをアドレス指定します。つまり、以下のことを意味します。
    • 実行時に RW データ領域のベースアドレスを修正できます。
    • データの複数のインスタンスを生成できます。
    • データを位置非依存データにすることができます(ただし、データを位置非依存データにする必要はありません)。
  • 読み出し/書き込み出力セクションに PI 属性を設定します。

デフォルトは --lower_rwpi オプションであるため、RWPI でないコードは、等価な RWPI のコードに自動的に変換されます。このスタティックな初期化は、実行時に C++ のコンストラクタメカニズムによって行われます(このメカニズムは C にも使用されます)。
/fpic
/nofpic
このオプションを選択すると、コンパイラは以下の処理を行います。
  • PC 相対アドレシングを使用してすべての静的データにアクセスします。
  • リンカによって作成されるグローバルオフセットテーブル(GOT)エントリを使用して、インポートまたはエクスポートされたすべての読み出し-書き込みデータにアクセスします。
  • すべての読み出し専用データへのアクセスを PC 相対で行います。
コードで共有オブジェクトを使用している場合、/fpic を指定してコンパイルする必要があります。コードで System V の共有ライブラリを使用している場合にのみ、相対アドレスが実装されます。
静的イメージまたは静的ライブラリをビルドする場合、/fpic を指定してコンパイルする必要はありません。
C++ をコンパイルするときに、/fpic を使用できます。この場合、仮想関数テーブルと typeinfo は、PC 相対でアクセスできるように読み出し-書き込み領域に配置されます。

System V または ARM Linux 共有ライブラリをビルドする場合には、--apcs /fpic--no_hide_all を一緒に使用します。
/hardfp
/hardfp を使用した場合、コンパイラは、ハードウェア浮動小数点リンケージ用のコードを生成します。ハードウェア浮動小数点リンケージは、FPU レジスタを使用して引数と戻り値を渡します。
以下に、--fpu が明示的または暗黙的に使用された場合の /hardfp の作用を示します。/hardfp が無視されることもあります。
/hardfp /softfp の 2 つの修飾子を同時に使用することはできません。
  • 浮動小数点サポートが無効である場合(--fpu=none が指定されている、または他の方法で禁止されているなど)、/hardfp は無視されます。
  • 浮動小数点サポートは有効だが、浮動小数点ハードウェアが伴わない場合(--fpu=softvfp)、/hardfp を指定するとエラーが発生します。
  • 浮動小数点ハードウェアが利用できる場合で、なおかつ hardfp の呼び出し規則が使用された場合(--fpu=vfp...)、/hardfp は無視されます。
  • 浮動小数点ハードウェアが存在する場合で、なおかつ softfp の呼び出し規則が使用された場合(--fpu=softvfp+vfp...)、/hardfp を指定するとエラーが発生します。
/softfp
/softfp を使用した場合、ソフトウェア浮動小数点リンケージが使用されます。ソフトウェア浮動小数点リンケージは、関数のパラメータと戻り値が r0r3 の ARM 整数レジスタおよびスタックを使用して渡されることを意味します。
以下に、--fpu が明示的または暗黙的に使用された場合の /softfp の作用を示します。 /hardfp の作用を示します。/hardfp が無視されることもあります。
/hardfp/softfp の 2 つの修飾子を同時に使用することはできません。
  • 浮動小数点サポートが無効である場合 (--fpu=none が指定されている、または他の方法で禁止されているなど)、 /softfp は無視されます。
  • 浮動小数点サポートは有効だが、浮動小数点ハードウェアが伴わない場合(--fpu=softvfp)、既に /softfp の状態になっているため、/softfp は無視されます。
  • 浮動小数点ハードウェアが存在する場合、/softfp を指定すると、softfp--fpu=softvfp+vfp...)の呼び出し規則が強制されます。

制約条件

/ropi/rwpi、または /fpic を使用してコードをコンパイルする場合には制限があります。
/ropi
/ropi を使用してコンパイルする場合の主な制限を以下に示します。
  • C++ をコンパイルするとき、--apcs=/ropi は使用できません。/ropi を使用してコンパイルできるのは、C++ の C サブセットのみです。
  • 正規の C の一部の構造を --apcs=/ropi でコンパイルすると、正しく機能しません。以下に例を示します。
    extern const int ci; // ro
    const int *p2 = &ci; // this static initialization
                         // does not work with --apcs=/ropi
    
    上記のようなスタティックな初期化を実行するには、 --lower_ropi オプションを使用してコードをコンパイルします。以下に例を示します。
    armcc --apcs=/ropi --lower_ropi
/rwpi
/rwpi を使用してコンパイルする場合の主な制限を以下に示します。
  • 正規の C の一部の構造を --apcs=/rwpi.以下に例を示します。
    int i;               // rw
    int *p1 = &i;        // this static initialization
                         // does not work with --apcs=/rwpi
                         // --no_lower_rwpi
    
    上記のようなスタティックな初期化を実行するには、 --lower_rwpi オプションを使用してコードをコンパイルします。以下に例を示します。
    armcc --apcs=/rwpi
    

    --lower_rwpi はデフォルトであるため、指定する必要はありません。
/fpic
/fpic を使用してコンパイルする場合の主な制限を以下に示します。
  • デフォルトでは、--apcs=/fpic を使用した場合、コンパイラは __declspec(dllexport) としてマークされた関数とデータのみをエクスポートします。
  • --apcs=/fpicno_hide_all を同じコマンドラインで使用した場合、 コンパイラは、__declspec(dll*) を使用しないすべての extern 変数と関数に対して、 デフォルトの ELF 動的可視性を使用します。デフォルトの ELF 可視性では関数の自動インラインは無効になります。
関連する概念
5.51 浮動小数点リンケージと浮動小数点計算のコンパイラオプション
5.42 デフォルトで選択されるハードウェアまたはソフトウェアによる浮動小数点サポート
関連する参考文書
8.88 --fpu=name コンパイラオプション
8.98 --hide_all、--no_hide_all
8.126 --lower_ropi、--no_lower_ropi
8.127 --lower_rwpi、--no_lower_rwpi
10.23 __declspec(dllexport)
関連情報
『Procedure Call Standard for the ARM Architecture』
ARM C ライブラリとマルチスレッド
BPABI および SysV の共有ライブラリと実行可能ファイル
ベニアの概要
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.