higuoxing

higuoxing

github
twitter

私のLLVMとの旅(GSoC'20フェーズ2)

第 2 のコーディング期間では、.debug_str_offsets.debug_rnglists、および.debug_loclistsセクションを実装しました。以下の構文を使用して、これらの 3 つのセクションを手作りすることができます。

セクション構文
debug_str_offsets
debug_str_offsets:
- Format: DWARF32 ## オプション
Length: 0x1234 ## オプション
Version: 5 ## オプション
Padding: 0x00 ## オプション
Offsets: [ 0x01, 0x02, 0x03 ]
debug_rnglists
debug_rnglists:
- Format: DWARF32 ## オプション
Length: 0x1234 ## オプション
Version: 5 ## オプション
AddressSize: 0x08 ## オプション
SegmentSelectorSize: 0x00 ## オプション
OffsetEntryCount: 2 ## オプション
Offsets: [0x01, 0x02] ## オプション
Lists:
- Entries:
- Operator: DW_RLE_blah
Values: [ 0x01, 0x02 ]
debug_loclists

注意:.debug_loclists セクションは実装されていますが、まだリリースされていません。
debug_loclists:
- Format: DWARF32 ## オプション
Length: 0x1234 ## オプション
Version: 5 ## オプション
AddressSize: 8 ## オプション
SegmentSelectorSize: 0 ## オプション
OffsetEntryCount: 1 ## オプション
Offsets: [1] ## オプション
Lists:
- Entries:
- Operator: DW_LLE_blah
Values: [ 0x1234, 0x4321 ]
DescriptorsLength: 0x1234 ## オプション
Descriptors:
- Operator: DW_OP_blah
Values: [ 0x1234 ]

また、yaml2objにコンパイルユニットの長さを推測させるようにしました。これにより、.debug_infoセクションを手作りする際に長さフィールドを気にする必要がなくなりました。

セクション構文
debug_info
debug_info:
- Format: DWARF32 ## オプション
Length: 0x1234 ## オプション
Version: 4
AbbrOffset: 0x00
AddrSize: 0x08 ## オプション
Entries:
- AbbrCode: 1
Values:
- Value: 0x1234
- Value: 0x4321

おそらく気づいたかもしれませんが、AbbrOffsetフィールドを手動で計算する必要があり、.debug_infoセクションを手作りするのが非常に困難です。次のコーディング期間では、この問題に取り組み、yaml2objがいくつかの DWARF セクションを相互リンクできるようにする予定です。時間が許せば、obj2yamlにも DWARF サポートを追加したいと考えています。

改善が必要な領域#

第 2 のコーディング期間では、大きな変更をいくつかの小さなパッチに分割することが得意ではありませんでした。これはレビュワーに不便をもたらします。将来的にはこれを避けるようにします。James が指摘したように、他の人ともっとコミュニケーションを取るべきです。これらの DWARF セクションを実装する際には、人々の要件を学び、自分自身で行うのではなく、他の人の意見を尋ねるべきでした。私はそれが .debug_loclists セクションで作業するまで気づきませんでした。Pavel Labath からいくつかの良いアドバイスとコメントをいただきましたが、それまでは考えも及びませんでした!

承認されたパッチ#

D84496 [DWARFYAML] Replace 'Format', 'Version', etc with 'FormParams'. NFC.

D84383 [DWARFYAML] Pull out common helper functions for rnglist and loclist tables. NFC.

D84008 [DWARFYAML] Refactor emitDebugInfo() to make the length be inferred.

D84239 [DWARFYAML] Refactor range list table to hold more data structure.

D83624 [DWARFYAML] Implement the .debug_rnglists section.

D83853 [DWARFYAML] Implement the .debug_str_offsets section.

D83749 [DWARFYAML] Add support for emitting value forms of strx, addrx, etc.

D83452 [DWARFYAML] Use override instead of virtual for better safety.

D83220 [DWARFYAML][unittest] Refactor parseDWARFYAML().

進行中のパッチ#

D84386 [DWARFYAML] Add support for emitting custom operands for range list entry.

D84234 [DWARFYAML] Implement the .debug_loclists section.

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