Coins Java - DWARF2 encoding

例外処理で使用されるエンコーディング形式

[Coins Java - 例外処理]

既存のエンコーディング形式

例外処理で使用するデータのいくつかは、ユーザがエンコーディング形式を指定してその形式で使用するものがある。以下のような形式を組み合わせて使用する。

encoding 備考
absptr 0x00 void *型
omit 0xff デフォルト値を使用、または無効
uleb128 0x01 符号なし可変長整数
udata2 0x02 符号なし16bit整数
udata4 0x03 符号なし32bit整数
udata8 0x04 符号なし64bit整数
sleb128 0x09 符号付き可変長整数
sdata2 0x0A 符号付き16bit整数
sdata4 0x0B 符号付き32bit整数
sdata8 0x0C 符号付き64bit整数
signed 0x08 符号付きフラグ
pcrel 0x10 PC相対フラグ
textrel 0x20 .textセグメント相対フラグ
datarel 0x30 .dataセグメント相対フラグ
funcrel 0x40 関数相対フラグ
aligned 0x50 ワード境界整列フラグ
indirect 0x80 間接フラグ

可変長整数

例外処理で使用されるデータ形式の中には、uleb128とsleb128という可変長整数を表す形式が存在する。前者は符号なしで後者は符号付きである。

基本的には以下のような構造をしている。

この構造は、1バイトを1bitのフラグと7bitのデータ部に分割し、フラグの値が1の場合は次のバイトも読みにいき、フラグの値が0になったらそこまでのデータ部を連結して数値とする。

例えば、n+1バイトのuleb128形式のデータ bytes[0:n] があったとすると、そのバイト列が表現する値は以下のように計算できる。

uleb128は正の整数しか表現できないが、sleb128は負の整数も表現できる。基本的には先ほど示した数式と形式が似ているが、bytes[n]の6bit目が1であるとき、この値は負の値になる。その際の計算式は以下のようになる。

また、sleb128でもbytes[n]の6bit目が0であるときは、uleb128と同じ式で計算できる。

Copyright (C) 2002-2006 s.arakawa