Bugpoint 重设计¶
作者:Diego Treviño (diegotf@google.com)
日期:2019-06-05
状态:草稿
简介¶
随着 bugpoint 的使用日益增多,多年的使用过程中也发现了一些需要改进的地方:使用起来令人困惑、速度慢、并非总是产生高质量的测试用例等等。本文档提出了一种新的方法,其重点更窄:IR 测试用例的最小化。
提议的新设计¶
狭窄的焦点:测试用例缩减¶
主要焦点将是一种代码缩减策略,以获得更小的测试用例,同时这些用例仍然具有与原始用例相同的属性。这将通过经典的 delta debugging 以及添加一些 IR 特定的缩减(例如,替换全局变量、删除未使用的指令等)来完成,类似于现有的方法,但具有更深入的最小化。
诚然,如果社区对这个提议有不同意见,旧代码仍然可以保留在工具中,但需要注意的是,文档和设计仍然要朝着 delta 缩减的方向发展。
命令行选项¶
我们建议将 bugpoint 大量的选项减少到只有两个:一个“有趣性”测试和该测试的参数,类似于其他 delta 缩减工具,如 CReduce、Delta 和 Lithium;该工具应该感觉不那么杂乱,并且在如何操作它方面也应该没有不确定性。
用于缩减代码的“有趣性”测试通过名称给出:--test=<test_name>
如果未给出 --test
选项,程序将退出;此选项类似于 bugpoint 当前的 -compile-custom
选项,该选项允许用户运行自定义脚本。
“有趣性”测试将被定义为一个脚本,当 IR 达到用户定义的行为(例如,在 clang 上编译失败)时返回 0,否则返回非零值。这让用户可以自由地决定对工具而言什么是“有趣”的,从而简化了缩减测试用例的过程。
如果测试接受任何参数(不包括输入 ll/bc 文件),则通过以下标志给出:--test_args=<test_arguments>
如果未指定,则按给定的方式运行测试。值得注意的是,输入文件将作为参数传递给测试,类似于 -compile-custom
当前的运行方式。
实现¶
该工具的行为将类似于 CReduce 的功能,因为它将有一系列尝试最小化给定测试用例的 passes。我们应该能够模块化该工具的行为,并使其更易于维护和扩展。
此重设计的第一个版本将尝试:
丢弃不影响“有趣性”测试的函数、指令和元数据
从函数中删除未使用的参数
消除未访问的条件路径
将变量重命名为更常规的名称(例如 “a”、“b”、“c” 等)
一旦这些 passes 被实现,更具意义的缩减(例如类型缩减)将被添加到工具中,以进一步缩减 IR。
历史 bugpoint 问题的背景¶
根本原因分析¶
目前,bugpoint 需要很长时间才能在给定的 IR 文件中找到问题的根源,这主要是因为它尝试通过运行各种策略来分类 bug 来调试输入,这些策略反过来又在输入上运行多个优化器和编译 passes,从而占用大量时间。此外,当 IR 崩溃时,它会尝试通过执行一些次优的 passes(例如,大量无法访问的块)来缩减它,有时甚至完全无法最小化。
“古怪”的界面¶
Bugpoint 当前的界面让用户感到不知所措和困惑,仅仅帮助屏幕本身最终就令人困惑,而不是提供指导。而且,不仅有大量的功能和选项,而且其中一些功能的工作方式也出乎意料,大多数时候用户最终会使用自定义脚本。为了使该工具在一般情况下更有用且更易于维护,修剪和简化界面将是值得考虑的。