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的缩写表。然而,编译单元的AbbrOffset字段对应于debug_abbrev_offset字段仍然需要指定。如果未来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节,但我们可以在未来轻松扩展它。

未完成的任务#

* 允许用户以高级别描述 DIE。 在我的原始提案中,我们计划使yaml2obj支持以高级别描述 DIE。然而,yaml2obj当时不支持发出多个缩写表,我花了一些时间使其能够发出多个缩写表并链接编译单元。我不会离开社区,我会在未来改进它。

我在 Phabricator 上的用户名是@Higuoxing。如果您在编写 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] 修复后跟注释的映射值。

D84640 [llvm-readelf] 修复在 '--hex-dump' 中发出不正确的空格数量。

D82621 [DWARFYAML][debug_info] 教会 yaml2obj 发出正确的 DWARF64 单元头。

D82139 [DWARFYAML][debug_info] 修复数组索引越界错误。

D80862 [ObjectYAML][test] 解决 D80203 中的注释。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。