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

17.16.4 ラベルの出力と生成

ラベルの出力について説明する。

ASM_OUTPUT_LABEL (stream, name)

一個のC の文(セミコロンなし)。標準入出力 ストリーム stream に、name という名前のラベルを出力する。 名前自身を出力するには、assemble_name (stream, name) を 使うこと。この前後で、名前の定義するアセンブラ構文と改行を 追加で出力する。

ASM_DECLARE_FUNCTION_NAME (stream, name, decl)

一個のC の文(セミコロンなし)。標準入出力 ストリーム stream に、定義しようとしている関数名 name を 宣言するのに必要なテキストを出力する。 このマクロはラベル定義を出力する責任がある(おそらく ASM_OUTPUT_LABEL をつかうことになるだろう)。引数 decl は、その関数を表現する FUNCTION_DECL ツリーノードである。

このマクロが定義されていないと、関数名は普通の方法で、あるラベルとして 定義される(ASM_OUTPUT_LABEL が使われる)。

ASM_DECLARE_FUNCTION_SIZE (stream, name, decl)

一個のC の文(セミコロンなし)。標準入出力 ストリーム stream に、定義しようとしている関数のサイズを 宣言するのに必要なテキストを出力する。 引数 name は関数名である。 引数 decl は、その関数を表現する FUNCTION_DECL ツリーノードである。

このマクロが定義されていないと、関数のサイズは定義されない。

ASM_DECLARE_OBJECT_NAME (stream, name, decl)

一個のC の文(セミコロンなし)。標準入出力 ストリーム stream に、定義しようとしている初期化変数の名前 name を宣言するのに必要なテキストを出力する。 このマクロはラベル定義を出力しなければならない(おそらく ASM_OUTPUT_LABEL を使うことになるだろう)。 引数 decl は、その変数を表現する VAR_DECL ツリーノードである。

このマクロが定義されていないと、変数名は普通の方法で、あるラベルとして 定義される(ASM_OUTPUT_LABEL が使われる)。

ASM_FINISH_DECLARE_OBJECT (stream, decl, toplevel, atend)

一個の C の文(セミコロンなし)。この文は、変数名の宣言を終了させる。 これは、コンパイラが一旦その初期化子を完全に処理し、その初期化子で制御される 場合は配列の大きさを決定する機会があった場合に行なわれる。 これは、オブジェクトの大きさについて何か宣言する必要があるシステムで 使われる。

このマクロを定義しないのは、何もしないコードに定義するのと同じである。

ASM_GLOBALIZE_LABEL (stream, name)

一個のC の文(セミコロンなし)。標準入出力 ストリーム stream に、ラベル name をグローバルにするための コマンドを出力する。グローバルにするとは、他のファイルから参照可能に することである。式 assemble_name (stream, name) を 使って、名前自体は出力する。その前後で、その名前をグローバルにする アセンブラ構文を追加し、その後に改行を続ける。

ASM_WEAKEN_LABEL

一個のC の文(セミコロンなし)。標準入出力 ストリーム stream に、ラベル name をウィークにするための コマンドを出力する。ウィークにするとは、他のファイルから参照可能で あるが、それ以外の定義が利用可能でない場合にだけ使われるように することである。式 assemble_name (stream, name) を 使って、名前自体は出力する。その前後で、その名前をウィークにする アセンブラ構文を追加し、その後に改行を続ける。

このマクロを定義しないと、GNU CC はウィークシンボルをサポートしないので、 マクロ SUPPORTS_WEAK を定義してはいけない。

SUPPORTS_WEAK

ターゲットがウィークシンボルをサポートしているなら、真と評価される C の式 である。

このマクロを定義しない場合は ‘defaults.h’ がデフォルトの定義を 提供する。ASM_WEAKEN_LABEL が定義されているとデフォルトの定義は ‘1’ で、定義されていないと ‘0’ である。 ウィークシンボルのサポートを ‘-melf’ のようなコンパイラフラグで 制御したい場合はこのマクロを定義する。

MAKE_DECL_ONE_ONLY

一個の C の文(セミコロン無し)。この文は、decl を、 複数の翻訳単位にある余分なコピーはリンカが捨てさるようなパブリックな シンボルとして生成するように、印を付ける。 オブジェクトファイル形式がこの仕組みをサポートしている場合、 例えば Microsoft Windows の PE/COFF 形式のセクションフラグ ‘COMDAT’ のような場合で、このサポートにより、例えば別のセクションの置くような、 decl に対する変更を必要とする場合は、このマクロを定義する。

SUPPORTS_ONE_ONLY

一個の C の式。ターゲットが「宣言は一つだけ」(one-only)という 考え方をサポートしている場合は、この式を評価すると真になる。

このマクロを定義しない場合は、‘varasm.c’ がデフォルトの定義を 提供する。MAKE_DECL_ONE_ONLY が定義されていると、 デフォルトの定義は ‘1’ になり、定義されていない場合は ‘0’ に なる。「一つだけ」式のシンボルサポートをコンパイラフラグで 制御したい場合や、宣言を「ひとつだけ」として生成するように印をつける には、DECL_ONE_ONLY フラグを設定すれば充分な場合は、 このマクロを定義する。

ASM_OUTPUT_EXTERNAL (stream, decl, name)

一個の C の文(セミコロン無し)。標準入出力ストリーム stream に、 name という名前の外部シンボルで、このコンパイル単位では 参照しているが、定義はされていないものの名前を宣言するために必要な テキストを出力する。decl の値はその宣言のツリーノードである。

何も出力する必要がなければ、このマクロは定義しなくて良い。 GNU アセンブラと大部分の Unix のアセンブラはなにも必要としない。

ASM_OUTPUT_EXTERNAL_LIBCALL (stream, symref)

一個の C の文(セミコロン無し)。stream に、ライブラリ関数名を 外部名として宣言するためのアセンブラ疑似命令を出力する。 このライブラリ関数名は symref で与えられる。symref は、 rtx 型であり、symbol_ref である。

何も出力する必要がなければ、このマクロは定義しなくて良い。 GNU アセンブラと大部分の Unix のアセンブラはなにも必要としない。

ASM_OUTPUT_LABELREF (stream, name)

一個の C の文(セミコロン無し)。標準入出力ストリーム stream に、 name という名前に対する参照をアセンブラの構文で出力する。 このマクロでは、ほとんどの Berkeley Unix システムの場合のように、 対象となるオペレーティングシステムでの習慣であるなら、 名前の前に ‘_’ を付加しなければならない。 このマクロは、assemble_name で使われる。

ASM_OUTPUT_INTERNAL_LABEL (stream, prefix, num)

一個の C の文。この文は、標準入出力ストリーム stream に、 文字列 prefix と番号 num から作られるラベルを出力する。

こうして作られるラベルが、ユーザレベルの関数や変数用に使われるラベルとは 明確に区別できるということが、本当に本質的なことである。 そうなっていないと、ある種のプログラムでは内部ラベルとの名前の衝突が 発生してしまう。

内部ラベルは、オブジェクトファイル中のシンボルテーブルからは除外することが 望ましい。多くのアセンブラには、除外すべきラベルについての名前付の 規則がある。多くのシステムでは、ラベルの先頭に文字 ‘L’ が付いていると 除外対象になる。読者のシステムではどういう規則になっているかを調べ、 それに従うこと。

このマクロの普通の定義は以下の通りである。

 
fprintf (stream, "L%s%d:\n", prefix, num)
ASM_GENERATE_INTERNAL_LABEL (string, prefix, num)

一個の C の文。この文は、文字列 string に、 文字列 prefix と番号 num から作られる名前のラベルを 格納する。

この文字列は、後で assemble_name によって出力されたときに、 同じ prefixnum を与えたときに ASM_OUTPUT_INTERNAL_LABEL が生成するのと同じものを、 生成するようにしなければならない。

この文字列が、‘*’ で始まっていると、assemble_name は 文字列の残りの部分をそのまま出力する。 ASM_GENERATE_INTERNAL_LABEL が ‘*’ をそのように使うと 便利なことが多い。文字列が ‘*’ で始まっていないと、 ASM_OUTPUT_LABELREF がこの文字列の出力を行ない、変更を行なう 可能性がある。(もちろん、ASM_OUTPUT_LABELREF も、 マシン記述の一部であるので、対象となる機種でそれが何をしているかを 知っておきべきだ。)

ASM_FORMAT_PRIVATE_NAME (outvar, name, number)

一個の C の式。この式は、outvar (これは char * 型の 変数)に、文字列 namenumber から作られ、 何か適切な区切り文字を加えた、新たに確保した文字列を代入する。 この文字列用のスペースは、alloca で割り当てること。

この文字列は、ASM_OUTPUT_LABELREF の引数として使われ、 名前が name である、内部的な静的変数用のアセンブララベルを 作り出す。このため、文字列はアセンブラコードとして有効なものに ならなければならない。引数 number は、マクロが実行される度に 異なる。これにより、異なるスコープにある、似たような名前の 内部的な静的変数同士の名前の衝突を防ぐ。

理想的には、この文字列は C の識別子としては有効でないようにして、 ユーザ定義のシンボルとの衝突を防ぐようにすべきである。 多くのアセンブラはアセンブラシンボルの中に、ピリオドやパーセント記号を 入れるのを許している。少なくともそのどちらか一つを、名前と番号の 間に入れれば充分であろう。

ASM_OUTPUT_DEF (stream, name, value)

一個の C の文。標準入出力ストリーム stream に、 シンボル name の値が value になるように定義する(同じであると 見なす)アセンブラコードを出力する。

SET_ASM_OP’ が定義されていれば、ほとんどのシステムで正しい、 デフォルトの定義が提供される。

ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (stream, symbol, high, low)

一個の C の文。標準入出力ストリーム stream に、 シンボル symbol の値が、二つのシンボル highlow の差、 すなわち high - low に等しくなるように定義する(同じであると 見なす)アセンブラコードを出力する。 GNU CC はシンボル highlow を既にアセンブラが知っていることを 保証するので、この差は一つの定数に解決される。

SET_ASM_OP が定義されていると、デフォルトの定義が提供され、 ほとんどのシステムで正しいものになっている。

ASM_OUTPUT_WEAK_ALIAS (stream, name, value)

一個の C の文。標準入出力ストリーム stream に、 ウィークシンボル name の値が、value に等しくなるように 定義する(同じであると見なす)アセンブラコードを出力する。

このマクロはターゲットがウィークエイリアスしかサポートしていないときに 定義すること。可能なら、代わりに ASM_OUTPUT_DEF を定義すること。

OBJC_GEN_METHOD_LABEL (buf, is_inst, class_name, cat_name, sel_name)

このマクロを定義すると、Objectvie C のメソッドのデフォルトのアセンブラでの 名前を上書きする。

デフォルトの名前は、一意的なメソッド番号の後にクラス名が続いたもの (例えば、‘_1_Foo’)になる。カテゴリ中のメソッドについては、 カテゴリ名もアセンブラでの名前に含まれる(例えば、‘_1_Foo_Bar’)。

これらの名前はほとんどのシステムで安全だが、デバッグが困難になる。 メソッドのセレクタが名前に入っていないからである。このため、幾つかの 特定のシステムでは名前を生成する別の方法を定義している。

bufchar * 型の式であり、名前を格納すべきバッファを 指定する。このバッファの長さは、class_namecat_namesel_name を足した長さに、さらに 50 文字文の余裕を見込んだものである。

引数 is_inst は、メソッドがインスタンスメソッドかクラスメソッドかを 指定する。class_name は、クラス名である。cat_name は カテゴリ名である(メソッドがあるカテゴリに入っていないなら NULLである)。 sel_name はセレクタ名である。

アセンブラがクォートした名前を扱えるシステムでは、このマクロを使うことで 読みやすい名前を提供することができる。


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

This document was generated using texi2html 1.78.