--apcs=qualifer...qualifier

このオプションを使用すると、コードの生成時にインターワークおよび位置非依存を制御できます。

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

Show/hide構文

--apcs=qualifer...qualifier

qualifier...qualifier によって修飾子のリストが表される場合、以下の規則が適用されます。

  • 少なくとも 1 つの修飾子を指定する必要があります。

  • リストの修飾子間にはスペースを挿入しないで下さい。

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 の使用を推奨します。

Note

また、複数の修飾子を指定することもできます。例えば、--apcs=/nointerwork/noropi/norwpi は、--apcs=/nointerwork --apcs=noropi/norwpi と同じ意味です。

Show/hideデフォルト

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

Show/hide使用法

/interwork, /nointerwork

デフォルトでは、以下のようにコードが生成されます。

  • インターワークがサポートされないコードがサポートされます。ARMv5T 以降のアーキテクチャに対応する --cpu が指定されていない限りは、/nointerwork がデフォルトになります。

  • インターワークがサポートされたコードが生成されます。ARMv5T 以降では /interwork がデフォルトです。ARMv5T 以降のアーキテクチャでは、BLX などの命令やプログラムカウンタへのロード命令を使用したインターワークが直接サポートされます。

/ropi, /noropi

ROPI コードを生成するために /ropi 修飾子を選択すると、コンパイラは以下の処理を行います。

  • 読み出し専用コードおよびデータのアドレスを、PC 相対で生成します。

  • 読み出し専用の出力セクションに位置非依存(PI)属性を設定します。

Note

C++ をコンパイルするときは、--apcs=/ropi はサポートされません。

/rwpi, /norwpi

RWPI コードを生成するために /rwpi 修飾子を選択すると、コンパイラは以下の処理を行います。

  • スタティックベースレジスタ sb からのオフセットを使用して、書き込み可能データをアドレス指定します。つまり、以下のことを意味します。

    • 実行時に RW データ領域のベースアドレスを修正できます。

    • データの複数のインスタンスを生成できます。

    • データを位置非依存データにすることができます(ただし、データを位置非依存データにする必要はありません)。

  • 読み出し/書き込み出力セクションに PI 属性を設定します。

Note

デフォルトは --lower_rwpi オプションであるため、RWPI でないコードは、等価な RWPI のコードに自動的に変換されます。このスタティックな初期化は、実行時に C++ のコントラクタメカニズムによって行われます(このメカニズムは C にも使用されます)。

/fpic, /nofpic

このオプションを選択すると、コンパイラは以下の処理を行います。

  • PC 相対アドレシングを使用してすべての静的データにアクセスします。

  • リンカによって作成されるグローバルオフセットテーブル(GOT)エントリを使用して、インポートまたはエクスポートされたすべての読み出し-書き込みデータにアクセスします。

  • すべての読み出し専用データへのアクセスを PC 相対で行います。

コードで共有オブジェクトを使用している場合、/fpic を指定してコンパイルする必要があります。コードで System V の共有ライブラリを使用している場合にのみ、相対アドレスが実装されます。

静的イメージまたは静的ライブラリをビルドする場合、/fpic を指定してコンパイルする必要はありません。

C++ をコンパイルするときに、/fpic を使用できます。この場合、仮想関数テーブルと typeinfo は、PC 相対でアクセスできるように読み出し-書き込み領域に配置されます。

Note

System V または ARM Linux 共有ライブラリをビルドする場合には、--apcs /fpic--no_hide_all を一緒に使用します。

/hardfp

/hardfp を使用した場合、コンパイラは、ハードウェア浮動小数点リンケージ用のコードを生成します。ハードウェア浮動小数点リンケージは、FPU レジスタを使用して引数と戻り値を渡します。

以下に、--fpu が明示的または暗黙的に使用された場合の /hardfp の作用を示します。/hardfp が無視されることもあります。

  • 浮動小数点サポートが無効である場合(--fpu=none が指定されている、または他の方法で禁止されているなど)、/hardfp は無視されます。

  • 浮動小数点サポートは有効だが、浮動小数点ハードウェアが伴わない場合(--fpu=softvfp)、/hardfp を指定するとエラーが発生します。

  • 浮動小数点ハードウェアが利用できる場合で、なおかつ hardfp の呼び出し規則が使用された場合(--fpu=vfp...)、/hardfp は無視されます。

  • 浮動小数点ハードウェアが存在する場合で、なおかつ softfp の呼び出し規則が使用された場合(--fpu=softvfp+vfp...)、/hardfp を指定するとエラーが発生します。

/hardfp /softfp の 2 つの修飾子を同時に使用することはできません。

/softfp

/softfp を使用した場合、ソフトウェア浮動小数点リンケージが使用されます。ソフトウェア浮動小数点リンケージは、関数のパラメータと戻り値が r0r3 の ARM 整数レジスタおよびスタックを使用して渡されることを意味します。

以下に、--fpu が明示的または暗黙的に使用された場合の /softfp の作用を示します。/softfp が無視されることもあります。

  • 浮動小数点サポートが無効である場合(--fpu=none が指定されている、または他の方法で禁止されているなど)、/softfp は無視されます。

  • 浮動小数点サポートは有効だが、浮動小数点ハードウェアが伴わない場合(--fpu=softvfp)、既に /softfp の状態になっているため、/softfp は無視されます。

  • 浮動小数点ハードウェアが存在する場合、/softfp を指定すると、softfp--fpu=softvfp+vfp...)の呼び出し規則が強制されます。

/hardfp /softfp の 2 つの修飾子を同時に使用することはできません。

Show/hide制約条件

/ropi/rwpi/fpic のいずれかを指定してコードをコンパイルする場合、いくつかの制限が適用されます。

/ropi

/ropi を使用してコンパイルする場合の主な制限を以下に示します。

  • C++ をコンパイルするとき、--apcs=/ropi は使用できません。/ropi を使用してコンパイルできるのは、C++ の C サブセットのみです。

  • 正規の C の一部の構造を --apcs=/ropi でコンパイルすると、正しく機能しません。以下に例を示します。

    extern const int ci; // ro
    const int *p2 = &ci; // この静的な初期化は
                         // --apcs=/ropi では機能しません
    

    上記のような静的初期化を実行するには、--lower_ropi オプションを使用してコードをコンパイルします。以下に例を示します。

    armcc --apcs=/ropi --lower_ropi
    
/rwpi

/rwpi を使用してコンパイルする場合の主な制限を以下に示します。

  • 正規の C の一部の構造を --apcs=/rwpi でコンパイルすると、正しく機能しません。以下に例を示します。

    int i;               // rw
    int *p1 = &i;        // この静的な初期化は
                         // --apcs=/rwpi
                         // --no_lower_rwpi では機能しません
    

    上記のような静的初期化を実行するには、--lower_rwpi オプションを使用してコードをコンパイルします。以下に例を示します。

    armcc --apcs=/rwpi
    

    Note

    --lower_rwpi はデフォルトであるため、指定する必要はありません。

/fpic

/fpic を使用してコンパイルする場合の主な制限を以下に示します。

  • デフォルトでは、--apcs=/fpic を使用した場合、コンパイラは __declspec(dllexport) としてマークされた関数とデータのみをエクスポートします。

  • --apcs=/fpic--no_hide_all を同じコマンドラインで使用した場合、コンパイラは、__declspec(dll*) を使用しないすべての extern 変数と関数に対して、デフォルトの ELF 動的可視性を使用します。デフォルトの ELF 可視性では関数の自動インラインは無効になります。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711