[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.15 位置独立コード

このセクションでは、位置独立コード(Position Independent Code, PIC)の生成を 実装する手助けをするマクロを説明する。以下のマクロを単に定義するだけでは、 正しい PIC を生成するには十分ではない。 マクロ、GO_IF_LEGITIMATE_ADDRESSPRINT_OPERAND_ADDRESSLEGITIMIZE_ADDRESS についてもサポートを追加しなければならない。 ‘movsi’ の入力オペランドがシンボルで表されたアドレスを含んでいる時に 適切な処理を行なうように、‘movsi’ の定義を修正しなければならない。 また、switch 文の扱いを、相対アドレスを使うように書き換える必要もある。

PIC_OFFSET_TABLE_REGNUM

メモリ中の静的なデータアドレスのテーブルを参照するのに使うレジスタの 番号である。場合によっては、このレジスタはプロセッサの 「アプリケーションバイナリインターフェース」(ABI) で定義されることもある。 このマクロが定義されていると、このレジスタの RTL は一回だけ生成される。 これは、スタックポインタやフレームポインタレジスタの場合と同じである。 このマクロが定義されていない場合は、必要に応じてこのようなレジスタを 割り当てるのは機種依存ファイルの責任である。

PIC_OFFSET_TABLE_REG_CALL_CLOBBERED

PIC_OFFSET_TABLE_REGNUM で定義されるレジスタが、関数呼び出しに より破壊されるならこのマクロを定義する。 PIC_OFFSET_TABLE_REGNUM が定義されていない場合は、このマクロは 定義しないこと。

FINALIZE_PIC

位置独立コードを生成することにより、二つの異なったプログラム(AとB)が 共通のライブラリ(libC.a) を共有するとき、ライブラリのテキスト部分は、 そのライブラリがどちらのプログラムでも同じアドレスにリンクされるか どうかによらず、共有することができる。 環境によっては、位置独立コードは、異なるアドレッシングモードを 必要とするだけでなく、そのアドレッシングモードを機能させるために 特別なコードを必要とすることがある。

マクロ FINALIZE_PIC は、一旦関数がアセンブリコードに コンパイルされれば、これらの特別なコードを生成するフックとして 働く。だが、コンパイルされる前はそうでない。 (コンパイルされる前に行なわれないのは、インライン関数をコンパイルする場合、 インライン関数を使っている関数で PIC のプロローグが複数取り込まれて しまうことになり、その後にアセンブリ言語にコンパイルされるからである。)

LEGITIMATE_PIC_OPERAND_P (x)

一個の C の式。この式は、x が、ターゲット機種で位置独立コードを 生成するときに正しい即値オペランドであるなら、ゼロでない値となる。 xCONSTANT_P を満たしていると仮定して良いので、 そのための検査は必要ない。また flag_pic が真であることも 仮定して良いので、こちらも検査する必要はない。 (SYMBOL_REF を含む)全ての定数が、位置独立コードを生成するときに 即値オペランドになりうるのであれば、このマクロを定義する必要はない。


This document was generated using texi2html 1.78.