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

17.2 実行時ターゲット指定

以下に実行時のターゲット指定を示す。

CPP_PREDEFINES

C の文字列定数を定義する。 この文字列には、マシンとシステムを特定する事前定義マクロを定義する、 ‘-D’ オプションを指定する。 ここで指定されたマクロは、‘-ansi’ オプションが指定されない限り 定義済となる。

さらに、これらのマクロ名の前後に ‘__’ を付加した名前のマクロの セットが並行して定義済となる。 これら ‘__’ 付きのマクロは ANSI 標準により許されており、 ‘-ansi’ オプションの指定の有無に関わらず、定義済となる。

例えば、Sun では、次のような指定をすることができる。

 
"-Dmc68000 -Dsun -Dunix"

この結果、マクロ __mc68000____sun____unix__ が 無条件に定義され、mc68000sununix が ‘-ansi’ オプションが指定されないときに定義される。

extern int target_flags;

この宣言は必須である。

TARGET_…

この一連のマクロを定義することで、コンパイラのコマンド行引数により、 ターゲット機種の選択的機能の使用を有効/無効にすることができる。 例えば、一個のマシン記述で 68000 と 68020 の両方に対応できるので、 コマンド行引数で、コンパイラに 68020 固有の命令を使うかどうかを 指定できる。コマンド行引数が動作する仕組みは、target_flags 中の ビットが立っているかどうかをテストする TARGET_68020 というマクロに よるものである。

このようなオプション毎に TARGET_featurename というマクロを 定義する。この定義では、target_flags 中のビットが立っているか どうかをテストしなければならない。例えば、以下のように書く。

 
#define TARGET_68020 (target_flags & 1)

こういったマクロが使われるのは、一つには、命令パターン中の条件式である。 TARGET_68020 が、68000 のマシン記述ファイル、‘m68k.md’ に どれぐらい現れるか注意してみると良いだろう。

TARGET_SWITCHES

このマクロでは、target_flags 中のビットをセットしたりクリアする コマンド行オプションの名前を定義する。 この定義は、各コマンド行オプション毎にグループ分けした初期化子とする。

各グループは、オプション名を定義する文字列定数、target_flags に セットすべきビット群を含む数値、それに --help オプションを 指定したときに表示される説明となる第二の文字列から成る。 数値が負の数の場合、その数値で指定されるビットを立てる代わりに、 クリアする。説明文字列が、存在はするが空の場合、そのオプションについての ヘルプ情報は何も表示されないが、隠しオプションには数えない。 実際のオプション名は、ここで指定した名前に ‘-m’ を付加したものになる。

ヌル文字列を持つグループが一個存在する必要がある。 このグループで指定する数値が、target_flags のデフォルト値になる。 どのターゲットオプションも最初はこのデフォルト値に対して作用する。

以下の例では ‘-m68000’ と ‘-m68020’ をお互いに 反対の意味を持つように定義し、後者をデフォルトとしている。

 
#define TARGET_SWITCHES \
  { { "68020", 1, "" },      \
    { "68000", -1, "Compile for the 68000" }, \
    { "", 1, "" }}
TARGET_OPTIONS

TARGET_SWITCHES と同様のマクロだが、値を持つコマンド行オプションの 名前を定義する。 この定義は、コマンド行オプション毎のグループ分けした初期化子とする。

各グループはそれぞれ、フィールドとして、オプション名の固定部分を 定義する文字列定数、ある変数のアドレス、それに説明文字列を持つ。 この変数は、char * 型であり、指定したオプションの固定部分が マッチした場合、変動部分がこの変数に設定される。 実際のオプション名は、指定した名前に ‘-m’ を付加したものになる。

以下の例では、‘-mshort-data-number’ というオプションを定義 している。指定されたオプションが ‘-mshort-data-512’ なら、 変数 m88k_short_data には、文字列 "512" がセットされる。

 
extern char *m88k_short_data;
#define TARGET_OPTIONS \
 { { "short-data-", &m88k_short_data, "Specify the size of the short data section" } }
TARGET_VERSION

このマクロは C の文として定義する。この文は、選択された特定のマシン記述 を説明する文字列を stderr に出力するようにする。 どのマシン記述でも必ず TARGET_VERSION を定義して欲しい。 以下に定義例を示す。

 
#ifdef MOTOROLA
#define TARGET_VERSION \
  fprintf (stderr, " (68k, Motorola syntax)");
#else
#define TARGET_VERSION \
  fprintf (stderr, " (68k, MIT syntax)");
#endif
OVERRIDE_OPTIONS

場合によっては、コマンド行オプションのある組合せが、ある特定の ターゲット機種では意味をなさないことがある。 そういう場合を考慮に入れるにはマクロ OVERRIDE_OPTIONS を 定義する。このマクロは、定義されていると、全てのコマンド行オプションが パーズされた直後に一回だけ実行される。

このマクロを使って、‘-O’ オプションを指定したときに 色々な特別の最適化を実行するようにしてはいけない。 そのためには、OPTIMIZATION_OPTIONS というマクロがある。

OPTIMIZATION_OPTIONS (level, size)

このマクロは、定義されていれば、最適化レベルが決まった直後で、コマンド行 オプションの残りがパースされる前に一回だけ実行される。 このマクロに設定されている値は、他のコマンド行オプションのデフォルト値 として使われる。

level は指定された最適化レベルであり、‘-O2’ が指定されれば 2 であり、‘-O’ が指定されれば 1、どちらも指定されなければ 0 である。

size は、‘-Os’ が指定されていればゼロでない値であり、 指定されていなければゼロである。

このマクロを使って機種固有ではないオプションを変えるべきではない。 機種固有でないオプションは、全てのサポートされている機種で同じ 最適化レベルによって統一的に選択されるべきである。 このマクロは、機種固有の最適化を有効にするのに使うこと。

このマクロの中で、write_symbols を調べてはいけない。 デバッグ用オプションは、生成コードを変えるとは想定されていない。

CAN_DEBUG_WITHOUT_FP

フレームポインタ無しでもデバッグできるようにするなら、このマクロを定義する。 このマクロが定義されていると GNU CC は、‘-O’ が指定されていれば 必ず ‘-fomit-frame-pointer’ オプションを有効にする。


This document was generated using texi2html 1.78.