おしながき

ELFファイルフォーマット

  • .eh_frameセクションの構造と読み方

DWARFファイルフォーマット

NCURSESライブラリ

  • NCURSES Programing HOWTO ワタクシ的ほんやく
    1. Tools and Widget Libraries
    2. Just For Fun !!!
    3. References
  • その他、自分メモ
  • NCURSES雑多な自分メモ01


最近の更新 (Recent Changes)

2019-09-24
2013-10-10
2013-10-03
2013-10-01
2013-09-29
目次に戻る:DWARFファイルフォーマット

TAG詳細(その03) C++例外/テンプレート関数編 ※thrown_type、template_type_parameter、try_block、catch_block

ということで、C++ほか、オブジェクト指向言語の一部で採用されている、「例外」「テンプレート関数」のおはなしでごんす。

※2013/09/08 try/catchの情報を追記

throw (ブン投げ時の型)

  • メソッドで投げ得る1つ、もしくは複数の型を明確に宣言してる場合、それらそれぞれの型は「DW_TAG_thrown_type」のDIEで表現されますです。
  • そして、このTAGのDIEは、このTAGで定義された型の例外をブン投げるメソッドの子DIEとして表現されるです。
  • ブン投げ得る全ての型のDIEは、そのメソッドの全ての引数パラメタのDIEの後で、かつメソッドのローカル変数やその他メソッド内での語彙ブロックを示すDIEの前、の位置に埋め込まれるです。
  • このTAGは、DW_AT_typeなAttributeを持っていて、こいつの値は例外でブン投げる型への参照っす。

try/catch

  • try句のデバッグ情報は、「DW_TAG_try_block」で表現されますです。
  • catch句のデバッグ情報は、「DW_TAG_catch_block」で表現されますです。
  • try/catchの2つのTAGは、「DW_AT_low_pc & DW_AT_high_pc」のコンビか、「DW_AT_ranges」のAttributeを持っていて、try/catchにかかわるマシン命令コードの場所を示すです。
    • 今までと同様に、前者であればマシン命令空間は連続、後者なら非連続
  • catch句のTAGには、最低1つ子DIE君がいて、こいつは「catch句で受け取る例外型」を示すもんです。
    • この子DIEは、「DW_TAG_formal_parameter」か「DW_TAG_unspecified_parameters」のどっちかで、このTAG自体の表現方法は、通常のパラメタと同じです。(後の章にきっと書きますこのTAGは)
  • try句のTAGに続く子DIEは、tryした結果のcatch句の情報です。

テンプレート関数

  • テンプレート関数は、「DW_TAG_subprogram」なTAGで、つまりメソッドなどと同じように表現されます。
  • 但し、「3つ例外」があるです。ので、この副作用のために、このTAG内に同じAttributeを複数含んでいたり、テンプレート関数が取り得る型を子DIEとして持っていたりすることがあるようです。
    • (例外1) (テンプレート関数の引数である)変数化された型の定義は、「DW_TAG_template_type_parameter」のDIEとして表現されます。(つまりDW_TAG_subprogramの子DIEにこのTAGが来ることがある)
      • このTAGは、DW_AT_nameなAttributeを持っていて、この値はNULL終端の「ソース上に表記された型変数名」になる。
      • このTAGは、またDW_AT_typeなAttributeも持っていて、「置き換えられた後の実際の型」への参照を値として持ってるです。
      • テンプレート関数のテンプレート「型変数」のDIEは、テンプレート関数が取り得る「普通の変数」の宣言よりも前に書かれます。
    • (例外2) コンパイラが、テンプレート関数をDWARFに保持するために特別なCompilation Unitを生成してしまい、さらにあるCUがそのテンプレート関数の保持のために作ったCU上でのテンプレート関数名と異なる名前を持っている場合、あるCUを表現するためのDIE上での、テンプレート関数名の属性(DW_AT_name)が持つ値は、「空白」かAttribute自体削除されている。
      • 直訳は、こう読めますが、これが何を意味するのか「不明」(というか、理解できていない。。。)
    • (例外3) テンプレート関数やその子DIEをいくつかを表現するsubprogramなTAGが宣言と同格の属性を含む場合、それらの属性は(コンパイラによってテンプレート関数のために自動的に生成されたソースを除いた)テンプレート定義のソースを参照する
      • これもスーパー直訳(=中学生レベル)でしかなく、実際ソースでどーすんの的な意味がわからんです。。。


んで、つまりのところ、見る限りテンプレート関数は、こげな様に思えています。

  • 基本的には、全部型名を展開した状態の「関数」としてDWARF上表現される。(「型変数」を取る「テンプレート関数」そのものとしての表現はされない)
    • このため、例えばintとdoubleで2パターンの展開をやってのけた場合は、2つの関数としてDWARF上定義される。
    • すなわち、DW_AT_typeがintの関数と、DW_AT_typeがdoubleの、同名の関数が2つあるようなイメージ
  • テンプレート関数から展開された「関数」の子DIEには「DW_TAG_template_type_parameter」のTAGが付加され、そして、テンプレート型として何の型をソース上指令したのかが分かるようになっている。
    • 事実上、このTAGの有無で、そいつがテンプレート関数からの展開生まれの関数か、ふつーの関数かの判断ができる。

に見えます。が、実際はC++対応時に、要調査みたいです。


目次に戻る:DWARFファイルフォーマット