クラス内でのメンバ関数は、「DW_TAG_subprogram」なTAGのDIEとして表現され、このDIEは、クラス自体のDIEの「子DIE」となります。
そして、(クラスのメンバではない、通常の)関数やサブルーチンと同じルールで表現され、持っているAttributeも同じとのことです。
が、やっぱりちょぴっと、Attributeには違いとか特徴あるみたいなので、以下表です。
No. | Attribute名 | せつめいじゃ |
1 | DW_AT_accessibility | アクセス記述子の内容。 このAttribute、もし存在しなかったら。。。 * クラスの場合 → ”private”が宣言されている * 構造体、unionの場合 → ”public”が宣言されている 前提になります。 ※が、構造体、unionにメンバ関数があることはないのです?というギモンあり。 |
2 | DW_AT_virtuality | メンバ関数が”virtual”指定されているならば、このAttributeを持っていて、それを示すです。 |
3 | DW_AT_explicit | メンバ関数が明確に宣言されたものである場合、このAttributeを持っていて、それを示すです。 |
4 | DW_AT_vtable_elem_location | (No.2で、virtual指定されているとされたものであった場合) クラスが持つvirtual関数テーブルにある該当する関数のアドレスを指す「Location description」をもってます |
5 | DW_AT_object_pointer | (メンバ関数(の引数)が固定したメモリ空間上に存在するもの(オブジェクト)でなければ) このAttributeをもっていて、このメンバ関数の引数のDIEへの参照になります。 そして、参照される引数は、C++のthis、Obj-Cのselfなど、クラスオブジェクト次第で変動するようなモノになるみたいです。 ※備考: このAttributeの参照先の引数のDIEは、DW_AT_artificialを持っていて、true になっているです。 なお、メンバ関数(の引数)が固定したメモリ空間上に存在する場合、このAttributeは持っていません。 また、メンバ関数のが「常に不安定」と宣言されているために静的でない場合は、メンバ関数の引数も「常に不安定」な型のものとして表現されます。 ★特に、下2行はちょー直訳です。実際の言語の何に対応するのか、わかっていません。。。 |
また、メンバ関数の本体(メンバ関数の中身)が、そのメンバ関数の所属するクラス定義の外部で”クラス名::メンバ関数名”の名前を用いてなされている場合、以下の注意があるです。
なお、DW_AT_specificationを持っているメンバ関数本体側のDIEには、クラス宣言DIEの子DIEであるメンバ関数のDIEを見れば分かるAttributeは、省かれています。(ムダなので)
特に、「メンバ関数名」「戻り値型」は通常、(クラス宣言DIE側を見れば分かるので)もっていません。
C++のクラステンプレートは、「DW_TAG_class_type」「DW_TAG_structure_type」「DW_TAG_union_type」など、通常のクラス/構造体/unionと同じTAGで表現されます。
が、以下4つ「例外」があり、それゆえ(テンプレートとして)使われ得る型や変数分、同じAttributeや、子DIEとして同じ型が含まれてしまうことがあるのです。[[BR]
ということで、以下例外4箇条
[PageInfo]
LastUpdate: 2013-09-23 15:11:31, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members