Bugpoint 重构

作者:Diego Treviño ([email protected])

日期:2019-06-05

状态:草稿

简介

随着 bugpoint 使用的增长,多年来的使用中发现了几个需要改进的方面:使用起来令人困惑、速度慢、并不总是产生高质量的测试用例等。本文档提出了一种新的方法,其重点更窄:最小化 IR 测试用例。

拟议的新设计

重点关注:测试用例缩减

主要重点将是一种代码缩减策略,以获得更小的测试用例,这些用例仍然具有与原始用例相同的属性。这将通过经典的 Delta 调试以及添加一些特定于 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 的功能,即它将有一系列尝试最小化给定测试用例的传递。我们应该能够模块化工具的行为,并使其更易于维护和扩展。

此重构的第一版将尝试

  • 丢弃不影响有趣性测试的函数、指令和元数据

  • 从函数中删除未使用的参数

  • 消除未访问的条件路径

  • 将变量重命名为更常规的变量(例如“a”、“b”、“c”等)

一旦实现了这些传递,将向工具中添加更有意义的缩减(例如类型缩减),以进一步缩减 IR。

有关历史 bugpoint 问题的背景

根本原因分析

目前,bugpoint 需要很长时间才能找到给定 IR 文件中的源问题,这主要是由于它尝试通过运行各种策略来对错误进行分类来调试输入,而这些策略又会对输入运行多个优化器和编译传递,从而占用大量时间。此外,当 IR 崩溃时,它会尝试通过执行一些次优传递(例如许多不可到达的块)来缩减它,有时甚至完全无法缩减。

“古怪”界面

Bugpoint 当前的界面会让用户不知所措并感到困惑,仅帮助屏幕本身就会让人感到困惑而不是提供指导。而且,不仅有许多功能和选项,而且其中一些功能以意想不到的方式工作,并且大多数情况下用户最终都会使用自定义脚本。修剪和简化界面值得考虑,以便在一般情况下使该工具更有用且更易于维护。