Skip to content
微信扫码关注公众号

JEP 233: Generate Run-Time Compiler Tests Automatically | 自动生成运行时编译器测试

摘要

开发一个工具,通过自动生成测试用例来测试运行时编译器。

目标

  • 生成的测试应与 jtreg 兼容。
  • 工具在最终结果的语言(Java 源代码、Java 字节码)、语言结构的使用、控制流和表达式复杂性等方面应具有可配置性。
  • 测试应以随机但可复现的方式生成。

动机

随着我们添加新的平台、利用新的 CPU 指令、引入新的优化以及对运行时编译器进行其他增强,通过直接而有针对性的测试来有效测试编译器变得越来越不可行。

描述

该工具将随机生成语法上和语义上正确的 Java 源代码或字节码,必要时进行编译,分别在解释模式(-Xint)和编译模式(-Xcomp)下运行,并验证结果。

该工具将自动工作,不需要人工干预。生成的测试将在合理的时间内尽可能覆盖多种组合。

Java 源代码编译器 javac 并不使用所有的 Java 字节码,因此仅生成 Java 源代码将导致部分字节码未被覆盖。仅为所有类型的测试生成字节码将是一个更加复杂的任务,因此我们将采用混合方法,既生成 Java 源代码,又生成字节码。

在嵌入式平台上,在测试执行期间编译源代码会带来问题,因为可能没有完整的 JDK 可用,所以该工具将提供一种预编译源代码测试的方法。

生成的测试用例将包括复杂的表达式和控制流图,并将使用内置函数、浮点运算、try-catch-finally 结构等。将会有一种调整工具配置的方法。

该工具将随机生成测试,但为了可复现性,它将报告其随机化种子并接受这样的种子,以便重新播放完全相同的生成测试序列。

该工具的源代码将放置在 hotspot/test/testlibrary/jit-tester 目录中。可以通过工具的 makefile 提供的目标生成测试。测试生成的结果是一个完整的 jtreg 测试套件,可以通过同一个 makefile 或直接通过 jtreg 运行。工具的 makefiles 将不会集成到 HotSpot/JDK 构建基础设施中。

考虑到测试生成过程需要大量时间,生成和运行这些测试不应该是集成前的一部分。然而,定期运行预先生成的测试以进行可靠性测试,并生成新的测试以获得更好的代码覆盖率是有意义的。发现错误的生成测试应作为常规回归测试集成到适当的测试套件中,并按照其他回归测试的方式运行。

可选方案

将现有测试在编译模式下运行可以作为该工具的一个可行替代方案。这种方法有几个缺点:

  • 它不能保证涵盖所有的语言结构和不同优化的组合。
  • 测试失败并不总是意味着运行时编译器存在缺陷,需要额外的工程师时间进行调查/复现。
  • 由于一些测试可能是特定于运行时编译器的测试,它们可能会强制执行运行时编译本身和/或需要特定的运行时编译器状态。所以显式的编译模式可能会改变测试的行为,并导致误报结果。
  • 为测试失败创建回归测试相对更加困难。

由于这些缺点,这种方法无法完全替代所提出的工具。