基本型、とは、「プログラミング言語自体が内蔵している型」を指します。つまり、intやdoubleなど、コーディングする時、自分で定義しなくてもいい型、という意味です。
原文の定義では「他の型との関係で定義されないデータ型」となっていますが、これも正しいですね。(つまり、intはshortから定義されているわけではない、ということで)
この基本型は「DW_TAG_base_type」なTAGでその情報が示されます。このTAGは、以下表に示す、いろんな?Atrributeを持つ可能性ありですので、これを示すです。
No. | Attribute名 | せつめー |
1 | DW_AT_name | このAttributeを持つTAGが所属するCompilation Unit(オブジェクトファイル)の プログラミング言語上に記載されている基本型の名称(NULL文字おわり) |
2 | DW_AT_encoding | 基本型内での、データの表現方法や意味を示すための定数です。 これは、そーと複雑なので、 「Attribute詳細(その01) エンコード形式、パック10進、固定小数点編」を参照です |
3 | DW_AT_endianity | 基本型のエンディアンを示す定数。 「TAG詳細(その06) 変数/関数の引数/定数編」のNo.12の通りでごわす |
4 | DW_AT_byte_size | この基本型(で宣言されたオブジェクト)の表現に必要なバイト数 |
5 | DW_AT_bit_size | 対象とする基本型が、(No.4の)DW_AT_byte_sizeで指定されたバイト数の全てを使わない(一部のビットだけなど)場合、このAttribute君が登場します。(以下No.6とセットで) この場合、このAttributeは「実際に使うビット数」を示すです ※例えば、DW_AT_byte_sizeが1Byte=8bitのデータで、上から3ビット目〜6ビット目の4ビットしか使わない基本型の場合、このDW_AT_bit_size=4です。 |
6 | DW_AT_bit_offset | 対象とする基本型が、(No.4の)DW_AT_byte_sizeで指定されたバイト数の全てを使わない(一部のビットだけなど)場合、このAttribute君が登場します。(上記No.5とセットで) この場合、このAttributeは「実際に使うビットが始まる、最上位ビットからのオフセットビット数」を示すです ※例えば、DW_AT_byte_sizeが1Byte=8bitのデータで、上から3ビット目〜6ビット目の4ビットしか使わない基本型の場合、このDW_AT_bit_offset=3です。 |
7 | DW_AT_start_scope | この基本型が有効になるのが、DW_TAG_base_typeのスコープとなるTAG(一般に、親TAG)のDW_AT_low_pcからでなく、途中から始まる場合、有効となる最初のコードアドレスです。 これは「TAG詳細(その06) 変数/関数の引数/定数編」を参照です。 |
「不特定型」とは、(この訳語がいいかどうかは別にして)、簡単に言うと、C言語での”void”です。
voidは、C言語では「(どの型としてアクセスするかを特定しない)メモリアドレスの型("void *")」として使ったり、typedefした任意の構造体型を受けたりするときに使うと思いますが、こうった用途を指すです。
この「不特定型」は、「DW_TAG_unspecified_type」として定義されます。
Attributeとしては、「DW_AT_name」を持っていることがあり、もっている場合は、ソース上のこの型の名称で、NULL終り文字列の形式となります。
「基本型」や「ユーザによる定義型」などの「型」は、言語毎の方法で、「修飾」されるケースがあるです。(例えば、Cならint型でも、ポインタ*が付いたり、constになったりと)
こーいうのは「型修飾子」という扱いで、DWARF上でも基本型やユーザによる定義型を、修飾するTAGで表現するです。
まず、以下表に、修飾子を並べてみます。
No. | TAG名 | 意味 |
1 | DW_TAG_const_type | C/C++での”const”修飾子です。 |
2 | DW_TAG_packed_type | (Pascal/Ada) ”packed”修飾型です。 |
3 | DW_TAG_pointer_type | 修飾対象とする型を「ポインタ型」にするって意味。 難しいこと抜きにして、C言語の”*”と理解しておーけーです |
4 | DW_TAG_reference_type | C++の「参照渡し」じゃ。 ※メソッドの引数に&付けるやつです |
5 | DW_TAG_restrict_type | Cの”restrict”修飾子です。 |
6 | DW_TAG_shared_type | UPCの”shared”修飾型 ※UPCってなんじゃ? |
7 | DW_TAG_volatile_type | C/C++での”volatile”修飾子です |
こうやって表を見ると、この「型修飾子」、CやC++だけなら、ずばり「修飾子」と理解しておーけーです。(但し、ポインタ宣言も、参照渡し宣言も、修飾子となっていることがミソ)
んで、この修飾子、以下のAttributeを持ってることが一般的です。
No. | Attribute名 | せつめい |
1 | DW_AT_name | (もしソース上で修飾子型に名前を与えられているならば) ソース上での修飾子型の名前をNULLおわり文字列としてもってます |
2 | DW_AT_type | 修飾対象とする基本型、ユーザ定義型、その他の型修飾子のDIEへの参照です。 これ、以下も参照です |
3 | DW_AT_address_class | この属性は、ポインタやアドレス参照を示す修飾子型の場合、持ってます。 んで、この属性の値は、与えられたポインタやアドレス参照型をもつオブジェクトがどうやってそれを参照すべきかを示すもんです。 ★これ、いまいち不明。あとで要調査!★ |
4 | DW_AT_count | この修飾子型が、UPCのshared修飾型の場合、もっているAttribute。 んで、これは型のブロックサイズを示す定数を値としてもっていますです。 もし(UPCのshared修飾型なのに)このAttributeがない場合は、ブロックサイズ=無限大、の扱いです |
んで、最後に。
C言語では、いうまでもなく、「型のポインタ指定」やら「const」やらを同時に指定(宣言)すること、がふつーです。(というか、const/volatile/restrictは同時指定でなくてはならない。単体では使えない。。。)
例えば、以下のよーなケースですね。
const unsigned char *p;この例では、修飾子型に該当するのが「const」「ポインタ"*"」の2つあり、さらに基本型「unsigned char」と3つが乱立しています。
以下、原文からの拝借ですが、2つ例を書きますです。
例1
const unsigned char * volatile p;この例では、以下の様にDW_AT_typeを通じて、リンクされます。
DW_TAG_variable(p) : まず変数が来ます。そして、これを修飾子、基本型で定義していく形になります。 → DW_TAG_volatile_type → DW_TAG_pointer_type → DW_TAG_const_type : constはunsigned charよりも左にあるのですが、修飾子なので先にきます。 → DW_TAG_base_type(unsigned char) : 基本型unsigned charは、Cソース上ではconstよりも右ですが、基本型なので一番最後です
volatile unsigned char * const restrict p;こいつは、以下の様になります。
DW_TAG_variable(p) → DW_TAG_restrict_type → DW_TAG_const_type → DW_TAG_pointer_type → DW_TAG_volatile_type → DW_TAG_base_type(unsigned char)
C言語やC++の”typedef”ですが、これは「DW_TAG_typedef」で表現され、以下のAttributeを持ってるです。
No. | Attriute名 | せつめい |
1 | DW_AT_name | NULL文字おわりの、ソース上でのtypedefのおなまえ |
2 | DW_AT_type | typedef内で定義した基本型やstruct/unionなどへのリンク なお、typdefが定義されていない型の宣言であった場合、このDW_AT_typeは含まないことになってます |
3 | DW_AT_start_scope | このtypedefが有効になるのが、DW_TAG_base_typeのスコープとなるTAG(一般に、親TAG)のDW_AT_low_pcからでなく、途中から始まる場合、有効となる最初のコードアドレスです。 これは「TAG詳細(その06) 変数/関数の引数/定数編」を参照です。 |
[PageInfo]
LastUpdate: 2013-09-16 21:49:28, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members