higuoxing

higuoxing

github
twitter

LLVMとの私の旅 (GSoC'20最終評価)

私の GSoC が終了し、これは過去 3 ヶ月間の私の作業の報告です。私のプロジェクトは、yaml2objに DWARF サポートを追加すること、特にyaml2elfに焦点を当てています。元の提案はこちらです。

実装状況#

メンターの James や他のコミュニティメンバーの助けを借りて、私は元の提案のほとんどのマイルストーンを達成することができました。現在、ツールの使いやすさは大幅に改善されました。いくつかの優れた機能は以下に示されています。

* DWARF セクションのInitialLengthフィールドはFormatLengthに置き換えられました。 最初は、ツールに適切な DWARF64 または DWARF32 セクションを出力させるためにInitialLengthフィールドをハードコーディングする必要がありました。例えば、

## DWARF32セクション。
InitialLength:
  TotalLength32: 0x1234

## DWARF64セクション。
InitialLength:
  TotalLength32: 0xffffffff
  TotalLength64: 0x1234

現在、yaml2objはデフォルトで DWARF32 セクションを出力し、Lengthフィールドは省略可能で、yaml2objが自動的に計算します(この問題に対処するパッチ: D82622, D85880, D81063, D84008, D86590, D84911)。

## DWARF32セクション。
## FormatとLengthフィールドは省略可能です。
## それらを気にする必要はありません。

## DWARF64セクション。
Format: DWARF64 ## Formatフィールドだけを指定すればよいです。

* yaml2objは複数の略語テーブルを出力することをサポートします。 yaml2objは以前は単一の略語テーブルのみを出力しており、複数のコンパイルユニットが同じ略語テーブルを共有する必要がありましたが、D86194D83116の後、yaml2objは複数の略語テーブルを出力できるようになり、コンパイルユニットはそれらのいずれかにリンクできます。略語テーブルにはオプションのIDフィールドを追加し、コンパイルユニットにはオプションのAbbrevTableIDフィールドを追加しました。コンパイルユニットはAbbrevTableIDを使用して同じIDを持つ略語テーブルにリンクできます。ただし、debug_abbrev_offsetフィールドに対応するコンパイルユニットのAbbrOffsetフィールドはまだ指定する必要があります。D86614が将来的に受け入れられれば、これを計算して指定する必要はなくなります!

debug_abbrev:
  - ID: 0
    Table:
      ...
  - ID: 1
    Table:
      ...
debug_info:
  - ...
    AbbrevTableID: 1 ## 2番目の略語テーブルを参照します。
  - ...
    AbbrevTableID: 0 ## 1番目の略語テーブルを参照します。

* より多くの DWARF セクションがサポートされました。 debug_rnglistsdebug_loclistsdebug_addr、およびdebug_str_offsetsセクションがyaml2objで新たにサポートされました。詳細については、D83624D84234D81541、およびD83853を確認してください!

* DWARF サポートがelf2yamlに追加され、macho2yamlで改善されました。 最初、macho2yamlの出力はノイズが多かったです。DWARF セクションを 2 回ダンプし、1 回はSections:エントリに、もう 1 回はDWARF:エントリに出力しました。例えば、

## debug_strセクションの内容が2回ダンプされています!
Sections:
  - sectname: __debug_str
    ...
    content: 6D61696E00 ## "main\0"
DWARF:
  debug_str:
    - main

D85506の後、DWARF パーサーが DWARF セクションをDWARF:エントリに解析できない場合、obj2yamlはそれらを生のコンテンツセクションとしてダンプし、そうでない場合はDWARF:エントリに構造化された DWARF セクションとして表示します。さらに、D85094elf2yamlに DWARF サポートを追加しました。これはdebug_arangesセクションのダンプのみをサポートしていますが、将来的に簡単に拡張できます。

未完了のタスク#

* ユーザーが高レベルで DIE を記述できるようにします。 私の元の提案では、yaml2objが高レベルで DIE を記述できるようにすることを計画していました。しかし、その時点ではyaml2objは複数の略語テーブルを出力することをサポートしておらず、私はそれを有効にするためにしばらくの時間を費やしました。私はコミュニティを離れるつもりはなく、将来的に改善します。

私の Phabricator でのユーザー名は@Higuoxingです。YAML で DWARF テストケースを作成する際に問題が発生したりバグに遭遇した場合は、気軽に私に連絡してください。喜んでお手伝いします!

謝辞#

このプロジェクトの間、私を指導してくださった @jhenderson(James Henderson)に心から感謝の意を表します。また、私のパッチをレビューし、質問に辛抱強く答え、提案にコメントを残してくださった @grimar(George Rimar)、@MaskRay(Fangrui Song)、@labath(Pavel Labath)、@dblaikie(David Blaikie)、@aprantl(Adrian Prantl)、@probinson(Paul Robinson)にも感謝します!

提案された変更(受け入れられたものと進行中のもののみをリストアップ)#

進行中:

D86614 [DWARFYAML] debug_abbrev_offset フィールドをオプションにします。

D86545 [DWARFYAML] 新しい略語テーブルの略語コードは 1 から始まるべきです(デフォルトで)。

D85289 [DWARFYAML][debug_info] 一部のマッピングキーの名前を変更します。NFC。

既存の DWARF サポートをyaml2elfに移植:

D80203 [ObjectYAML][DWARF] ELFYAML に DWARF エントリを追加します。

D80972 [ObjectYAML][DWARF] ELFYAML で.debug_aranges セクションを出力することをサポートします。

D81217 [ObjectYAML][DWARF] ELFYAML で.debug_ranges セクションを出力することをサポートします。

D81450 [ObjectYAML][ELF] .debug_line セクションを出力することをサポートします。

D81820 [ObjectYAML][ELF] .debug_abbrev セクションを出力することをサポートします。

D82073 [ObjectYAML][ELF] .debug_info セクションを出力することをサポートします。

D82347 [ObjectYAML][ELF] .debug_pubtypes セクションを出力することをサポートします。

D82367 [ObjectYAML][ELF] .debug_gnu_pubnames/pubtypes セクションを出力することをサポートします。

D82296 [ObjectYAML][ELF] .debug_pubnames セクションを出力することをサポートします。

DWARF セクションをyaml2objに新たに導入:

D81541 [ObjectYAML][DWARF] .debug_addr セクションを実装します。

D83624 [DWARFYAML] .debug_rnglists セクションを実装します。

D83853 [DWARFYAML] .debug_str_offsets セクションを実装します。

D84234 [DWARFYAML] .debug_loclists セクションを実装します。

obj2yaml に DWARF サポートを追加:

D85094 [obj2yaml] .debug_aranges セクションをダンプすることをサポートします。

リファクタリング作業(エラーハンドリングの改善、YAML フィールドのオプション化、DWARF64 サポートの追加など):

D80535 [ObjectYAML][MachO] MachOEmitter にエラーハンドリングを追加します。

D80861 [ObjectYAML][DWARF] dumpPubSectionDWARFYAML::PubSectionを返すようにします。

D81063 [DWARFYAML][debug_aranges] InitialLength を Format と Length に置き換えます。

D81051 [ObjectYAML][ELF] DWARF セクションのエンディアンネスを FileHeader から推測できるようにします。

D86590 [DWARFYAML] unit_length と header_length フィールドをオプションにします。

D86537 [DWARFYAML] 'Attributes' フィールドをオプションにします。

D83116 [DWARFYAML] 異なる略語テーブルを参照するサポートを追加します。

D86194 [DWARFYAML] 複数の略語テーブルを出力することをサポートします。

D86192 [obj2yaml] .debug_pub * セクションダンパーをリファクタリングします。

D85880 [DWARFYAML] InitialLength を Format と Length に置き換えます。NFC。

D85805 [DWARFYAML] コンパイルユニットのアドレスサイズをオプションにします。

D85821 [MachOYAML] セクションデータ出力関数を簡素化します。NFC。

D85707 [DWARFYAML] 行テーブルのアドレスサイズをオブジェクトファイルから推測できるようにします。

D85506 [macho2yaml] DWARF セクションダンパーをリファクタリングします。

D85496 [macho2yaml] 未使用の関数を削除します。NFC。

D85397 [DWARFYAML][debug_info] 'Values' フィールドをオプションにします。

D85405 [obj2yaml] 空の.debug_aranges セクションをダンプするテストを行います。

D84496 [DWARFYAML] 'Format'、'Version' などを 'FormParams' に置き換えます。NFC。

D85296 [DWARFYAML][debug_info] DWARFYAML::Unit から dwarf::FormParams を引き出します。

D85179 [DebugInfo][unittest] YAML を使用して.debug_loclists セクションを生成します。

D85006 [DWARFYAML] OffsetEntryCount が 0 のときはオフセットを省略するべきです。

D84921 [DWARFYAML] debug_aranges エントリをオプションにします。

D84952 [DWARFYAML] getDWARFEmitterByName () ヘルパー関数を追加します。NFC。

D85003 [DWARFYAML] emitDebug [GNU] Pub [names/types] 関数を追加します。NFC。

D84911 [DWARFYAML] アドレス範囲テーブルの 'Length' フィールドをオプションにします。

D84907 [DWARFYAML] 'AddressSize'、'SegmentSelectorSize' フィールドをオプションにします。

D84624 [DWARFYAML] checkListEntryOperands () を checkOperandCount () に名前変更します。NFC。

D84618 [DWARFYAML] カスタム範囲リストコンテンツを出力するサポートを追加します。

D83282 [DWARFYAML] リファクタリング:メンバ関数を DWARFYAMLUtils.cpp に引き出します。

D84383 [DWARFYAML] rnglist および loclist テーブルの共通ヘルパー関数を引き出します。NFC。

D84008 [DWARFYAML] emitDebugInfo () をリファクタリングして長さを推測できるようにします。

D84239 [DWARFYAML] 範囲リストテーブルをリファクタリングしてより多くのデータ構造を保持します。

D83749 [DWARFYAML] strx、addrx などの値形式を出力するサポートを追加します。

D83452 [DWARFYAML] より安全性を高めるために virtual の代わりに override を使用します。

D83220 [DWARFYAML][unittest] parseDWARFYAML () をリファクタリングします。

D82435 [DWARFYAML][debug_gnu_*] 欠落しているコンテキストIsGNUStyleを追加します。NFC。

D82933 [DWARFYAML][debug_abbrev] 終了略語のために 0 バイトを出力します。

D82622 [DWARFYAML][debug_info] 'InitialLength' を 'Format' と 'Length' に置き換えます。

D82630 [ObjectYAML][DWARF] YAMLParser が失敗したときに診断メッセージを収集します。

D82351 [ObjectYAML][DWARF] 未使用のコンテキストを削除します。NFC。

D82275 [DWARFYAML][debug_info] エラーハンドリングのサポートを追加します。

D82173 [DWARFYAML][debug_info] 略語をインデックスするために 'AbbrCode' を使用します。

D81826 [DWARFYAML][debug_abbrev] 略語コードをオプションにします。

D81915 [ObjectYAML][DWARF] writeVariableSizedInteger () が Error を返すようにします。

D81709 [ObjectYAML][DWARF] ターゲットアドレスサイズを FileHeader から推測できるようにします。

D81529 [ObjectYAML][test] 空の 'DWARF' エントリをテストするために単一のテストファイルを使用します。

D80722 [ObjectYAML][DWARF] PubSectionをオプションにします。

D81220 [DWARFYAML][debug_ranges] "Offset" フィールドをオプションにします。

D81528 [DWARFYAML] DWARF64 .debug_aranges セクションを出力するサポートを追加します。

D81357 [DWARFYAML][debug_ranges] 無効なオフセットに対するエラーメッセージを出力します。

D81356 [ObjectYAML] DWARFYAML でのエラーハンドリングのサポートを追加します。NFC。

バグ修正

D85717 [DWARFYAML] yaml2obj に正しい行テーブルプログラムを出力させることを教えます。

D85180 [YAMLTraits] コメントの後に続くマッピング値を修正します。

D84640 [llvm-readelf] '--hex-dump' で不正確なスペース数を出力する問題を修正します。

D82621 [DWARFYAML][debug_info] yaml2obj に正しい DWARF64 ユニットヘッダーを出力させることを教えます。

D82139 [DWARFYAML][debug_info] 配列インデックスの範囲外エラーを修正します。

D80862 [ObjectYAML][test] D80203 のコメントに対処します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。