higuoxing

higuoxing

github
twitter

我與LLVM的旅程(GSoC'20最終評估)

我的 GSoC 終於結束,這是我在過去三個月的工作報告。我的項目是為 yaml2obj 添加 DWARF 支持,特別是 yaml2elf。原始提案在 這裡

實施狀態#

在我的導師 James 和其他社區成員的幫助下,我能夠完成原始提案中的大多數里程碑。現在,這個工具的可用性有了很大的改善。以下是一些突出的功能。

* DWARF 區段的 InitialLength 欄位被替換為 FormatLength 起初,我們必須硬編碼 InitialLength 欄位來指示工具發出適當的 DWARF64 或 DWARF32 區段,例如:

## 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 ## 參考第二個縮寫表。
  - ...
    AbbrevTableID: 0 ## 參考第一個縮寫表。

* 支持更多的 DWARF 區段。 yaml2obj 新增支持 debug_rnglistsdebug_loclistsdebug_addrdebug_str_offsets 區段。請查看 D83624D84234D81541D83853 獲取更多信息!

* DWARF 支持已添加到 elf2yaml 並在 macho2yaml 中改進。 起初,macho2yaml 的輸出很雜亂。它將 DWARF 區段輸出兩次,一次在 Sections: 條目中,一次在 DWARF: 條目中,例如:

## debug_str 區段的內容被輸出兩次!
Sections:
  - sectname: __debug_str
    ...
    content: 6D61696E00 ## "main\0"
DWARF:
  debug_str:
    - main

D85506 之後,如果 DWARF 解析器無法將 DWARF 區段解析到 DWARF: 條目中,obj2yaml 將把它們作為原始內容區段輸出,否則,它們將在 DWARF: 條目中作為結構化的 DWARF 區段呈現。此外,D85094elf2yaml 添加了 DWARF 支持。雖然它僅支持輸出 debug_aranges 區段,但我們未來可以輕鬆擴展它。

未完成的任務#

* 允許用戶以高級別描述 DIEs。 在我的原始提案中,我們計劃讓 yaml2obj 支持以高級別描述 DIEs。然而,當時 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 區段。

yaml2obj 引入新的 DWARF 區段:

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] 讓 dumpPubSection 返回 DWARFYAML::PubSection

D81063 [DWARFYAML][debug_aranges] 用 Format 和 Length 替換 InitialLength。

D81051 [ObjectYAML][ELF] 讓 DWARF 區段的字節序從 FileHeader 推斷。

D86590 [DWARFYAML] 使 unit_length 和 header_length 欄位可選。

D86537 [DWARFYAML] 使 'Attributes' 欄位可選。

D83116 [DWARFYAML] 添加支持引用不同的縮寫表。

D86194 [DWARFYAML] 添加支持發出多個縮寫表。

D86192 [obj2yaml] 重構 .debug_pub* 區段的轉儲器。

D85880 [DWARFYAML] 用 Format 和 Length 替換 InitialLength。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] 使用 override 而不是 virtual 以提高安全性。

D83220 [DWARFYAML][unittest] 重構 parseDWARFYAML ()。

D82435 [DWARFYAML][debug_gnu_*] 添加缺失的上下文 IsGNUStyle。NFC。

D82933 [DWARFYAML][debug_abbrev] 為終止縮寫發出 0 字節。

D82622 [DWARFYAML][debug_info] 用 'Format' 和 'Length' 替換 'InitialLength'。

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 () 返回錯誤。

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] 修正後跟註釋的映射 <none> 值。

D84640 [llvm-readelf] 修正 '--hex-dump' 中發出不正確的空格數。

D82621 [DWARFYAML][debug_info] 教授 yaml2obj 發出正確的 DWARF64 單元標頭。

D82139 [DWARFYAML][debug_info] 修正數組索引超出範圍的錯誤。

D80862 [ObjectYAML][test] 解決 D80203 中的註釋。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。